原文地址:传送门

本文提供了一个能使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, 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 };int[] spfunction2 = new int[] { -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 };int[] spfunction3 = new int[] { 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 };int[] spfunction4 = new int[] { 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 };int[] spfunction5 = new int[] { 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 };int[] spfunction6 = new int[] { 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 };int[] spfunction7 = new int[] { 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 };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, 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 };int[] keys = DES_CreateKey(key);int m = 0, i, j, temp, right1, right2, left, right;int[] looping;int cbcleft = 0, cbcleft2 = 0, cbcright = 0, cbcright2 = 0;int endloop, loopinc;int len = strMessage.Length;int chunk = 0;int iterations = (keys.Length == 32) ? 3 : 9;if (iterations == 3){looping = isEncrypt ? new int[] { 0, 32, 2 } : new int[] { 30, -2, -2 };}else{looping = isEncrypt ? new int[] { 0, 32, 2, 62, 30, -2, 64, 96, 2 } : new int[] { 94, 62, -2, 32, 64, 2, 30, -2, -2 };}strMessage += "\0\0\0\0\0\0\0\0";StringBuilder result = new StringBuilder();StringBuilder tempresult = new StringBuilder();if (mode == 1){int ivLen = strIV.Length;char[] civ = strIV.ToCharArray();int[] iv = new int[ivLen + 8];for (i = 0; i < ivLen; i++){iv[i] = Convert.ToInt32(civ[i]);}for (i = ivLen; i < (ivLen + 8); ++i){iv[i] = 0;}cbcleft = (iv[m++] << 24) | (iv[m++] << 16) | (iv[m++] << 8) | iv[m++];cbcright = (iv[m++] << 24) | (iv[m++] << 16) | (iv[m++] << 8) | iv[m++];m = 0;}while (m < len){int[] message = new int[len + 8];char[] cm = strMessage.ToCharArray();for (i = 0; i < (len + 8); ++i){message[i] = Convert.ToInt32(cm[i]);}if (isEncrypt){left = (message[m++] << 16) | message[m++];right = (message[m++] << 16) | message[m++];}else{left = (message[m++] << 24) | (message[m++] << 16) | (message[m++] << 8) | message[m++];right = (message[m++] << 24) | (message[m++] << 16) | (message[m++] << 8) | message[m++];}if (mode == 1){if (isEncrypt){left ^= cbcleft;right ^= cbcright;}else{cbcleft2 = cbcleft;cbcright2 = cbcright;cbcleft = left;cbcright = right;}}temp = (MoveByte(left, 4) ^ right) & 0x0f0f0f0f;right ^= temp;left ^= (temp << 4);temp = (MoveByte(left, 16) ^ right) & 0x0000ffff;right ^= temp;left ^= (temp << 16);temp = (MoveByte(right, 2) ^ left) & 0x33333333;left ^= temp;right ^= (temp << 2);temp = (MoveByte(right, 8) ^ left) & 0x00ff00ff;left ^= temp; right ^= (temp << 8);temp = (MoveByte(left, 1) ^ right) & 0x55555555;right ^= temp;left ^= (temp << 1);left = ((left << 1) | MoveByte(left, 31));right = ((right << 1) | MoveByte(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 = (MoveByte(right, 4) | (right << 28)) ^ keys[i + 1];temp = left;left = right;right = temp ^ (spfunction2[MoveByte(right1, 24) & 0x3f] | spfunction4[MoveByte(right1, 16) & 0x3f] | spfunction6[MoveByte(right1, 8) & 0x3f] | spfunction8[right1 & 0x3f] | spfunction1[MoveByte(right2, 24) & 0x3f] | spfunction3[MoveByte(right2, 16) & 0x3f] | spfunction5[MoveByte(right2, 8) & 0x3f] | spfunction7[right2 & 0x3f]);}temp = left;left = right;right = temp;}left = (MoveByte(left, 1) | (left << 31));right = (MoveByte(right, 1) | (right << 31));temp = (MoveByte(left, 1) ^ right) & 0x55555555;right ^= temp;left ^= (temp << 1);temp = (MoveByte(right, 8) ^ left) & 0x00ff00ff;left ^= temp; right ^= (temp << 8);temp = (MoveByte(right, 2) ^ left) & 0x33333333;left ^= temp;right ^= (temp << 2);temp = (MoveByte(left, 16) ^ right) & 0x0000ffff;right ^= temp;left ^= (temp << 16);temp = (MoveByte(left, 4) ^ right) & 0x0f0f0f0f;right ^= temp;left ^= (temp << 4);if (mode == 1){if (isEncrypt){cbcleft = left;cbcright = right;}else{left ^= cbcleft2;right ^= cbcright2;}}if (isEncrypt){tempresult.Append(Convert.ToChar((MoveByte(left, 24))));tempresult.Append(Convert.ToChar((MoveByte(left, 16) & 0xff)));tempresult.Append(Convert.ToChar((MoveByte(left, 8) & 0xff)));tempresult.Append(Convert.ToChar((left & 0xff)));tempresult.Append(Convert.ToChar(MoveByte(right, 24)));tempresult.Append(Convert.ToChar((MoveByte(right, 16) & 0xff)));tempresult.Append(Convert.ToChar((MoveByte(right, 8) & 0xff)));tempresult.Append(Convert.ToChar((right & 0xff)));}else{tempresult.Append(Convert.ToChar(((MoveByte(left, 16) & 0xffff))));tempresult.Append(Convert.ToChar((left & 0xffff)));tempresult.Append(Convert.ToChar((MoveByte(right, 16) & 0xffff)));tempresult.Append(Convert.ToChar((right & 0xffff)));}if (isEncrypt){chunk += 16;}else{chunk += 8;}if (chunk == 512){result.Append(tempresult.ToString());tempresult.Remove(0, tempresult.Length);chunk = 0;}}return result.ToString() + tempresult.ToString();}//密钥生成函数private static int[] DES_CreateKey(string strKey){int[] pc2bytes0 = new int[] { 0, 0x4, 0x20000000, 0x20000004, 0x10000, 0x10004, 0x20010000, 0x20010004, 0x200, 0x204, 0x20000200, 0x20000204, 0x10200, 0x10204, 0x20010200, 0x20010204 };int[] pc2bytes1 = new int[] { 0, 0x1, 0x100000, 0x100001, 0x4000000, 0x4000001, 0x4100000, 0x4100001, 0x100, 0x101, 0x100100, 0x100101, 0x4000100, 0x4000101, 0x4100100, 0x4100101 };int[] pc2bytes2 = new int[] { 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808, 0, 0x8, 0x800, 0x808, 0x1000000, 0x1000008, 0x1000800, 0x1000808 };int[] pc2bytes3 = new int[] { 0, 0x200000, 0x8000000, 0x8200000, 0x2000, 0x202000, 0x8002000, 0x8202000, 0x20000, 0x220000, 0x8020000, 0x8220000, 0x22000, 0x222000, 0x8022000, 0x8222000 };int[] pc2bytes4 = new int[] { 0, 0x40000, 0x10, 0x40010, 0, 0x40000, 0x10, 0x40010, 0x1000, 0x41000, 0x1010, 0x41010, 0x1000, 0x41000, 0x1010, 0x41010 };int[] pc2bytes5 = new int[] { 0, 0x400, 0x20, 0x420, 0, 0x400, 0x20, 0x420, 0x2000000, 0x2000400, 0x2000020, 0x2000420, 0x2000000, 0x2000400, 0x2000020, 0x2000420 };int[] pc2bytes6 = new int[] { 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002, 0, 0x10000000, 0x80000, 0x10080000, 0x2, 0x10000002, 0x80002, 0x10080002 };int[] pc2bytes7 = new int[] { 0, 0x10000, 0x800, 0x10800, 0x20000000, 0x20010000, 0x20000800, 0x20010800, 0x20000, 0x30000, 0x20800, 0x30800, 0x20020000, 0x20030000, 0x20020800, 0x20030800 };int[] pc2bytes8 = new int[] { 0, 0x40000, 0, 0x40000, 0x2, 0x40002, 0x2, 0x40002, 0x2000000, 0x2040000, 0x2000000, 0x2040000, 0x2000002, 0x2040002, 0x2000002, 0x2040002 };int[] pc2bytes9 = new int[] { 0, 0x10000000, 0x8, 0x10000008, 0, 0x10000000, 0x8, 0x10000008, 0x400, 0x10000400, 0x408, 0x10000408, 0x400, 0x10000400, 0x408, 0x10000408 };int[] pc2bytes10 = new int[] { 0, 0x20, 0, 0x20, 0x100000, 0x100020, 0x100000, 0x100020, 0x2000, 0x2020, 0x2000, 0x2020, 0x102000, 0x102020, 0x102000, 0x102020 };int[] pc2bytes11 = new int[] { 0, 0x1000000, 0x200, 0x1000200, 0x200000, 0x1200000, 0x200200, 0x1200200, 0x4000000, 0x5000000, 0x4000200, 0x5000200, 0x4200000, 0x5200000, 0x4200200, 0x5200200 };int[] pc2bytes12 = new int[] { 0, 0x1000, 0x8000000, 0x8001000, 0x80000, 0x81000, 0x8080000, 0x8081000, 0x10, 0x1010, 0x8000010, 0x8001010, 0x80010, 0x81010, 0x8080010, 0x8081010 };int[] pc2bytes13 = new int[] { 0, 0x4, 0x100, 0x104, 0, 0x4, 0x100, 0x104, 0x1, 0x5, 0x101, 0x105, 0x1, 0x5, 0x101, 0x105 };int iterations = strKey.Length >= 24 ? 3 : 1;int[] keys = new int[32 * iterations];int[] shifts = new int[] { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 };int lefttemp, righttemp;int m = 0, n = 0;int left, right, temp;char[] ckey = strKey.ToCharArray();int strLen = strKey.Length;int keyLen = strLen + iterations * 8;int[] key = new int[keyLen];for (int i = 0; i < strLen; ++i){key[i] = Convert.ToInt32(ckey[i]);}for (int i = strLen; i < keyLen; ++i){key[i] = 0;}for (int j = 0; j < iterations; j++){left = (key[m++] << 24) | (key[m++] << 16) | (key[m++] << 8) | key[m++];right = (key[m++] << 24) | (key[m++] << 16) | (key[m++] << 8) | key[m++];temp = (MoveByte(left, 4) ^ right) & 0x0f0f0f0f;right ^= temp;left ^= (temp << 4);temp = (MoveByte(right, -16) ^ left) & 0x0000ffff;left ^= temp;right ^= (temp << -16);temp = (MoveByte(left, 2) ^ right) & 0x33333333;right ^= temp;left ^= (temp << 2);temp = (MoveByte(right, -16) ^ left) & 0x0000ffff;left ^= temp;right ^= (temp << -16);temp = (MoveByte(left, 1) ^ right) & 0x55555555;right ^= temp;left ^= (temp << 1);temp = (MoveByte(right, 8) ^ left) & 0x00ff00ff;left ^= temp;right ^= (temp << 8);temp = (MoveByte(left, 1) ^ right) & 0x55555555;right ^= temp;left ^= (temp << 1);temp = (left << 8) | (MoveByte(right, 20) & 0x000000f0);left = (right << 24) | ((right << 8) & 0xff0000) | (MoveByte(right, 8) & 0xff00) | (MoveByte(right, 24) & 0xf0);right = temp;int shiftLen = shifts.Length;for (int i = 0; i < shiftLen; i++){if (shifts[i] == 1){left = (left << 2) | MoveByte(left, 26);right = (right << 2) | MoveByte(right, 26);}else{left = (left << 1) | MoveByte(left, 27);right = (right << 1) | MoveByte(right, 27);}left &= -0xf;right &= -0xf;lefttemp = pc2bytes0[MoveByte(left, 28)] | pc2bytes1[MoveByte(left, 24) & 0xf] | pc2bytes2[MoveByte(left, 20) & 0xf] | pc2bytes3[MoveByte(left, 16) & 0xf] | pc2bytes4[MoveByte(left, 12) & 0xf] | pc2bytes5[MoveByte(left, 8) & 0xf] | pc2bytes6[MoveByte(left, 4) & 0xf];righttemp = pc2bytes7[MoveByte(right, 28)] | pc2bytes8[MoveByte(right, 24) & 0xf] | pc2bytes9[MoveByte(right, 20) & 0xf] | pc2bytes10[MoveByte(right, 16) & 0xf] | pc2bytes11[MoveByte(right, 12) & 0xf] | pc2bytes12[MoveByte(right, 8) & 0xf] | pc2bytes13[MoveByte(right, 4) & 0xf];temp = (MoveByte(righttemp, 16) ^ lefttemp) & 0x0000ffff;keys[n++] = lefttemp ^ temp;keys[n++] = righttemp ^ (temp << 16);}}return keys;}//实现无符号右移,相当于javascript中的>>>运算符private static int MoveByte(int val, int pos){string strBit = string.Empty;//取得二进制字符串strBit = Convert.ToString(val, 2);//转成32位长度的二进制if (val >= 0){strBit = Convert.ToString(val, 2);int len = strBit.Length;len = 32 - len;for (int i = 0; i < len; ++i){strBit = "0" + strBit;}}//如果pos小于0,则应移pos + 32位pos = (pos < 0) ? pos + 32 : pos;for (int i = 0; i < pos; ++i){strBit = "0" + strBit.Substring(0, 31);}return Convert.ToInt32(strBit, 2);}//将普通的字符串转换成16进制的字符串private static string StringToHex(string s){StringBuilder sb = new StringBuilder();char[] hexs = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };int len = s.Length;char[] cs = s.ToCharArray();for (int i = 0; i < len; ++i){sb.Append(hexs[cs[i] >> 4]);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 = 0; i < len; i += 2){c = Convert.ToChar(Convert.ToInt16("0x" + s.Substring(i, 2), 16));sb.Append(c);}return sb.ToString();}//C# DES加密函数public static string DesEncrypt(string key, string message){return StringToHex(DES(key, message, true, 0, ""));}//C# DES解密函数public static string DesDecrypt(string key, string message){return DES(key, HexToString(message), false, 0, "");}

用法如下:

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

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

转载于:https://www.cnblogs.com/jiyang2008/p/8260542.html

JavaScript与C#互通的DES加解密算法相关推荐

  1. C语言实现DES加解密算法

    C语言实现DES加解密算法 DES加解密 DES加解密 #include <stdio.h> #include <stdlib.h> #include <string.h ...

  2. js des加密 java_Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...

  3. DES加解密算法原理详解与实现

    [DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...

  4. java实现DES加解密算法

    以下是我用java实现的DES算法,实现中可能存在一点问题自己没空去找,但我觉得DES的算法过程肯定没错!现在暂时没时间去找到底是哪里的问题,有空再瞧瞧自己的代码喽! makekey.java是生成密 ...

  5. kotlin写的加解密算法,包括模式和填充方式

    DES加密 DES是一种对称加密(Data Encryption Standard)算法. DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位. 加密算法常见的有ECB模式和CBC模式: ...

  6. iOS开发-DES加密解密算法

    前几天后台给了一个Java代码的加解密方式,让我这边直接用.我对应着Java上解密方法找到一些适合iOS的DES加解密算法,特总结一下 1.使用DES加密: //加密 +(NSString *) en ...

  7. 一个java的DES加解密类转换成C#

    原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util;import java.security.*; //im ...

  8. 密码学入门1——凯撒密码和三重DES加解密

    实验目的 1.完成第一个入门加解密--凯撒密码 2.完成当下较为流行的三重DES加解密技术 3.熟悉所学的实际运用方向 实验准备 硬件:计算机或笔记本电脑 操作系统:Mac操作系统 IDE环境:Ecl ...

  9. PHP 基础篇 - PHP 中 DES 加解密详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使 ...

  10. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密

    1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...

最新文章

  1. Fatal Error: Out of memory php内存溢出处理三种方法
  2. 第二章 序列比对——Blast局部比对
  3. 清空、重设input框
  4. Py之PIL:不一样的PS之利用PIL库的img.paste方法实现合成刘若英导演电影《后来的我们》海报设计
  5. Linux7改运行级别,Centos7 修改运行级别
  6. Office 365 Exchange 2016 混合部署前准备
  7. 年末最大AI盛典!2020深度学习开发者峰会报名启动
  8. java比ios慢_Android为什么比iOS慢
  9. IOS - UTF-8转码问题
  10. 操作系统学习之用C语言模拟伙伴(Buddy)算法
  11. java参数注解pam_CAS3.4 关于PAM模块SSL的详细配置
  12. Java中常用的url签名防篡改方法
  13. matlab拟合心得体会,Matlab数据拟合工具在数学建模中的简单应用
  14. N、NP、NPC问题分析
  15. 施乐j75服务器电源管理系统,富士施乐推出印刷系统 Color J75 Press
  16. 永磁同步电机的矢量控制策略(十二)一一一MTPA最大转矩电流比控制
  17. HTML特效代码大全
  18. 哈尔滨工业大学邮件系统客户端设置
  19. 假设一个录像厅有0,1,2三种不同的录像片可由观众选择放映。录像厅的放映规则为: 1)任何时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的。最后一个观众主动离开时结束当前录像片的放映。
  20. W32DASM 和 OLLYDBG 配合起来破解反汇编算法

热门文章

  1. scratch编程我的世界3D史蒂夫
  2. fclose_fclose –关闭流
  3. 好的编码习惯是一场代码驱邪仪式
  4. 按键精灵设置脚本过期日期
  5. 关于南京市大学生办理住房补贴的流程示意图
  6. 测试Python的poplib模块读取邮箱信息
  7. 华为nova5iotg功能使用_华为nova3怎么使用OTG功能教程,华为nova3 OTG功能详解
  8. 小肩膀易语言四期POST+JS
  9. 2019西安交大计算机专业研究生分数线,西安交通大学公布2019年硕士研究生招生复试基本分数线...
  10. ubuntu ftp服务器上传文件,ubuntu ftp服务器上传文件