当前位置:编程学习 > JAVA >>

分享一个加密算法(100分散分)

最近公司购买一套系统 (JAVA+spring),里面有一个加密算法,这个算法只提供了加密,没有提供解密,代码里有个解密的,可是我研究了好久,始终解密不了,哪位高手能帮我解密一下????
比喻密码是:ABC123,把它加密后按下面方法可以解密成 :169FD48721EA70C7
Encryption encryption = new Encryption("ABC123");
System.out.println(encryption.encryptString("ABC123", true)) ;
输出为:169FD48721EA70C7

也就是说:169FD48721EA70C7解密成多少呢?
Encryption encryption = new Encryption("");
System.out.println(encryption.encryptString("169FD48721EA70C7", true)) ;
输出为: (y(0i ? 应该为ABC123才对。

哪位高手能帮我解密一下????


package fe.encry;
import fe.util.EncrypUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;

public class Encryption
{
  private int intPrivateKey = 0;
  private static final long MaxInt = ()Math.pow(2.0D, 32.0D);

  private int[] intConstKey = { 1556696929, 1266038903, 1265722019, 1265722531, 
    1265658509, 1265282947, 1263528397, 1263599759, 
    1263487033, 1263648241, 1262235517, 1262210177, 
    1261371079, 1261525493, 1261118363, 1260675071, 
    1260706169, 1260299731, 1260230359, 1259026997, 
    1258887283, 1258865891, 1258626371, 1258503781, 
    1258482227, 1258579643, 1258190971, 1258098757, 
    1257611279, 1257724121, 1257273319, 1257361279, 
    1256913187, 1256892151, 1256455111, 1256408429, 
    1060988843, 1028046497, 1059548141, 1059702103, 
    1059282011, 1057910353, 1057261279, 1056410731, 
    1027302959, 1056241757, 1053532217, 1053109769, 
    1052145631, 1052156549, 1052311109, 1052138359, 
    1051307749, 1051455023, 1030905121, 1030546703, 
    1030613851, 1030517641, 1029296581, 1029412469, 
    1028968387, 1028847733, 1028118731, 1028044769 };

  private int[] intUserKey = new int[64];

  private int[] intPosition = new int[64];

  private static int encryptionInfo = 3;

  private static long readTimer = 0L;
  public static final long lngREMAINTIMER = 600000L;
  public static final long abc = Long.parseLong("7776000000");

  public Encryption(String strKey)
  {
    int[] intData = getStringLong(strKey);
    this.intPrivateKey = 0;
    if (intData != null) {
      for (int i = 0; i < intData.length; i++) {
        this.intPrivateKey ^= intData[i];
      }
    }
    intData = getStringLong(String.valueOf(this.intPrivateKey));
    for (int i = 0; i < intData.length; i++) {
      this.intPrivateKey ^= intData[i];
    }
    processKeyGene();
  }

  public Encryption()
  {
  }

  public int[] getStringLong(String strString)
  {
    byte[] byteString = strString.getBytes();
    int intI = 0;
    int intIndex = -1;

    int intByte = 0;
    if (byteString.length == 0) {
      return null;
    }
    int[] intData = new int[(byteString.length - 1) / 4 + 1];
    while (intI < byteString.length) {
      if (intI % 4 == 0) {
        intIndex++; intData[intIndex] = 0;
      }
      intByte = byteString[(intI++)];
      if (intByte < 0) {
        intByte += 256;
      }
      intData[intIndex] = ((intData[intIndex] << 8) + intByte);
    }
    return intData;
  }

  public String getLongString(int[] intData)
  {
    String strData = "";
    if (intData != null) {
      int[] intLocation = { -16777216, 16711680, 65280, 255 };
      int[] intMove = { 24, 16, 8 };
      int intIndex = 0; int intI = 0;
      int intLen = (intData.length - 1) * 4 + 1;
      int tmp = intData[(intData.length - 1)];
      if (tmp < 0)
        intLen += 3;
      else {
        while (tmp > 255) {
          intLen++;
          tmp >>= 8;
        }
      }
      byte[] bytString = new byte[intLen];
      intLen = 0;
      while (intI < intData.length - 1) {
        bytString[(intLen++)] = (byte)((intData[intI] & intLocation[intIndex]) >> intMove[intIndex]);
        intIndex++; if (intIndex > 3) {
          intI++;
          intIndex = 0;
        }
      }
      tmp = intData[(intData.length - 1)];
      for (intI = bytString.length - 1; intI >= intLen; intI--) {
        bytString[intI] = (byte)(tmp & 0xFF);
        tmp >>= 8;
      }
      strData = new String(bytString);
    }
    return strData;
  }

  public int[] getHexLong(String strHex)
  {
    if (strHex.length() == 0) {
      return null;
    }
    int[] intData = new int[(strHex.length() - 1) / 8 + 1];
    String strSubHex = "";
    for (int i = 0; i < strHex.length(); i += 8) {
      if (i + 8 < strHex.length())
        strSubHex = strHex.substring(i, i + 8);
      else {
        strSubHex = strHex.substring(i);
      }
      intData[(i / 8)] = (int)Long.parseLong(strSubHex, 16);
    }
    return intData;
  }

  public String getLongHex(int[] intData)
  {
    String strHex = "";
    String strSubHex = "";
    if (intData != null) {
      for (int i = 0; i < intData.length - 1; i++) {
        strSubHex = Integer.toHexString(intData[i]).toUpperCase();
        for (int j = strSubHex.length(); j < 8; j++) {
          strSubHex = "0" + strSubHex;
        }
        strHex = strHex + strSubHex;
      }
      strSubHex = Integer.toHexString(intData[(intData.length - 1)]).toUpperCase();
      if (strSubHex.length() % 2 != 0) {
        strSubHex = "0" + strSubHex;
      }
      strHex = strHex + strSubHex;
    }
    return strHex;
  }

  private void processKeyGene()
  {
    boolean[] blnInGene = new boolean[64];
    int intG = 0; int intGCount = -1; int intCount = 0;
    int[] intGene = new int[64];
    String strPrivateKey = String.valueOf(this.intPrivateKey);
    for (int i = 0; i < 64; i++) {
      this.intUserKey[i] = this.intConstKey[i];
      blnInGene[i] = false;
      this.intPosition[i] = i;
      intGene[i] = -1;
    }
    for (int i = 0; i < strPrivateKey.length(); i++) {
      if (strPrivateKey.substring(i, i + 1).equals("-"))
        intG = 0;
      else {
        intG = Integer.parseInt(strPrivateKey.substring(i, i + 1));
      }
      if (blnInGene[intG] != 0) {
        continue;
      }
      blnInGene[intG] = true;
      this.intPrivateKey = (this.intUserKey[intG] ^ this.intPrivateKey);
      intGCount++;
      intGene[intGCount] = intG;
    }

    intCount = intGCount;
    for (int i = 0; i <= intCount; i++) {
      if ((intGene[i] > 0) && (intGene[i] < 7)) {
        for (int j = 0; j <= intCount; j++) {
          intG = intGene[i] * 10 + intGene[j];
          if ((intG < 64) && (blnInGene[intG] == 0)) {
            intGCount++;
            intGene[intGCount] = intG;
            this.intPrivateKey = (this.intUserKey[intG] ^ this.intPrivateKey);
          }
        }
      }
    }
    intGCount++;
    for (int i = 0; i < 64; i++) {
      int j = (int)(intGene[(i % intGCount)] * Math.pow(i, 2.0D)) & 0x1F;
      intG = this.intUserKey[i];
      this.intUserKey[i] = this.intUserKey[j];
      this.intUserKey[j] = intG;
      intG = this.intPosition[i];
      this.intPosition[i] = this.intPosition[j];
      this.intPosition[j] = intG;
    }
  }

--------------------编程问答--------------------


  public String encryptString(String strString, boolean blnGetHex)
  {
    if (EncrypUtil.isFingerprint(strString)) {
      return EncrypUtil.getFingerValue(strString);
    }
    if (blnGetHex) {
      return getLongHex(encryptData(getStringLong(strString), true));
    }
    return getLongString(encryptData(getStringLong(strString), true));
  }

  public String encryptString(String strString)
  {
    return getLongString(encryptData(getStringLong(strString), true));
  }

  public String decryptionString(String strString, boolean blnIsHex)
  {
    if (blnIsHex) {
      return getLongString(encryptData(getHexLong(strString), false));
    }
    return getLongString(encryptData(getStringLong(strString), false));
  }

  public String decryptionString(String strString)
  {
    return getLongString(encryptData(getStringLong(strString), false));
  }

  public int[] encryptData(int[] intData, boolean blnEncryption)
  {
    if (intData == null) {
      return null;
    }
    int intLen = intData.length;
    int[] intEncryptData = new int[intLen];
    int[] intModPosition = (int[])null;
    int intMod = intLen & 0x3F;
    if (intMod > 0) {
      intModPosition = new int[intMod];
      int index = -1;
      for (int i = 0; i < 64; i++) {
        if (this.intPosition[i] < intMod) {
          index++; intModPosition[index] = this.intPosition[i];
        }
      }
    }
    if (blnEncryption) {
      for (int i = 0; i < intLen; i++)
        if (intLen - i > 63) {
          for (int j = 0; j < 64; j++) {
            intEncryptData[(i + j)] = (intData[(i + this.intPosition[j])] ^ this.intPrivateKey ^ this.intUserKey[j]);
          }
          i += 63;
        } else {
          for (int j = 0; j < intLen - i; j++) {
            intEncryptData[(i + j)] = (intData[(i + intModPosition[j])] ^ this.intPrivateKey ^ this.intUserKey[j]);
          }
          i = intLen;
        }
    }
    else {
      for (int i = 0; i < intData.length; i++) {
        if (intLen - i > 63) {
          for (int j = 0; j < 64; j++) {
            intEncryptData[(i + this.intPosition[j])] = (intData[(i + j)] ^ this.intPrivateKey ^ this.intUserKey[j]);
          }
          i += 63;
        } else {
          for (int j = 0; j < intLen - i; j++) {
            intEncryptData[(i + intModPosition[j])] = (intData[(i + j)] ^ this.intPrivateKey ^ this.intUserKey[j]);
          }
          i = intLen;
        }
      }
    }
    return intEncryptData;
  }

  public static int getEncryptionMachineInfo()
  {
    return encryptionInfo;
  }

  public byte[] decryptionFile(String strFileName)
  {
    byte[] bytData = (byte[])null;
    File file = new File(strFileName);
    int fleLen = (int)file.length();
    if (fleLen > 8) {
      try {
        FileInputStream in = new FileInputStream(file);
        int srcLength = 0;
        bytData = new byte[4];
        for (int i = 0; i < 2; i++) {
          in.read(bytData);
          for (int j = 3; j >= 0; j--) {
            if (bytData[j] < 0)
              srcLength = (srcLength << 8) + 256 + bytData[j];
            else {
              srcLength = (srcLength << 8) + bytData[j];
            }
          }
        }
        fleLen -= 8;
        bytData = new byte[fleLen];
        in.read(bytData);
        in.close();
        if (fleLen % 4 == 0)
          fleLen /= 4;
        else {
          fleLen = fleLen / 4 + 1;
        }
        int[] intData = new int[fleLen];
        int intIndex = 0;
        for (int i = 0; i < fleLen; i++) {
          intIndex += 4;
          for (int j = 1; j < 5; j++) {
            int index = intIndex - j;
            if (index < bytData.length) {
              if (bytData[index] < 0)
                intData[i] = ((intData[i] << 8) + 256 + bytData[index]);
              else {
                intData[i] = ((intData[i] << 8) + bytData[index]);
              }
            }
          }
        }
        intData = encryptData(intData, false);
        bytData = new byte[srcLength];
        intIndex = 0;
        for (int i = 0; i < fleLen; i++) {
          long lngData = intData[i];
          intIndex += 4;
          for (int j = 4; j > 0; j--) {
            int index = intIndex - j;
            if (index < srcLength) {
              bytData[(intIndex - j)] = (byte)(int)(lngData & 0xFF);
              lngData >>= 8;
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return bytData;
  }

  }

--------------------编程问答-------------------- 是用什么算法加密的好像不清楚,仅凭加密代码去解密的话还是有点难度哦. --------------------编程问答-------------------- 明显里面已经提供了解密函数:decryptionString()


但是你调用错了,应该是:
Encryption encryption = new Encryption("IamPrivateKey"); // 私钥,加解密必须保持一致
System.out.println(encryption.encryptString("ABC123", true)) ;
输出为:xxxxxxxxxxxooooooooooo

也就是说:169FD48721EA70C7解密成多少呢?
Encryption encryption = new Encryption("IamPrivateKey"); // 私钥,加解密必须保持一致
System.out.println(encryption.decryptionString("xxxxxxxxxxxooooooooooo", true)) ;
输出就是原文了:ABC123 --------------------编程问答--------------------
引用 1 楼  的回复:
Java code


  public String encryptString(String strString, boolean blnGetHex)
  {
    if (EncrypUtil.isFingerprint(strString)) {
      return EncrypUtil.getFingerValue(strString);
    }
    i……

1 --------------------编程问答-------------------- --------------------编程问答-------------------- 非常感谢高手的指点!

关键一点是 在加密时,系统把所输入的密码当 私钥 ,找到私钥那么密码就可以知道了,但关键是密码是不知道的!需要破解,也就是说这个密码是永远都是解不开的?

有没有哪位热心的高手帮手能从代码里找到解开的方法? --------------------编程问答--------------------
引用 3 楼  的回复:
明显里面已经提供了解密函数:decryptionString()


但是你调用错了,应该是:
Encryption encryption = new Encryption("IamPrivateKey"); // 私钥,加解密必须保持一致
System.out.println(encryption.encryptString("ABC123", true)) ;
输出为:xxxxx……
饿 --------------------编程问答-------------------- 3楼真是高手啊!~学习学习 --------------------编程问答--------------------
引用 6 楼  的回复:
关键一点是 在加密时,系统把所输入的密码当 私钥 ,找到私钥那么密码就可以知道了,但关键是密码是不知道的!需要破解,也就是说这个密码是永远都是解不开的?


可能性较高。因为对密码进行加密,一般来说都希望走不可逆模式,如果可逆这个加密就很危险了。

当然,由于你给出的这个是对称密钥加密算法,也就意味着算法本身并非不可逆,只是求解其密钥难度很高而已。所以破解的可能性还是有的,但是要找专业人士,数学领域的密码学专业人士。

CSDN的人,基本上都是偏应用研究方向,而非理论研究方向,所以你很难在这里找到有效帮助。 --------------------编程问答-------------------- 额,司也是的卖软件产品,需要对Licsense进行加密解密,我用的是经典算法DES算法 --------------------编程问答-------------------- 高手求来解答,围观中~!~!~! --------------------编程问答-------------------- 真的是散分吗? --------------------编程问答-------------------- 这样解密不了啊另寻蹊径吧源代码 都有了为什么没有密码呢? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 12 楼  的回复:
真的是散分吗?


可能是散分吧 --------------------编程问答-------------------- 可以把三楼说的试一下,如果提供了加密算法,不提供解密也很正常,很多加密就是为了不可逆的 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 12 楼  的回复:
真的是散分吗?


+1 --------------------编程问答-------------------- 你不会调用吗? --------------------编程问答-------------------- (⊙o⊙)?O(∩_∩)O --------------------编程问答-------------------- 谢谢分享 --------------------编程问答-------------------- 很好,学习了!其实很讨厌加密! --------------------编程问答-------------------- --------------------编程问答-------------------- 一直觉得加解密很高深的菜鸟游走... --------------------编程问答-------------------- 菜鸟路过!!!!好给力哦!!! --------------------编程问答-------------------- fe.util.EncrypUtil 这个类没有啊 --------------------编程问答--------------------
引用 6 楼  的回复:
非常感谢高手的指点!

关键一点是 在加密时,系统把所输入的密码当 私钥 ,找到私钥那么密码就可以知道了,但关键是密码是不知道的!需要破解,也就是说这个密码是永远都是解不开的?

有没有哪位热心的高手帮手能从代码里找到解开的方法?

为什么要把密码当私钥呢?如果你需要解密,那个私钥应该是另外一个常量,而且你加减密的地方都可以获得的 --------------------编程问答-------------------- 密码学中有个经典的理论:

除非你是密码学家,否则不要自以为聪明地发明密码算法! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢分享 --------------------编程问答-------------------- 调用 decryptionString(String , boolean )
--------------------编程问答-------------------- 看了一下,明显是调用decryptionString(String , boolean)方法撒,你调用的那个方法是传入的密钥 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- img=/upload/20131228/2.gif][/img] --------------------编程问答--------------------  
--------------------编程问答-------------------- 都看不懂~~ --------------------编程问答-------------------- 听说散分?? --------------------编程问答-------------------- 高手啊!~学习学习 --------------------编程问答-------------------- 很好 收藏了 --------------------编程问答-------------------- 拿分走人,都是用封装好的,没有去研究算法实质 --------------------编程问答-------------------- 对称加密  我感觉最好用AES就好了,JDK也对AES加密支持的很好 --------------------编程问答--------------------
引用 30 楼  的回复:
密码学中有个经典的理论:

除非你是密码学家,否则不要自以为聪明地发明密码算法!


加密分可逆和不可逆,建議采用不可逆加密,比如:MD5,這樣安全性高。 --------------------编程问答-------------------- 很明显这是个对称算法嘛。DES

加密 解密都是用一个私钥,调的方法不同而已 --------------------编程问答--------------------
引用 47 楼  的回复:
引用 30 楼  的回复:

密码学中有个经典的理论:

除非你是密码学家,否则不要自以为聪明地发明密码算法!


加密分可逆和不可逆,建議采用不可逆加密,比如:MD5,這樣安全性高。


MD4、MD5,SHA系列等都是哈希算法,不是真正意义上的加密算法(因为不能解密),虽然在密码学中也频繁用到。哈希算法确实是不可逆的,但是会产生碰撞。
另,密码学里加密算法设计有个要求:就是一个好的加解密算法是基于密钥的保密,而不是加密算法的保密。也就是说加密算法都是公开了的,如果是某个程序库提供的国际标准加密算法,建议非密码学或数学专业还是不要浪费时间通过算法去解密密文。
DES已经不安全了。 --------------------编程问答-------------------- 晕死 没搞清这是个怎么一回事
反正下面一段是能执行

Encryption encryption = new Encryption("123");
System.out.println(encryption.encryptString("123",true)) ;
System.out.println(encryption.decryptionString("19D25634",true)) ;
console:
19D25634
123
--------------------编程问答-------------------- 这样了
Encryption encryption = new Encryption("567");
System.out.println(encryption.encryptString("abc123",true)) ;
Encryption encryption1 = new Encryption("567");
System.out.println(encryption1.decryptionString("6D25F78F",true)) ; --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 菜鸟表示看不太懂。。。努力学习中! --------------------编程问答-------------------- fe.util.EncrypUtil 这个类没有啊 --------------------编程问答-------------------- --------------------编程问答--------------------

菜鸟表示看不太懂。。。努力学习中!
--------------------编程问答-------------------- 膜拜  菜鸟表示看不太懂。。。努力学习中! --------------------编程问答-------------------- 加密的时候如果用到的参数都不知道的话,要破解起来是很困难的,这样才能更好的保护用户信息。
你要是想破解,进数学吧。 --------------------编程问答-------------------- 又见识了一种加密的。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 15 楼  的回复:
引用 12 楼  的回复:
真的是散分吗?


可能是散分吧

应该是散分吧! --------------------编程问答--------------------
引用 30 楼  的回复:
密码学中有个经典的理论:

除非你是密码学家,否则不要自以为聪明地发明密码算法!

+++++++++++++++++++++++++ --------------------编程问答-------------------- 三楼看头像就应该给他分。 --------------------编程问答-------------------- 菜鸟 表示压力很大 努力学习中 --------------------编程问答-------------------- 我能说我是来领分的吗? --------------------编程问答--------------------
引用 66 楼  的回复:
引用 15 楼  的回复:

引用 12 楼  的回复:
真的是散分吗?


可能是散分吧

应该是散分吧!

一定是散分吗? --------------------编程问答--------------------
引用 66 楼  的回复:
引用 15 楼  的回复:

引用 12 楼  的回复:
真的是散分吗?


可能是散分吧

应该是散分吧!

肯定是散分的 --------------------编程问答-------------------- 整套代码比较复杂 --------------------编程问答-------------------- 还是老老实实的拿分吧,呵呵 --------------------编程问答-------------------- 太高深了,,路过拿分。 --------------------编程问答-------------------- --------------------编程问答--------------------  真有分? 弱弱的问一句:分有啥用。 --------------------编程问答-------------------- public String encryptString(String strString, boolean blnGetHex)
{
if (EncrypUtil.isFingerprint(strString)) {
return EncrypUtil.getFingerValue(strString);
}
if (blnGetHex) {
return getLongHex(encryptData(getStringLong(strString), true));
}
return getLongString(encryptData(getStringLong(strString), true));
}

EncrypUtil.isFingerprint(strString)
EncrypUtil.getFingerValue(strString);
是做什么用的? --------------------编程问答-------------------- --------------------编程问答-------------------- fe.util.EncrypUtil; 你能够提供一下这个方法吗? --------------------编程问答-------------------- 一看都调用错了,加密和解密都用一个方法? --------------------编程问答-------------------- 支持! --------------------编程问答-------------------- --------------------编程问答-------------------- 表示看不懂 --------------------编程问答-------------------- --------------------编程问答-------------------- 这东西真是强大啊 --------------------编程问答-------------------- 额  还有分吗 --------------------编程问答-------------------- 听说是散分……
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,