复制代码代码如下:
// Paul Tero, juillet 2001
//http://www.tero.co.uk/des/
//
// Optimisé pour la performance avec de grands blocs de Michael Hayworth, novembre 2001
//http://www.netdealing.com
//
// Ce logiciel est fourni "tel quel" et
// Toute garantie expresse ou implicite, y compris, mais sans s'y limiter
// Garanties implicites de qualité marchande et d'adéquation à un usage particulier
// sont déclinés. En aucun cas, l'auteur ou les contributeurs ne seront responsables
// pour tout direct, indirect, accessoire, spécial, exemplaire ou consécutif
// dommages (y compris, mais sans s'y limiter, l'achat de produits de substitution
// ou services; Perte d'utilisation, de données ou de bénéfices; Ou interruption d'entreprise)
// cependant causé et sur toute théorie de la responsabilité, que ce soit en contrat, strict
// responsabilité, ou délit (y compris la négligence ou autrement) surgit de quelque manière que ce soit
// hors de l'utilisation de ce logiciel, même s'il est conseillé de la possibilité de
// de tels dégâts.
// des
// Cela prend la clé, le message et si vous pour crypter ou décrypter
fonction des (clé, message, crypte, mode, iv, padding) {
// Déclarer cela accélère un peu localement les choses
var spfonction1 = nouveau tableau (0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x10004,0x1000000. x1000400,0x10400,0x10400,0x1010000, 0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x10000000000. 0000,0x10400,0x1000004,0x400,0x4,0x1000404, 0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x100010004);
var spfunction2 = nouveau tableau (-0x7fef7Fe0, -0x7fff8000,0x8000,0x108020,0x100000,0x20, -0x7fefffe0, -0x7fff7fe0, -0x7fffffe0, -0x7fef7fe0, -0x7fef8000, -0x80000000, -0X7FF8000. x20, -0x7fefffe0,0x108000, 0x100020, -0x7fff7fe0,0, -0x80000000,0x8000,0x108020, -0x7ff00000,0x100020, -0x7FFFFE x7fff7fe0, -0x7ff00000 , -0x7Fef8000,0x8000, -0x7ff00000, -0x7fff8000,0x20, -0x7fef7fe0,0x108020,0x20,0x8000 , 0x100020,0x108000,0, -0x7fff8000,0x8020, -0x80000000, -0x7fefffe0, -0x7fef7fe0,0x108000);
var spfunction3 = nouveau tableau (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000.0x802080000008,0x8020000. 020200,0x200,0x20200,0x8020000, 0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x80000 00,0x80200200,0x8000000,0x20008.0x2080x20000,0x80200200. 0x8020208,0x8000200,0x8000008,0x200,0, 0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x208,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,0 81,0x1,0x802001,0x2081,0x2081, 0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x8020080);
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,0x4200000000,0x2080100,0x20000000000,0x42000 000. 80100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000, 0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x4008000000,0x4200000000,0x80100.0x2000100.0x40000100.0x80000.0x4008000000.
var spfunction6 = nouveau tableau (0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x200000,0x400010,0x20004000,0x200000,0x4000,0x20004000. x400010,0x20004010,0x4000,0x404000,0x20004010, 0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x200000000000.0x20004000,0x10,0x20400. x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000, 0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0x2000404000);
var spfunction7 = nouveau tableau (0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0x4200800.0x20080000000,0x4200002.0x80x2,0x4000000,0x4200002002,0x80x400000000,0x4200002002002,0x80x400000000,0x4200002002002,0x80x400000000,0x4200002002002,0x80x400000000,0x420000200200 200802,0x200002,0x4000800,0x4000002,0x4200000, 0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x400000000,0x200800,0x40000000000,0x200800.0x200000,0x42002000000008080200x420000200080200000080802.0x4200002000802000000808020000 0x200002,0x400000000,0x4000800,0x200000,0x4200800,0x802,0x200802, 0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0x200000.0x4200802,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. 0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000, 0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001000.0x1040,0x104040404004040
// Créer les sous-clés 16 ou 48 dont nous aurons besoin
var keys = des_createkeys (key);
var m = 0, i, j, temp, temp2, droit1, droit2, gauche, droite, boucle;
var cbcleft, cbcleft2, cbcright, cbcright2
var endloop, loopinc;
var len = message.length;
var chunk = 0;
// Configurez les boucles pour Single et Triple Des
var itérations = clés.length == 32? 3: 9; // Single ou Triple Des
if (iterations == 3) {Looping = Encrypt? Nouveau tableau (0, 32, 2): nouveau tableau (30, -2, -2);}
else {Looping = Encrypt? Nouveau tableau (0, 32, 2, 62, 30, -2, 64, 96, 2): Nouveau tableau (94, 62, -2, 32, 64, 2, 30, -2, -2);}
// pad le message en fonction du paramètre de rembourrage
if (padding == 2) message + = ""; // PAPEZ LE MESSAGE AVEC des espaces
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 rembourrage
else if (! padding) Message + = "/ 0/0/0/0/0/0/0/0"; // PAPEZ LE Message avec des octets nuls
// Stockez le résultat ici
result = "";
Tempresult = "";
if (mode == 1) {// mode CBC
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;
}
// Boucle à travers chaque morceau 64 bits du message
tandis que (m <len) {
Left = (Message.CharCodeat (M ++) << 24) | (message.Charcodeat (M ++) << 16) | (message.Charcodeat (M ++) << 8) | Message.CharCodeat (M ++);
droit = (message.Charcodeat (m ++) << 24) | (message.Charcodeat (M ++) << 16) | (message.Charcodeat (M ++) << 8) | Message.CharCodeat (M ++);
// pour le mode chaînage de bloc de chiffre, xor le message avec le résultat précédent
if (mode == 1) {if (Encrypt) {Left ^ = cbcleft; Droite ^ = CBCRIGHT;} else {CBCleft2 = CBCleft; CBCRIGHT2 = CBCRIGHT; cbcleft = gauche; cbcright = droite;}}
// Tout d'abord chaque 64 mais le morceau du message doit être permuté selon IP
temp = ((gauche >>> 4) ^ à droite) & 0x0f0f0f0f; à droite ^ = temp; gauche ^ = (temp << 4);
temp = ((gauche >>> 16) ^ à droite) & 0x0000ffff; à droite ^ = temp; gauche ^ = (temp << 16);
temp = ((droite >>> 2) ^ gauche) & 0x33333333; gauche ^ = temp; à droite ^ = (temp << 2);
temp = ((droite >>> 8) ^ gauche) & 0x00ff00ff; gauche ^ = temp; à droite ^ = (temp << 8);
temp = ((gauche >>> 1) ^ à droite) & 0x55555555; à droite ^ = temp; gauche ^ = (temp << 1);
gauche = ((gauche << 1) | (gauche >>> 31));
droit = ((droit << 1) | (à droite >>> 31));
// faites-le 1 ou 3 fois pour chaque morceau du message
pour (j = 0; j <itérations; j + = 3) {
Endloop = Looping [J + 1];
Loopinc = Looping [J + 2];
// Va maintenant et effectuez le cryptage ou le décryptage
pour (i = boucle [j]; i! = endloop; i + = loopinc) {// pour l'efficacité
droite1 = droite ^ clés [i];
droite2 = ((droite >>> 4) | (à droite << 28)) ^ touches [i + 1];
// Le résultat est atteint en passant ces octets à travers les fonctions de sélection S
temp = gauche;
gauche = droite;
Droite = temp ^ (spfunction2 [(droit1 >>> 24) & 0x3f] | spfunction4 [(droite1 >>> 16) & 0x3f]
| spfunction6 [(droite1 >>> 8) & 0x3f] | spfunction8 [droite1 & 0x3f]
| spfunction1 [(droite2 >>> 24) & 0x3f] | spfunction3 [(droite2 >>> 16) & 0x3f]
| spfunction5 [(droite2 >>> 8) & 0x3f] | spfunction7 [droite2 & 0x3f]);
}
temp = gauche; gauche = droite; droit = temp; // non réversé à gauche et à droite
} // pour 1 ou 3 itérations
// bouge alors chacun à droite
gauche = ((gauche >>> 1) | (gauche << 31));
droit = ((droite >>> 1) | (à droite << 31));
// Effectue maintenant IP-1, qui est IP dans la direction opposée
temp = ((gauche >>> 1) ^ à droite) & 0x55555555; à droite ^ = temp; gauche ^ = (temp << 1);
temp = ((droite >>> 8) ^ gauche) & 0x00ff00ff; gauche ^ = temp; à droite ^ = (temp << 8);
temp = ((droite >>> 2) ^ gauche) & 0x33333333; gauche ^ = temp; à droite ^ = (temp << 2);
temp = ((gauche >>> 16) ^ à droite) & 0x0000ffff; à droite ^ = temp; gauche ^ = (temp << 16);
temp = ((gauche >>> 4) ^ à droite) & 0x0f0f0f0f; à droite ^ = temp; gauche ^ = (temp << 4);
// pour le mode chaînage de bloc de chiffre, xor le message avec le résultat précédent
if (mode == 1) {if (Encrypt) {cbCleft = Left; cbcright = droite;} else {gauche ^ = cbCleft2; à droite ^ = cbcright2;}}
Tempresult + = String.FromCharcode ((gauche >>> 24), ((gauche >>> 16) & 0xff), ((gauche >>> 8) & 0xff), (gauche & 0xff), (droite >>> 24), ((à droite >>> 16) & 0xff), ((à droite >>> 8) & 0xff), (à droite & 0xff));
Chunk + = 8;
if (chunk == 512) {result + = tempresult; Tempresult = ""; Chunk = 0;}
} // pour 8 caractères, ou 64 bits dans le message
// Renvoie le résultat en tant que tableau
Retour Résultat + Tempresult;
} // fin de DES
// des_createkeys
// Cela prend en entrée une touche 64 bits (même si seulement 56 bits sont utilisés)
// en tant que tableau de 2 entiers et renvoie 16 clés 48 bits
fonction des_createkeys (key) {
// Déclarer cela accélère un peu localement les choses
PC2BYTE0 = Nouveau tableau (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x200002002004,0x1020020020020204,0x20010200200.
pc2bytes1 = new Array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101);
PC2BYTE2 = Nouveau tableau (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0x1000008,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808);
PC2BYTE3 = Nouveau tableau (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000);
PC2BYTE4 = nouveau tableau (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010);
PC2BYTE5 = nouveau tableau (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420);
PC2BYTES6 = Nouveau tableau (0,0x10000000,0x80000,0x10080000,0x2,0x100002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000.0x2,0x100002,0x80002.0x10080002);
PC2BYTE7 = Nouveau tableau (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x3000000,0x20800,0x30800,0x2000000000000003000000,0x200200800,0x20000000000);
PC2BYTE8 = Nouveau tableau (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x204000000,0x2000000,0x2040000000000000002,0x2040002,0x2000002,0x2040002);
PC2BYTES9 = Nouveau tableau (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400.0x10000400,0x408,0x10000408);
PC2BYTE10 = nouveau tableau (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020);
PC2BYTE11 = Nouveau tableau (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x400000000,0x500000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x4200000);
PC2BYTE12 = Nouveau tableau (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x8001010101010,0x808001010,0x80101010101010101010.0x8080010.0x801010);
PC2BYTE13 = Nouveau tableau (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105);
// Combien d'itérations (1 pour DES, 3 pour Triple DES)
var iterations = key.length> 8? 3: 1; // Changé par Paul 16/6/2007 pour utiliser Triple DES pour 9+ clés d'octets
// stocke les clés de retour
var clés = nouveau tableau (32 * itérations);
// Définissez maintenant les quarts de gauche qui doivent être effectués
Var Shifts = Nouveau tableau (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);
// Autres variables
var LeftTemp, droit, m = 0, n = 0, temp;
pour (var j = 0; j <itérations; j ++) {// soit 1 ou 3 itérations
Left = (key.charcodeat (m ++) << 24) | (key.charcodeat (m ++) << 16) | (key.charcodeat (m ++) << 8) | key.CharCodeat (M ++);
droit = (key.charcodeat (m ++) << 24) | (key.charcodeat (m ++) << 16) | (key.charcodeat (m ++) << 8) | key.CharCodeat (M ++);
temp = ((gauche >>> 4) ^ à droite) & 0x0f0f0f0f; à droite ^ = temp; gauche ^ = (temp << 4);
temp = ((droite >>> -16) ^ gauche) & 0x0000ffff; gauche ^ = temp; à droite ^ = (temp << -16);
temp = ((gauche >>> 2) ^ à droite) & 0x33333333; à droite ^ = temp; gauche ^ = (temp << 2);
temp = ((droite >>> -16) ^ gauche) & 0x0000ffff; gauche ^ = temp; à droite ^ = (temp << -16);
temp = ((gauche >>> 1) ^ à droite) & 0x55555555; à droite ^ = temp; gauche ^ = (temp << 1);
temp = ((droite >>> 8) ^ gauche) & 0x00ff00ff; gauche ^ = temp; à droite ^ = (temp << 8);
temp = ((gauche >>> 1) ^ à droite) & 0x55555555; à droite ^ = temp; gauche ^ = (temp << 1);
// Le côté droit doit être décalé et obtenir les quatre derniers bits du côté gauche
temp = (gauche << 8) | ((à droite >>> 20) & 0x000000f0);
// gauche doit être mis à l'envers
gauche = (droit << 24) | ((à droite << 8) & 0xff0000) | ((à droite >>> 8) & 0xff00) | ((droite >>> 24) & 0xf0);
droit = temp;
// maintenant, passez ces changements sur les touches gauche et droite
pour (var i = 0; i <shifts.length; i ++) {
// déplace les touches soit un ou deux bits vers la gauche
if (shifts [i]) {Left = (Left << 2) | (gauche >>> 26); à droite = (à droite << 2) | (à droite >>> 26);}
else {Left = (Left << 1) | (gauche >>> 27); à droite = (à droite << 1) | (à droite >>> 27);}
gauche & = -0xf; à droite & = -0xf;
// applique maintenant PC-2, de telle manière que E est plus facile lors du chiffrement ou du décryptage
// Cette conversion ressemblera à PC-2, sauf que seuls les 6 derniers bits de chaque octet sont utilisés
// plutôt que 48 bits consécutifs et l'ordre des lignes sera selon
// Comment les fonctions de sélection S seront appliquées: S2, S4, S6, S8, S1, S3, S5, S7
LeftTemp = pc2Bytes0 [gauche >>> 28] | pc2bytes1 [(gauche >>> 24) & 0xf]
| pc2bytes2 [(gauche >>> 20) & 0xf] | pc2bytes3 [(gauche >>> 16) & 0xf]
| pc2bytes4 [(gauche >>> 12) & 0xf] | pc2bytes5 [(gauche >>> 8) & 0xf]
| pc2Bytes6 [(gauche >>> 4) & 0xf];
RightTemp = pc2Bytes7 [droite >>> 28] | pc2bytes8 [(à droite >>> 24) & 0xf]
| pc2bytes9 [(à droite >>> 20) & 0xf] | pc2bytes10 [(à droite >>> 16) & 0xf]
| pc2bytes11 [(à droite >>> 12) & 0xf] | pc2bytes12 [(à droite >>> 8) & 0xf]
| pc2Bytes13 [(droit >>> 4) & 0xf];
Temp = ((droite-timp >>> 16) ^ LeftTemp) & 0x0000ffff;
touches [n ++] = LeftTemp ^ temp; touches [n ++] = droite-timp ^ (temp << 16);
}
} // pour chaque itération
// retourne les clés que nous avons créées
clés de retour;
} // fin de des_createkeys
////////////////////////////// TEST /////////////////// ////////////
fonction stringtohex (s) {
var r = "0x";
var hexes = nouveau tableau ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
pour (var i = 0; i <s.length; i ++) {r + = hexes [s.Charcodeat (i) >> 4] + hexes [s.Charcodeat (i) & 0xf];}
retour R;
}
fonction hextostring (h) {
var r = "";
pour (var i = (h.substr (0, 2) == "0x")? 2: 0; i <h.length; i + = 2) {r + = string.fromCharcode (parseInt (h.substr (i , 2), 16));}
retour R;
}
var key = "Ceci est une clé de 24 octets !!";
var message = "Ceci est un message de test";
var cipherText = Des (clé, message, 1, 0);
Document.Writeln ("DES Test:" + StringToHex (CiPherText));