我们在做一个ERP系统
前面子系统用.NET实现
现在新做的是JAVA版的
用户登录时的密码用IDEA算法加密过
现在我们得用JAVA解密
从网上找到一个包
里面有N多加解密算法
我看不懂
也不好运行
郁闷了
5555

解决方案 »

  1.   

    我今天写了一个IDEA算法实现,你可以试一试:public class IDEA { public IDEA() {
    } public byte[] ideaEncrypt(byte[] bytekey, byte[] inputBytes, boolean flag) {
    byte[] encryptCode = new byte[8];
    // 分解子密钥
    int[] key = get_subkey(flag, bytekey);
    // 进行加密操作
    encrypt(key, inputBytes, encryptCode);
    // 返回加密数据
    return encryptCode;
    } private int bytesToInt(byte[] inBytes, int startPos) {
    return ((inBytes[startPos] << 8) & 0xff00)
    + (inBytes[startPos + 1] & 0xff);
    } private void intToBytes(int inputInt, byte[] outBytes, int startPos) {
    outBytes[startPos] = (byte) (inputInt >>> 8);
    outBytes[startPos + 1] = (byte) inputInt;
    } private int x_multiply_y(int x, int y) {
    if (x == 0) {
    x = 0x10001 - y;
    } else if (y == 0) {
    x = 0x10001 - x;
    } else {
    int tmp = x * y;
    y = tmp & 0xffff;
    x = tmp >>> 16;
    x = (y - x) + ((y < x) ? 1 : 0);
    }
    return x & 0xffff;
    } private void encrypt(int[] key, byte[] inbytes, byte[] outbytes) {
    int k = 0;
    int a = bytesToInt(inbytes, 0);
    int b = bytesToInt(inbytes, 2);
    int c = bytesToInt(inbytes, 4);
    int d = bytesToInt(inbytes, 6); for (int i = 0; i < 8; i++) {
    a = x_multiply_y(a, key[k++]);
    b += key[k++];
    b &= 0xffff;
    c += key[k++];
    c &= 0xffff;
    d = x_multiply_y(d, key[k++]); int tmp1 = b;
    int tmp2 = c;
    c ^= a;
    b ^= d;
    c = x_multiply_y(c, key[k++]);
    b += c;
    b &= 0xffff;
    b = x_multiply_y(b, key[k++]);
    c += b;
    c &= 0xffff;
    a ^= b;
    d ^= c;
    b ^= tmp2;
    c ^= tmp1;
    } intToBytes(x_multiply_y(a, key[k++]), outbytes, 0);
    intToBytes(c + key[k++], outbytes, 2);
    intToBytes(b + key[k++], outbytes, 4);
    intToBytes(x_multiply_y(d, key[k]), outbytes, 6);
    } private int[] encrypt_subkey(byte[] byteKey) {
    int[] key = new int[52]; if (byteKey.length < 16) {
    byte[] tmpkey = new byte[16];
    System.arraycopy(byteKey, 0, tmpkey,
    tmpkey.length - byteKey.length, byteKey.length);
    byteKey = tmpkey;
    } for (int i = 0; i < 8; i++) {
    key[i] = bytesToInt(byteKey, i * 2);
    }
    for (int j = 8; j < 52; j++) {
    if ((j & 0x7) < 6) {
    key[j] = (((key[j - 7] & 0x7f) << 9) | (key[j - 6] >> 7)) & 0xffff;
    } else if ((j & 0x7) == 6) {
    key[j] = (((key[j - 7] & 0x7f) << 9) | (key[j - 14] >> 7)) & 0xffff;
    } else {
    key[j] = (((key[j - 15] & 0x7f) << 9) | (key[j - 14] >> 7)) & 0xffff;
    }
    } return key;
    } private int fun_a(int a) {
    if (a < 2) {
    return a;
    }
    int b = 1;
    int c = 0x10001 / a;
    for (int i = 0x10001 % a; i != 1;) {
    int d = a / i;
    a %= i;
    b = (b + (c * d)) & 0xffff;
    if (a == 1) {
    return b;
    }
    d = i / a;
    i %= a;
    c = (c + (b * d)) & 0xffff;
    }
    return (1 - c) & 0xffff;
    } private int fun_b(int b) {
    return (0 - b) & 0xffff;
    } private int[] uncrypt_subkey(int[] key) {
    int dec = 52;
    int asc = 0;
    int[] unkey = new int[52];
    int aa = fun_a(key[asc++]);
    int bb = fun_b(key[asc++]);
    int cc = fun_b(key[asc++]);
    int dd = fun_a(key[asc++]);
    unkey[--dec] = dd;
    unkey[--dec] = cc;
    unkey[--dec] = bb;
    unkey[--dec] = aa; for (int k1 = 1; k1 < 8; k1++) {
    aa = key[asc++];
    bb = key[asc++];
    unkey[--dec] = bb;
    unkey[--dec] = aa;
    aa = fun_a(key[asc++]);
    bb = fun_b(key[asc++]);
    cc = fun_b(key[asc++]);
    dd = fun_a(key[asc++]);
    unkey[--dec] = dd;
    unkey[--dec] = bb;
    unkey[--dec] = cc;
    unkey[--dec] = aa;
    } aa = key[asc++];
    bb = key[asc++];
    unkey[--dec] = bb;
    unkey[--dec] = aa;
    aa = fun_a(key[asc++]);
    bb = fun_b(key[asc++]);
    cc = fun_b(key[asc++]);
    dd = fun_a(key[asc]);
    unkey[--dec] = dd;
    unkey[--dec] = cc;
    unkey[--dec] = bb;
    unkey[--dec] = aa; return unkey;
    } private int[] get_subkey(boolean flag, byte[] bytekey) {
    if (flag) {
    return encrypt_subkey(bytekey);
    } else {
    return uncrypt_subkey(encrypt_subkey(bytekey));
    }
    } public static void main(String[] args) {
    IDEA idea = new IDEA();
    byte[] key = { (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44,
    (byte) 0x55, (byte) 0x66, (byte) 0x77, (byte) 0x88,
    (byte) 0x99, (byte) 0xaa, (byte) 0xbb, (byte) 0xcc,
    (byte) 0xdd, (byte) 0xee, (byte) 0xff, (byte) 0x00 };
    byte[] a = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
    (byte) 0x21, (byte) 0x43, (byte) 0x65, (byte) 0x87 };
    byte[] b = idea.ideaEncrypt(key, a, true);
    byte[] c = idea.ideaEncrypt(key, b, false);
    for (int i = 0; i < 8; i++) {
    System.out.println("--------------");
    System.out.println((int) a[i]);
    System.out.println((int) c[i]);
    System.out.println("--------------");
    }
    }
    }
      

  2.   

    zyg158(DD) ( )高手再指点一下
    原先我们的系统是用C#写的
    密文是用UNSIGNED CHAR来表示的
    12345加密以后密文为103141233102138037041083
    而JAVA中则为BYTE类型有负数的
    我该怎么把JAVA中的BYTE[]转成C中的UNSIGNED CHAR呢?
      

  3.   

    byte 的值和unsigned char是相等的,只是表示不同而已
    将byte转换成unsigned char用这个就行:
    如:byte b = 0xaa;
    unsigned char c = (b+256)%256;
    ^^^^^^^^^^^^^^^
    C++中的类型
    应该是这样的,你先试一试另外方便的话给一个正确的包含密钥的加密结果
    如:明文是:xxxxxxxx
       密钥是:xxxxxxxxxxxxxxxx
       密文是:xxxxxxxx
    以方便我试一下结果是否正确
      

  4.   

    你的密文是这个样子的吧?
    103   141   233   102   138   037   041   083
    0x67  0x8d  0xe9  0x66  0x8a  0x25  0x29  0x53 
      

  5.   

    he he ! you yi si!
      

  6.   

    zyg158(DD) ( ) 信誉:100 
    谢谢你!
    我们这里网络不稳定
    前些天都不好上网             密钥   byte[] key = {49,0,50,49,51,50,52,51,53,52,0,53,0,0,0,0};
                 密码   byte[] a = { 49, 50,51, 52,53,0, 0, 0 };             密文   103141233102138037041083             说实话,C的代码不是我写的,我也不知道密文那该怎么切分             写程序的人现在辞职不干了             55555555555             哭死