原文地址:传送门

本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密,得到原始数据,以起到一定的保密作用.但基于算法本身和密钥保密程度方面的考虑,使用本算法加密后的数据,其保密程度不是很高,故请酌情使用.

声明:本文中的JavaScript版的DES加解密算法来自于互联网,但为了方便于转化成C#版本的代码,本人对其进行了细微调整.

JavaScript代码:

//JS DES加密函数
function jsencrypt(key, message) {
var ciphertext = stringToHex(des(key, message, 1, 0));
return ciphertext;
} //JS DES解密函数
function jsdecrypt(key, message) {
var plaintext = des(key, HexTostring(message), 0, 0);
return plaintext;
} //加解密主函数
function des(key, message, encrypt, mode, iv) {
var spfunction1 = new Array(0x1010400, 0, 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, 0, 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, 0x1000400, 0, 0x10004, 0x10400, 0, 0x1010004);
var spfunction2 = new Array(-0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x8000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, -0x7fff7fe0, 0, -0x8000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, 0, 0x108000, 0x8020, -0x7fef8000, -0x7ff00000, 0x8020, 0, 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, -0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x8000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, 0, -0x7fff8000, 0x8020, -0x8000000, -0x7fefffe0, -0x7fef7fe0, 0x108000);
var spfunction3 = new Array(0x208, 0x8020200, 0, 0x8020008, 0x8000200, 0, 0x20208, 0x8000200, 0x20008, 0x8000008, 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, 0, 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, 0, 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200);
var spfunction4 = new Array(0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, 0, 0x802000, 0x802000, 0x802081, 0x81, 0, 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, 0, 0, 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080);
var spfunction5 = new Array(0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, 0, 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, 0, 0x42000000, 0x2080100, 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, 0x80100, 0x42000000, 0x42080100, 0x2080000, 0, 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, 0, 0x40080000, 0x2080100, 0x40000100);
var spfunction6 = new Array(0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, 0, 0x400010, 0x20004010, 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, 0, 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, 0, 0x20400010, 0x10, 0x4000, 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, 0, 0x20404000, 0x20000000, 0x400010, 0x20004010);
var spfunction7 = new Array(0x200000, 0x4200002, 0x4000802, 0, 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, 0, 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, 0, 0x2, 0x4200802, 0, 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002);
var spfunction8 = new Array(0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, 0, 0, 0x10040040, 0x10000040, 0x10001000, 0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, 0, 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0, 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000);
var keys = des_createKeys(key);
var m = 0, i, j, temp, temp2, right1, right2, left, right, looping;
var cbcleft, cbcleft2, cbcright, cbcright2;
var endloop, loopinc;
var len = message.length;
var chunk = 0;
var iterations = keys.length == 32 ? 3 : 9; if (iterations == 3) {
looping = encrypt ? new Array(0, 32, 2) : new Array(30, -2, -2);
}
else {
looping = encrypt ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2);
} message += "\0\0\0\0\0\0\0\0";
result = "";
tempresult = "";
if (mode == 1) {
cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++);
cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); m = 0;
}
while (m < len) {
if (encrypt) {
left = (message.charCodeAt(m++) << 16) | message.charCodeAt(m++); right = (message.charCodeAt(m++) << 16) | message.charCodeAt(m++);
}
else {
left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
} if (mode == 1) {
if (encrypt) {
left ^= cbcleft; right ^= cbcright;
}
else {
cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right;
}
} temp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
right ^= temp;
left ^= (temp << 4);
temp = ((left >>> 16) ^ right) & 0x0000ffff;
right ^= temp;
left ^= (temp << 16);
temp = ((right >>> 2) ^ left) & 0x33333333;
left ^= temp;
right ^= (temp << 2);
temp = ((right >>> 8) ^ left) & 0x00ff00ff;
left ^= temp; right ^= (temp << 8);
temp = ((left >>> 1) ^ right) & 0x55555555;
right ^= temp;
left ^= (temp << 1);
left = ((left << 1) | (left >>> 31));
right = ((right << 1) | (right >>> 31));
for (j = 0; j < iterations; j += 3) {
endloop = looping[j + 1];
loopinc = looping[j + 2];
for (i = looping[j]; i != endloop; i += loopinc) {
right1 = right ^ keys[i];
right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1];
temp = left;
left = right;
right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f] | spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f] | spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]);
} temp = left;
left = right;
right = temp;
}
left = ((left >>> 1) | (left << 31));
right = ((right >>> 1) | (right << 31));
temp = ((left >>> 1) ^ right) & 0x55555555;
right ^= temp; left ^= (temp << 1);
temp = ((right >>> 8) ^ left) & 0x00ff00ff;
left ^= temp; right ^= (temp << 8);
temp = ((right >>> 2) ^ left) & 0x33333333;
left ^= temp; right ^= (temp << 2);
temp = ((left >>> 16) ^ right) & 0x0000ffff;
right ^= temp; left ^= (temp << 16);
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
right ^= temp; left ^= (temp << 4);
if (mode == 1) {
if (encrypt) {
cbcleft = left;
cbcright = right;
}
else {
left ^= cbcleft2;
right ^= cbcright2;
}
} if (encrypt) {
tempresult += String.fromCharCode((left >>> 24), ((left >>> 16) & 0xff), ((left >>> 8) & 0xff), (left & 0xff), (right >>> 24), ((right >>> 16) & 0xff), ((right >>> 8) & 0xff), (right & 0xff));
}
else {
tempresult += String.fromCharCode(((left >>> 16) & 0xffff), (left & 0xffff), ((right >>> 16) & 0xffff), (right & 0xffff));
} encrypt ? chunk += 16 : chunk += 8; if (chunk == 512) {
result += tempresult;
tempresult = "";
chunk = 0;
}
} return result + tempresult;
} //密钥生成函数
function des_createKeys(key) {
pc2bytes0 = new Array(0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204);
pc2bytes1 = new Array(0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101);
pc2bytes2 = new Array(0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808);
pc2bytes3 = new Array(0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000);
pc2bytes4 = new Array(0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010);
pc2bytes5 = new Array(0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420);
pc2bytes6 = new Array(0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002);
pc2bytes7 = new Array(0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800);
pc2bytes8 = new Array(0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002);
pc2bytes9 = new Array(0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408);
pc2bytes10 = new Array(0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020);
pc2bytes11 = new Array(0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200);
pc2bytes12 = new Array(0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010);
pc2bytes13 = new Array(0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105);
var iterations = key.length >= 24 ? 3 : 1;
var keys = new Array(32 * iterations);
var shifts = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);
var lefttemp, righttemp, m = 0, n = 0, temp; for (var j = 0; j < iterations; j++) {
left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
temp = ((left >>> 4) ^ right) & 0x0f0f0f0f;
right ^= temp;
left ^= (temp << 4);
temp = ((right >>> -16) ^ left) & 0x0000ffff;
left ^= temp;
right ^= (temp << -16);
temp = ((left >>> 2) ^ right) & 0x33333333;
right ^= temp;
left ^= (temp << 2);
temp = ((right >>> -16) ^ left) & 0x0000ffff;
left ^= temp; right ^= (temp << -16);
temp = ((left >>> 1) ^ right) & 0x55555555;
right ^= temp; left ^= (temp << 1);
temp = ((right >>> 8) ^ left) & 0x00ff00ff;
left ^= temp; right ^= (temp << 8);
temp = ((left >>> 1) ^ right) & 0x55555555;
right ^= temp; left ^= (temp << 1);
temp = (left << 8) | ((right >>> 20) & 0x000000f0);
left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0);
right = temp; for (i = 0; i < shifts.length; i++) {
if (shifts[i]) {
left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26);
}
else {
left = (left << 1) | (left >>> 27);
right = (right << 1) | (right >>> 27);
}
left &= -0xf;
right &= -0xf;
lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] | pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] | pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] | pc2bytes6[(left >>> 4) & 0xf];
righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] | pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] | pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] | pc2bytes13[(right >>> 4) & 0xf];
temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff;
keys[n++] = lefttemp ^ temp;
keys[n++] = righttemp ^ (temp << 16);
}
} return keys;
} //将普通的字符串转换成16进制代码的字符串
function stringToHex(s) {
var r = ""; var hexes = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
for (var i = 0; i < (s.length) ; i++) { r += hexes[s.charCodeAt(i) >> 4] + hexes[s.charCodeAt(i) & 0xf]; }
return r;
} //将16进制代码的字符串转换成普通的字符串
function HexTostring(s) {
var r = "";
for (var i = 0; i < s.length; i += 2) { var sxx = parseInt(s.substring(i, i + 2), 16); r += String.fromCharCode(sxx); }
return r;
}

C#代码:

//C# DES加解密主函数
private static string DES(string key, string strMessage, bool isEncrypt, int mode, string strIV)
{
int[] spfunction1 = new int[] { 0x1010400, , 0x10000, 0x1010404, 0x1010004, 0x10404, 0x4, 0x10000, 0x400, 0x1010400, 0x1010404, 0x400, 0x1000404, 0x1010004, 0x1000000, 0x4, 0x404, 0x1000400, 0x1000400, 0x10400, 0x10400, 0x1010000, 0x1010000, 0x1000404, 0x10004, 0x1000004, 0x1000004, 0x10004, , 0x404, 0x10404, 0x1000000, 0x10000, 0x1010404, 0x4, 0x1010000, 0x1010400, 0x1000000, 0x1000000, 0x400, 0x1010004, 0x10000, 0x10400, 0x1000004, 0x400, 0x4, 0x1000404, 0x10404, 0x1010404, 0x10004, 0x1010000, 0x1000404, 0x1000004, 0x404, 0x10404, 0x1010400, 0x404, 0x1000400, 0x1000400, , 0x10004, 0x10400, , 0x1010004 };
int[] spfunction2 = new int[] { -0x7fef7fe0, -0x7fff8000, 0x8000, 0x108020, 0x100000, 0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x8000000, -0x7fff8000, 0x100000, 0x20, -0x7fefffe0, 0x108000, 0x100020, -0x7fff7fe0, , -0x8000000, 0x8000, 0x108020, -0x7ff00000, 0x100020, -0x7fffffe0, , 0x108000, 0x8020, -0x7fef8000, -0x7ff00000, 0x8020, , 0x108020, -0x7fefffe0, 0x100000, -0x7fff7fe0, -0x7ff00000, -0x7fef8000, 0x8000, -0x7ff00000, -0x7fff8000, 0x20, -0x7fef7fe0, 0x108020, 0x20, 0x8000, -0x8000000, 0x8020, -0x7fef8000, 0x100000, -0x7fffffe0, 0x100020, -0x7fff7fe0, -0x7fffffe0, 0x100020, 0x108000, , -0x7fff8000, 0x8020, -0x8000000, -0x7fefffe0, -0x7fef7fe0, 0x108000 };
int[] spfunction3 = new int[] { 0x208, 0x8020200, , 0x8020008, 0x8000200, , 0x20208, 0x8000200, 0x20008, 0x8000008, 0x8000008, 0x20000, 0x8020208, 0x20008, 0x8020000, 0x208, 0x8000000, 0x8, 0x8020200, 0x200, 0x20200, 0x8020000, 0x8020008, 0x20208, 0x8000208, 0x20200, 0x20000, 0x8000208, 0x8, 0x8020208, 0x200, 0x8000000, 0x8020200, 0x8000000, 0x20008, 0x208, 0x20000, 0x8020200, 0x8000200, , 0x200, 0x20008, 0x8020208, 0x8000200, 0x8000008, 0x200, , 0x8020008, 0x8000208, 0x20000, 0x8000000, 0x8020208, 0x8, 0x20208, 0x20200, 0x8000008, 0x8020000, 0x8000208, 0x208, 0x8020000, 0x20208, 0x8, 0x8020008, 0x20200 };
int[] spfunction4 = new int[] { 0x802001, 0x2081, 0x2081, 0x80, 0x802080, 0x800081, 0x800001, 0x2001, , 0x802000, 0x802000, 0x802081, 0x81, , 0x800080, 0x800001, 0x1, 0x2000, 0x800000, 0x802001, 0x80, 0x800000, 0x2001, 0x2080, 0x800081, 0x1, 0x2080, 0x800080, 0x2000, 0x802080, 0x802081, 0x81, 0x800080, 0x800001, 0x802000, 0x802081, 0x81, , , 0x802000, 0x2080, 0x800080, 0x800081, 0x1, 0x802001, 0x2081, 0x2081, 0x80, 0x802081, 0x81, 0x1, 0x2000, 0x800001, 0x2001, 0x802080, 0x800081, 0x2001, 0x2080, 0x800000, 0x802001, 0x80, 0x800000, 0x2000, 0x802080 };
int[] spfunction5 = new int[] { 0x100, 0x2080100, 0x2080000, 0x42000100, 0x80000, 0x100, 0x40000000, 0x2080000, 0x40080100, 0x80000, 0x2000100, 0x40080100, 0x42000100, 0x42080000, 0x80100, 0x40000000, 0x2000000, 0x40080000, 0x40080000, , 0x40000100, 0x42080100, 0x42080100, 0x2000100, 0x42080000, 0x40000100, , 0x42000000, 0x2080100, 0x2000000, 0x42000000, 0x80100, 0x80000, 0x42000100, 0x100, 0x2000000, 0x40000000, 0x2080000, 0x42000100, 0x40080100, 0x2000100, 0x40000000, 0x42080000, 0x2080100, 0x40080100, 0x100, 0x2000000, 0x42080000, 0x42080100, 0x80100, 0x42000000, 0x42080100, 0x2080000, , 0x40080000, 0x42000000, 0x80100, 0x2000100, 0x40000100, 0x80000, , 0x40080000, 0x2080100, 0x40000100 };
int[] spfunction6 = new int[] { 0x20000010, 0x20400000, 0x4000, 0x20404010, 0x20400000, 0x10, 0x20404010, 0x400000, 0x20004000, 0x404010, 0x400000, 0x20000010, 0x400010, 0x20004000, 0x20000000, 0x4010, , 0x400010, 0x20004010, 0x4000, 0x404000, 0x20004010, 0x10, 0x20400010, 0x20400010, , 0x404010, 0x20404000, 0x4010, 0x404000, 0x20404000, 0x20000000, 0x20004000, 0x10, 0x20400010, 0x404000, 0x20404010, 0x400000, 0x4010, 0x20000010, 0x400000, 0x20004000, 0x20000000, 0x4010, 0x20000010, 0x20404010, 0x404000, 0x20400000, 0x404010, 0x20404000, , 0x20400010, 0x10, 0x4000, 0x20400000, 0x404010, 0x4000, 0x400010, 0x20004010, , 0x20404000, 0x20000000, 0x400010, 0x20004010 };
int[] spfunction7 = new int[] { 0x200000, 0x4200002, 0x4000802, , 0x800, 0x4000802, 0x200802, 0x4200800, 0x4200802, 0x200000, , 0x4000002, 0x2, 0x4000000, 0x4200002, 0x802, 0x4000800, 0x200802, 0x200002, 0x4000800, 0x4000002, 0x4200000, 0x4200800, 0x200002, 0x4200000, 0x800, 0x802, 0x4200802, 0x200800, 0x2, 0x4000000, 0x200800, 0x4000000, 0x200800, 0x200000, 0x4000802, 0x4000802, 0x4200002, 0x4200002, 0x2, 0x200002, 0x4000000, 0x4000800, 0x200000, 0x4200800, 0x802, 0x200802, 0x4200800, 0x802, 0x4000002, 0x4200802, 0x4200000, 0x200800, , 0x2, 0x4200802, , 0x200802, 0x4200000, 0x800, 0x4000002, 0x4000800, 0x800, 0x200002 };
int[] spfunction8 = new int[] { 0x10001040, 0x1000, 0x40000, 0x10041040, 0x10000000, 0x10001040, 0x40, 0x10000000, 0x40040, 0x10040000, 0x10041040, 0x41000, 0x10041000, 0x41040, 0x1000, 0x40, 0x10040000, 0x10000040, 0x10001000, 0x1040, 0x41000, 0x40040, 0x10040040, 0x10041000, 0x1040, , , 0x10040040, 0x10000040, 0x10001000, 0x41040, 0x40000, 0x41040, 0x40000, 0x10041000, 0x1000, 0x40, 0x10040040, 0x1000, 0x41040, 0x10001000, 0x40, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x40000, 0x10001040, , 0x10041040, 0x40040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, , 0x10041040, 0x41000, 0x41000, 0x1040, 0x1040, 0x40040, 0x10000000, 0x10041000 }; int[] keys = DES_CreateKey(key); int m = , i, j, temp, right1, right2, left, right;
int[] looping;
int cbcleft = , cbcleft2 = , cbcright = , cbcright2 = ;
int endloop, loopinc;
int len = strMessage.Length;
int chunk = ;
int iterations = (keys.Length == ) ? : ; if (iterations == )
{
looping = isEncrypt ? new int[] { , , } : new int[] { , -, - };
}
else
{
looping = isEncrypt ? new int[] { , , , , , -, , , } : new int[] { , , -, , , , , -, - };
} strMessage += "\0\0\0\0\0\0\0\0"; StringBuilder result = new StringBuilder();
StringBuilder tempresult = new StringBuilder(); if (mode == )
{
int ivLen = strIV.Length;
char[] civ = strIV.ToCharArray();
int[] iv = new int[ivLen + ]; for (i = ; i < ivLen; i++)
{
iv[i] = Convert.ToInt32(civ[i]);
} for (i = ivLen; i < (ivLen + ); ++i)
{
iv[i] = ;
} cbcleft = (iv[m++] << ) | (iv[m++] << ) | (iv[m++] << ) | iv[m++];
cbcright = (iv[m++] << ) | (iv[m++] << ) | (iv[m++] << ) | iv[m++];
m = ;
} while (m < len)
{ int[] message = new int[len + ];
char[] cm = strMessage.ToCharArray();
for (i = ; i < (len + ); ++i)
{
message[i] = Convert.ToInt32(cm[i]);
} if (isEncrypt)
{
left = (message[m++] << ) | message[m++];
right = (message[m++] << ) | message[m++];
}
else
{
left = (message[m++] << ) | (message[m++] << ) | (message[m++] << ) | message[m++];
right = (message[m++] << ) | (message[m++] << ) | (message[m++] << ) | message[m++];
} if (mode == )
{
if (isEncrypt)
{
left ^= cbcleft;
right ^= cbcright;
}
else
{
cbcleft2 = cbcleft;
cbcright2 = cbcright;
cbcleft = left;
cbcright = right;
}
} temp = (MoveByte(left, ) ^ right) & 0x0f0f0f0f;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(left, ) ^ right) & 0x0000ffff;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(right, ) ^ left) & 0x33333333;
left ^= temp;
right ^= (temp << );
temp = (MoveByte(right, ) ^ left) & 0x00ff00ff;
left ^= temp; right ^= (temp << );
temp = (MoveByte(left, ) ^ right) & 0x55555555;
right ^= temp;
left ^= (temp << );
left = ((left << ) | MoveByte(left, ));
right = ((right << ) | MoveByte(right, ));
for (j = ; j < iterations; j += )
{
endloop = looping[j + ];
loopinc = looping[j + ];
for (i = looping[j]; i != endloop; i += loopinc)
{
right1 = right ^ keys[i];
right2 = (MoveByte(right, ) | (right << )) ^ keys[i + ];
temp = left;
left = right;
right = temp ^ (spfunction2[MoveByte(right1, ) & 0x3f] | spfunction4[MoveByte(right1, ) & 0x3f] | spfunction6[MoveByte(right1, ) & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[MoveByte(right2, ) & 0x3f] | spfunction3[MoveByte(right2, ) & 0x3f] | spfunction5[MoveByte(right2, ) & 0x3f] | spfunction7[right2 & 0x3f]);
} temp = left;
left = right;
right = temp;
}
left = (MoveByte(left, ) | (left << ));
right = (MoveByte(right, ) | (right << ));
temp = (MoveByte(left, ) ^ right) & 0x55555555;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(right, ) ^ left) & 0x00ff00ff;
left ^= temp; right ^= (temp << );
temp = (MoveByte(right, ) ^ left) & 0x33333333;
left ^= temp;
right ^= (temp << );
temp = (MoveByte(left, ) ^ right) & 0x0000ffff;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(left, ) ^ right) & 0x0f0f0f0f;
right ^= temp;
left ^= (temp << ); if (mode == )
{
if (isEncrypt)
{
cbcleft = left;
cbcright = right;
}
else
{
left ^= cbcleft2;
right ^= cbcright2;
}
} if (isEncrypt)
{
tempresult.Append(Convert.ToChar((MoveByte(left, ))));
tempresult.Append(Convert.ToChar((MoveByte(left, ) & 0xff)));
tempresult.Append(Convert.ToChar((MoveByte(left, ) & 0xff)));
tempresult.Append(Convert.ToChar((left & 0xff)));
tempresult.Append(Convert.ToChar(MoveByte(right, )));
tempresult.Append(Convert.ToChar((MoveByte(right, ) & 0xff)));
tempresult.Append(Convert.ToChar((MoveByte(right, ) & 0xff)));
tempresult.Append(Convert.ToChar((right & 0xff)));
}
else
{
tempresult.Append(Convert.ToChar(((MoveByte(left, ) & 0xffff))));
tempresult.Append(Convert.ToChar((left & 0xffff)));
tempresult.Append(Convert.ToChar((MoveByte(right, ) & 0xffff)));
tempresult.Append(Convert.ToChar((right & 0xffff)));
} if (isEncrypt)
{
chunk += ;
}
else
{
chunk += ;
} if (chunk == )
{
result.Append(tempresult.ToString());
tempresult.Remove(, tempresult.Length);
chunk = ;
}
} return result.ToString() + tempresult.ToString();
} //密钥生成函数
private static int[] DES_CreateKey(string strKey)
{
int[] pc2bytes0 = new int[] { , 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204 };
int[] pc2bytes1 = new int[] { , 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101 };
int[] pc2bytes2 = new int[] { , 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, , 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808 };
int[] pc2bytes3 = new int[] { , 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000 };
int[] pc2bytes4 = new int[] { , 0x40000, 0x10, 0x40010, , 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010 };
int[] pc2bytes5 = new int[] { , 0x400, 0x20, 0x420, , 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420 };
int[] pc2bytes6 = new int[] { , 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, , 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002 };
int[] pc2bytes7 = new int[] { , 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800 };
int[] pc2bytes8 = new int[] { , 0x40000, , 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002 };
int[] pc2bytes9 = new int[] { , 0x10000000, 0x8, 0x10000008, , 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408 };
int[] pc2bytes10 = new int[] { , 0x20, , 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020 };
int[] pc2bytes11 = new int[] { , 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200 };
int[] pc2bytes12 = new int[] { , 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010 };
int[] pc2bytes13 = new int[] { , 0x4, 0x100, 0x104, , 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105 }; int iterations = strKey.Length >= ? : ; int[] keys = new int[ * iterations];
int[] shifts = new int[] { , , , , , , , , , , , , , , , };
int lefttemp, righttemp;
int m = , n = ;
int left, right, temp; char[] ckey = strKey.ToCharArray(); int strLen = strKey.Length;
int keyLen = strLen + iterations * ;
int[] key = new int[keyLen]; for (int i = ; i < strLen; ++i)
{
key[i] = Convert.ToInt32(ckey[i]);
} for (int i = strLen; i < keyLen; ++i)
{
key[i] = ;
} for (int j = ; j < iterations; j++)
{
left = (key[m++] << ) | (key[m++] << ) | (key[m++] << ) | key[m++];
right = (key[m++] << ) | (key[m++] << ) | (key[m++] << ) | key[m++];
temp = (MoveByte(left, ) ^ right) & 0x0f0f0f0f;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(right, -) ^ left) & 0x0000ffff;
left ^= temp;
right ^= (temp << -);
temp = (MoveByte(left, ) ^ right) & 0x33333333;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(right, -) ^ left) & 0x0000ffff;
left ^= temp;
right ^= (temp << -);
temp = (MoveByte(left, ) ^ right) & 0x55555555;
right ^= temp;
left ^= (temp << );
temp = (MoveByte(right, ) ^ left) & 0x00ff00ff;
left ^= temp;
right ^= (temp << );
temp = (MoveByte(left, ) ^ right) & 0x55555555;
right ^= temp;
left ^= (temp << );
temp = (left << ) | (MoveByte(right, ) & 0x000000f0);
left = (right << ) | ((right << ) & 0xff0000) | (MoveByte(right, ) & 0xff00) | (MoveByte(right, ) & 0xf0);
right = temp; int shiftLen = shifts.Length;
for (int i = ; i < shiftLen; i++)
{
if (shifts[i] == )
{
left = (left << ) | MoveByte(left, );
right = (right << ) | MoveByte(right, );
}
else
{
left = (left << ) | MoveByte(left, );
right = (right << ) | MoveByte(right, );
}
left &= -0xf;
right &= -0xf;
lefttemp = pc2bytes0[MoveByte(left, )] | pc2bytes1[MoveByte(left, ) & 0xf] | pc2bytes2[MoveByte(left, ) & 0xf] | pc2bytes3[MoveByte(left, ) & 0xf] | pc2bytes4[MoveByte(left, ) & 0xf] | pc2bytes5[MoveByte(left, ) & 0xf] | pc2bytes6[MoveByte(left, ) & 0xf];
righttemp = pc2bytes7[MoveByte(right, )] | pc2bytes8[MoveByte(right, ) & 0xf] | pc2bytes9[MoveByte(right, ) & 0xf] | pc2bytes10[MoveByte(right, ) & 0xf] | pc2bytes11[MoveByte(right, ) & 0xf] | pc2bytes12[MoveByte(right, ) & 0xf] | pc2bytes13[MoveByte(right, ) & 0xf];
temp = (MoveByte(righttemp, ) ^ lefttemp) & 0x0000ffff;
keys[n++] = lefttemp ^ temp;
keys[n++] = righttemp ^ (temp << );
}
} return keys;
} //实现无符号右移,相当于javascript中的>>>运算符
private static int MoveByte(int val, int pos)
{
string strBit = string.Empty; //取得二进制字符串
strBit = Convert.ToString(val, ); //转成32位长度的二进制
if (val >= )
{
strBit = Convert.ToString(val, );
int len = strBit.Length;
len = - len; for (int i = ; i < len; ++i)
{
strBit = "" + strBit;
}
} //如果pos小于0,则应移pos + 32位
pos = (pos < ) ? pos + : pos; for (int i = ; i < pos; ++i)
{
strBit = "" + strBit.Substring(, );
} return Convert.ToInt32(strBit, );
} //将普通的字符串转换成16进制的字符串
private static string StringToHex(string s)
{
StringBuilder sb = new StringBuilder();
char[] hexs = new char[] { '', '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F' }; int len = s.Length;
char[] cs = s.ToCharArray();
for (int i = ; i < len; ++i)
{
sb.Append(hexs[cs[i] >> ]);
sb.Append(hexs[cs[i] & 0xf]);
} return sb.ToString();
} //将16进制的字符串转换成普通的字符串
private static string HexToString(string s)
{
StringBuilder sb = new StringBuilder();
int len = s.Length; char c;
for (int i = ; i < len; i += )
{
c = Convert.ToChar(Convert.ToInt16("0x" + s.Substring(i, ), ));
sb.Append(c);
} return sb.ToString();
} //C# DES加密函数
public static string DesEncrypt(string key, string message)
{
return StringToHex(DES(key, message, true, , ""));
} //C# DES解密函数
public static string DesDecrypt(string key, string message)
{
return DES(key, HexToString(message), false, , "");
}

用法如下:

1.在前台页面使用(javascript)jsencrypt(key,message)函数加密数据,并传到服务器,对应的,在服务器端使用(C#)DesDecrypt(key,message)解密得到原始数据.

2.同理:在服务器端使用(C#) DesEncrypt(key,message)加密数据,在页面上使用(javascript)jsdecrypt(key,message)解密,得到数据.

JavaScript与C#互通的DES加解密算法的更多相关文章

  1. JavaScript与C#互通的DES加解密算法的实现(转)

    本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密 ...

  2. DES加解密算法Qt实现

      算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...

  3. 实验一:C语言实现DES加解密算法

    计算程序执行10万次需要的时间: 总共需要175秒 加解密一次的时间小于:0.00175秒 纯计算加解密的时间会更短 去除IO操作后的时间 也就是说加解密一次的时间为0.07毫秒 /*-------- ...

  4. 实现与JS相同的Des加解密算法【转】

    Java代码 import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c ...

  5. DES加解密算法(C语言实现)

    DES加密和解密算法的实现(C语言) 主要是做个记录,害怕以后代码丢了,先放到这里了. DES再不进行介绍了,可以看上一篇的 DES 的python实现 转载请注明出处:https://www.cnb ...

  6. Des加解密算法

    class DesHelper    {        /// <summary>        /// DES加密方法        /// </summary>       ...

  7. C#加解密算法

    先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

  8. javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通

    我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋 ...

  9. Des加解密(Java端和Js端配套)解析

    一.什么是DES加密        des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码( ...

随机推荐

  1. Problem D. Country Meow 2018ICPC南京

    n个点求出最小圆覆盖所有点 退火算法不会,不过这题可以用三分套三分写 x轴y轴z轴各三分 #include <cstdio> #include <cstring> #inclu ...

  2. Jenkins CI Pipeline scripting

    Jenkins pipeline is a suite of Jenkins plugins. Pipelines can be seen as a sequence of stages to per ...

  3. 前端端对端测试:基于PhantomJS的CasperJS

    简介 Casperjs是一个基于PhantomJS和SlimerJS的前端端对端测试框架,当然你也可以使用它完成网络爬虫功能,它的特点的通过简单的脚本模拟浏览器行为, 主要有casper.tester ...

  4. Dubbo 的应用

    ---  用于大规模服务化,通过在消费方获取服务提供方的地址列表,实现负载均衡,减轻服务器压力. 最简单调用图 节点角色说明: l  Provider: 暴露服务的服务提供方. l  Consumer ...

  5. IO流-读取写入缓冲区

    例如FileReader和FileWriter在读取的时候是读一次或者写一次就请求磁盘,这样使用的时间非常的长,效率比较低,因此引入BufferedReader和BufferedWriter作为读取和 ...

  6. 使用TortoiseGit时如何实现SSH免密码登录

    1.      Git配置 连接GIT服务器使用的是SSH连接,因此无密码登录,需要使用公钥和私钥. 1)     生成公钥/私钥 在Git Shell中输入ssh-keygen命令,直接回车使用默认 ...

  7. 【AtCoder】ARC086 E - Smuggling Marbles

    [题目]E - Smuggling Marbles [题意]给定n+1个点的树(root=0),每个点可以选择放或不放弹珠,每一轮顺序进行以下操作: 1.将根节点0的弹珠加入答案. 2.每个点的弹珠移 ...

  8. mysql查询日期相关的

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  9. Spring Boot工程结构推荐

    工程结构(最佳实践) Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果您使用最佳实践的工程 ...

  10. HDU 1081 To The Max (dp)

    题目链接 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rect ...