JavaScript realizes des decryption encryption whole process

Source: Internet
Author: User

  This article mainly introduces the JavaScript implementation des decryption encryption process, the need for friends can refer to the following

The code is as follows://paul Tero, July 2001 //http://www.tero.co.uk/des/ // , for//optimised with performance large Cks by Michael Hayworth, November 2001 //http://www.netdealing.com // //this SOFTWARE ' is PROVIDED ' as is "and //any EXPRESS OR implied warranties, including, BUT not LIMITED to, the //implied warranties of MERCHANT Ability and FITNESS for A particular purpose //are disclaimed. In NO EVENT SHALL the AUTHOR OR CONTRIBUTORS is liable //for any DIRECT, INDIRECT, incidental, SPECIAL, exemplary, O R consequential //damages (including, BUT not LIMITED to, procurement of substitute goods  SERVICES; LOSS of Use, DATA, OR profits; OR BUSINESS interruption)  //however caused and on no theory of liability, WHETHER in CONTRACT, strict //liabi Lity, OR TORT (including negligence or otherwise) arising in any way //out of the "use of" this SOFTWARE, even IF advi SED the possibility of //such damage.   //des //this takes the key, the message, and whether to encrypt or decrypt  function des (key, message, Encrypt, mode, IV, padding) { //declaring This locally speeds things up a bit  var spfunction1 = new Array (0x1 010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x100040 4,0x1010004, 0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10 004,0x1000004, 0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x 1000000,0x1000000, 0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x1 0004,0x1010000,0x1000404, 0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x1040 0,0,0x1010004);  var Spfunction2 = new Array ( -0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0 , -0x7fef7fe0,-0x7fef8000,-0x 80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x 7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000, 0x8020,0,0x108020,-0x7fefffe0,0x100000,-0 x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20 , -0x7fef7fe0,0x108020,0x20,0x8000,-0x8000000 0,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,- 0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000);  var Spfunction3 = new Array (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008, 0x20000,0x80202 08,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208, 0x8000208, 0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000, 0x80 20200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x80 00000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x802000 8,0x20200);  var spfuNction4 = new Array (0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081, 0x81,0,0x800 080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080 , 0x200 0,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,0 x800000,0x802001,0x80,0x800000,0x2000,0x802080);  var spfunction5 = new Array (0x100,0x2080100,0x2080000, 0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x200 0100,0x40080100,0x42000100,0x42080000, 0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x400 00100,0x42080100,0x42080100,0x2000100,0x42080000, 0x40000100,0,0x42000000,0x2080100,0x2000000,0x4 2000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000, 0x2080000,0x42000100,0x40080100,0x2 000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000, 0x42080000,0x42080100,0x80100,0x 42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000, 0,0x40080 000,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,0x 20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000, 0x4010,0x404000,0x20404000,0x20000000,0x2 0004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010, 0x20000010,0x400000,0x20004000,0x200000 00,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000 , 0,0x20400010,0x10,0x4000,0x20 400000,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,0x2 00002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x40 00802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x20080 2,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4 000002,0x4000800,0x800,0x200002);  var spfunction8 = new Array (0x10001040,0x1000,0x40000,0x10041040,0x10000000 , 0x10001040,0x40,0x10000000,0x40040,0x10040000,0x 10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000, 0x10000040,0x10001000,0x1040,0x41000,0x40 040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000 , 0x41040,0x40000,0x41040,0x4000 0,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040, 0x10040000,0x10040040,0 x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000, 0x10001040,0,0x10   041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000);   // Create the or subkeys we would need  var keys = Des_createkeys (key);  var m=0, I, J, temp, Temp2, right1, right2, left, right, looping;& nbsp var cbcleft, cbcleft2, Cbcright, cbcright2  var endloop, loopinc;  var len = message.length;  var chunk = 0 ; //set up the loops for single and triple des  var iterations = Keys.length = 32? 3:9; Single or Triple des  if (iterations = 3) {looping = encrypt? New Array (0, 2): New Array (30,-2,-2);}   else {looping = encrypt? New Array (0, 2, 2, 2): New Array (94, 62,-2, 32, 64, 2, 30,-2,- 2);}    //pad The depending on the padding parameter  if (padding = 2) message + = ""; Pad the message with spaces  else if (padding = 1) {temp = 8-(len%8); Message + + String.fromCharCode (temp,temp,temp,temp,temp,temp,temp,temp); if (temp==8) len+=8;} PKCS7 padding  Else if (!padding) message + = ""; Pad the message out with null bytes   //store the ResUlt here  result = "";  tempresult = "";    if (mode = = 1) {//CBC mode  = (cbcleft (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; }   //loop through each of the bit chunk of the message  while (M < le N) {  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++);   //for Cipher block Chaining mode, xor the "message" with the previous result  if (mode = = 1) {if (encrypt) {left ^= cbcleft, right ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = CbcrigHt Cbcleft = left; c bcright = right;}    //first Each but chunk of the "message must is permuted according to ip  temp = (left >>> 4 ^ right) & 0x0f0f0f0f; Right ^= temp; Left ^= (temp << 4);  temp = (left >>>) ^ right) & 0x0000ffff; Right ^= temp; Left ^= (temp <<);  temp = (ok >>> 2) ^ left) & 0x33333333; Left ^= temp; Right ^= (temp << 2);  temp = (ok >>> 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));    //do This either 1 or 3 to each chunk to the message  for (j=0; j<iterations; j+=3) {  E Ndloop = looping[j+1];  Loopinc = looping[j+2]; //now go through and perform the ENCRYption or decryption  for (i=looping[j), I!=endloop i+=loopinc) {//for efficiency  right1 = right ^ keys[i];&n Bsp Right2 = ((Right >>> 4) | (right << 28)) ^ keys[i+1]; //the result are attained by passing these bytes through the S selection functions  temp = LEFT;&NB Sp left = right;  right = temp ^ (spfunction2[(right1 >>>) & 0x3f] | spfunction4[(right1 >>> 16 ) & 0x3f]  | spfunction6[(right1 >>> 8) & 0x3f] | Spfunction8[right1 & 0x3f]  | spfunction1[(right2 >>>) & 0x3f] | spfunction3[(right2 >>>) & 0x3f]  | spfunction5[(right2 >>> 8) & 0x3f] | Spfunction7[right2 & 0x3f]); }  temp = left; left = right; right = temp; Unreverse left and right }//for either 1 or 3 iterations   //move then all one bit to the right  left = (left >>> 1) | (left << 31));   right = (right >>> 1) | (right << 31));    //now perform IP-1, which is IP in opposite direction  temp = ((left >>> 1) ^ right) & 0x55555555; Right ^= temp; Left ^= (temp << 1);  temp = (right >>> 8) ^ left) & 0x00ff00ff; Left ^= temp; Right ^= (temp << 8);  temp = (ok >>> 2) ^ left) & 0x33333333; Left ^= temp; Right ^= (temp << 2);  temp = (left >>>) ^ right) & 0x0000ffff; Right ^= temp; Left ^= (temp <<);  temp = (left >>> 4) ^ right) & 0x0f0f0f0f; Right ^= temp; Left ^= (temp << 4);   //for Cipher blocks chaining mode, XOR the message with the previous result  I F (Mode = = 1) {if (encrypt) {cbcleft = left; cbcright = right;} else {left ^= cbcleft2; right ^= cbcright2;}}   Tempresult + = String.fromCharCode (left>>>24), ((left>>>16) & 0xFF), ((left>>>8 ) & 0xFF), (left & 0xFF), (right>>>24), ((right>>>16) & 0xFF), ((right>>>8) & 0xff), (Right & 0xFF));    Chunk + = 8;&NB Sp if (chunk = =) {result = Tempresult; tempresult = ""; Chunk = 0;}  }//for every 8 characters, or $ message   //return The result as a array  return res Ult + tempresult; }//end of des       //des_createkeys //this takes as input a-bit ke Y (even though only bits are used)  //as an array of 2 integers, and returns bit keys  function Des_cre Atekeys (key) { //declaring This locally speeds things up a bit  Pc2bytes0 = new Array (0,0x4,0x20000000,0x2000 0004,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,0x4000 100,0x4000101,0x4100100,0x4100101);  pc2bytes2 = new Array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x10008 00,0x1000808);  Pc2bytes3 = new Array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000, 0x20000,0x220000,0x8020000,0x 8220000,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,0x1008000 0,0x2,0x10000002,0x80002,0x10080002);  pc2bytes7 = new Array ( 0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x308 00,0x20020000 , 0x20030000,0x20020800,0x20030800);  pc2bytes8 = new Array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002, 0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x20 40002,0x2000002,0x2040002);  pc2bytes9 = new Array (0,0x10000000, 0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x1 0000400,0x408,0x10000408 );  Pc2bytes10 = new Array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020, 0x102000,0x102020,0x 102000,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);   //how many iterations (1 for DES, 3 for Triple DES)   var Itera tions = key.length > 8? 3:1; Changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys //stores the return keys  var keys = new Array (* iterations); //now define the left shifts whic H need to is done  var shifts = new Array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); //other VARIABLES&N Bsp var lefttemp, Righttemp, m=0, n=0, temp;    for (var j=0; j<iterations; J + +) {//either 1 or 3 Iterations&nbs P left = (key.charcodeat (m++) << 24) | (Key.charcodeat (m++) << 16) | (Key.charcodeat (m++) << 8) | Key.char codeat (m++);  right = (key.charcodeat (m++) << 24) | (Key.charcodeat (m++) << 16) | (Key.charcodeat (m++) << 8) | Key.charcode at (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);   //the right side needs to is shifted and to get the last four bits of the left SID e  temp = (left << 8) | (Right >>> & 0x000000f0); //left needs to is put upside down  left = (right << 24) | (Right << 8) & 0xff0000 | (Right >>> 8) & 0XFF00 | (Right >>>) & 0xf0);  right = temp;   //now go through and perform this Le FT and right keys  for (var i=0 i < Shifts.length, i++) { //shift the keys either one or two bits to the LE ft  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;   //now apply PC-2, in such a way this E is easier when encrypting or decrypting //thi s conversion would look like PC-2 except only the last 6 bits in each byte are used //rather than-consecutive bits and the order of lines would be according to //how the selection functions would be applied:s2, S4, S6, S8, S1, S3 , S5, s7  lefttemp = Pc2bytes0[left >>> 28] | pc2bytes1[(left >>>) & 0xf]  | pc2bytes2[(left >>>) & 0xf] | pc2bytes3[(left >>>) & 0xf]  | pc2bytes4[(left >>>) & 0xf] | pc2bytes5[(left >>> 8) & 0xf]  | Pc2bytes6[(left >>> 4) & 0xf];  righttemp = pc2bytes7[right ≫>> 28] | pc2bytes8[(right >>>) & 0xf]  | pc2bytes9[(right >>>) & 0xf] | pc2bytes10[(right >>>) & 0xf]  | pc2bytes11[(right >>>) & 0xf] | pc2bytes12[(right >>> 8) & 0xf]  | pc2bytes13[(Right >>> 4) & 0xf];  temp = (righttemp >>>) ^ lefttemp) & 0x0000ffff;&nbsp ; keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp <<); } }//for each iterations //return the keys we ' ve CREATED&NB Sp Return keys; }//end of des_createkeys       //////////////////////////////TEST/////////////   function Stringtohex (s) {  var r = "0x";  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; }    FUNCTIon Hextostring (h) {  var r = "";  for (Var i= (h.substr (0, 2) = "0x")? 2:0; i<h.length; i+=2) {r = string.fr Omcharcode (parseint (H.substr (i, 2), 16);}   return r; }    var key = "This is a byte key!!";   var message = ' This was a test message ';  var ciphertext = des (key, message, 1, 0);  Document.writeln ("D ES Test: "+ stringtohex (ciphertext));   
Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.