高分求IDEA的JAVA版源代码! 我们在做一个ERP系统前面子系统用.NET实现现在新做的是JAVA版的用户登录时的密码用IDEA算法加密过现在我们得用JAVA解密从网上找到一个包里面有N多加解密算法我看不懂也不好运行郁闷了5555 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我今天写了一个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("--------------"); } }} zyg158(DD) ( )高手再指点一下原先我们的系统是用C#写的密文是用UNSIGNED CHAR来表示的12345加密以后密文为103141233102138037041083而JAVA中则为BYTE类型有负数的我该怎么把JAVA中的BYTE[]转成C中的UNSIGNED CHAR呢? byte 的值和unsigned char是相等的,只是表示不同而已将byte转换成unsigned char用这个就行:如:byte b = 0xaa;unsigned char c = (b+256)%256;^^^^^^^^^^^^^^^C++中的类型应该是这样的,你先试一试另外方便的话给一个正确的包含密钥的加密结果如:明文是:xxxxxxxx 密钥是:xxxxxxxxxxxxxxxx 密文是:xxxxxxxx以方便我试一下结果是否正确 你的密文是这个样子的吧?103 141 233 102 138 037 041 0830x67 0x8d 0xe9 0x66 0x8a 0x25 0x29 0x53 he he ! you yi si! 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 哭死 这本书讲的内容貌似不怎么基础 JFrame中几个jpanel,几个jpanel间如何控制? 请问 大家有没有 java程序连接 先拨通 ssl vpn , 然后 通过ssl vpn连接 访问数据库 的方法 。。 真心求救!画面一览的明细行双击时,报一下错了! 关于http中的tcp/ip协议中的header的解码 实现键盘监听 简单问题,加散分! 寻找jdbc-odbc驱动程序 linux下访问串口程序应该怎么办?请帮忙,急! 求教jbuilder6 jdbc的配置问题 JNI问题,高分求救!!! 如何从excel里读取已更新过的数据?而不是全部读一遍。
} 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("--------------");
}
}
}
原先我们的系统是用C#写的
密文是用UNSIGNED CHAR来表示的
12345加密以后密文为103141233102138037041083
而JAVA中则为BYTE类型有负数的
我该怎么把JAVA中的BYTE[]转成C中的UNSIGNED CHAR呢?
将byte转换成unsigned char用这个就行:
如:byte b = 0xaa;
unsigned char c = (b+256)%256;
^^^^^^^^^^^^^^^
C++中的类型
应该是这样的,你先试一试另外方便的话给一个正确的包含密钥的加密结果
如:明文是:xxxxxxxx
密钥是:xxxxxxxxxxxxxxxx
密文是:xxxxxxxx
以方便我试一下结果是否正确
103 141 233 102 138 037 041 083
0x67 0x8d 0xe9 0x66 0x8a 0x25 0x29 0x53
谢谢你!
我们这里网络不稳定
前些天都不好上网 密钥 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 哭死