复制代码代码如下:
//ポール・テロ、2001年7月
//http://www.tero.co.uk/des/
//
// 2001年11月、マイケル・ヘイワースによる大きなブロックでのパフォーマンスのために最適化
//http://www.netdealing.com
//
//このソフトウェアは「現状のまま」と提供されます
//明示的または黙示的な保証を含むが、これに限定されない保証
//商品性と特定の目的に対するフィットネスの暗黙の保証
//免除されています。いかなる場合でも、著者や貢献者は責任を負いません
//直接的、間接的、偶発的、特別な、模範的、または結果的
//損害(代替品の調達を含むがこれらに限定されない
//またはサービス;使用の喪失、データ、または利益。またはビジネスの中断)
//しかし、契約中かどうかにかかわらず、責任の理論に起因し、厳格な
//責任、または不法行為(過失またはその他を含む)は何らかの形で発生する
//の可能性について助言されたとしても、このソフトウェアの使用から
//そのようなダメージ。
// des
//これはキー、メッセージ、そして暗号化または復号化するかどうかを取ります
function des(key、message、necrypt、mode、iv、padding){
//これを宣言すると、物事が少しスピードを上げます
var spfunction1 = new Array(0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x10400,0x10104040404,0x400,0x1000404,0004,000x1000000,0404044,000x100 、0x1000400,0x10400,0x10400,0x1010000、 0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,040404,0404040404040404040404,04,04,0x4,0x1010000,000400,0400,0400,0400,000000,0000,0000,0000,0000,0000,0000,0000,0000,0000 10000,0x10400,0x1000004,0x400,0x4,0x1000404、 0x10404,0x1010404,0x10004,0x1010000,0x1000404,0404,0404,0404,0404,0404,0404,0400,0400,0x1000400,0,0,04,0004,0400,0400,0400,0,0400,0,0400,0,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0400,0,0400,0,0400,0400,0,04.
var spfunction2 = new Array(-0x7fef7fe0、-0x7ffff8000,0x8000,0x108020,0x100000,0x20、-0x7fefffe0、-0x7ffff7fe0、-0x7fffffe0、-0x7fef7fe0、-0x7feffef8000、-0x800000,000000 、0x20、-0x7fefffe0,0x108000、 0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000 、-0x7fef8000,0x8000、-0x7ff00000、-0x7ffff8000,0x20、-0x7fef7fe0,0x108020,0x20,0x8000、-0x800000,0x8020、-0x7fef8000,0x100000、-0x7ffffe0pffpifffpifffpifffpifffpifffpie0pfffpipffpifffpfi0pffpfi0pfffpfiet 0,0x100020,0x108000,0、 -0x7fff8000,0x8020、-0x80000000、-0x7fefffe0、-0x7fef7fe0,0x108000);
var spfunction3 = new Array(0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008000008,0x200,0x8020202080,00008,08,00000000000000000000000000000,00000 x8020200,0x200,0x20200,0x8020000、 0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x800000000,0200,0x8000000,000,0x20008,0200,0000000020000,00020000000200,000200,000200,0200,0200,020000.000020000020002000200000200000200000200000200000200000200000 、0x8020208,0x8000200,0x8000008,0x200,0、 0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0200,0x8000008,0x80200,0x8000208,0x208,0x8020000,0208,0208,0208,0208,0208,0208,0208,0x8,0x80200,0200
var spfunction4 = new Array(0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,02000,0x802000,0x802081,0001,0001,0001,0001,000x80x802000,02000,02000,000x2 800000,0x802001,0x80,0x800000、 0x2001,0x2080,0x800081,0x1,0x2080,0x80008000,0x2000,0x802080,0x802081,0x81,0x8080,0x800001,0x802000,0x80808080,0008080808080808080808080,000808080 00081,0x1,0x802001,0x2081,0x2081、 0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80、0x8000000,0x2000,0x802080);
var spfunction5 = new Array(0x100,0x2080100,0x20800,0x42000100,0x80000,0x100,0x4000000000,0x2080000,040080100,0x80000,0x2000100,0x40080100,0x400010000,00010000,000100,000100,0100,000 40000000,0x2000000,0x400800,0x400800,0,0x40000,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,0x4000000,0x42000000,0400,0x2000100,0x40000100,000,000,000,00000000000000000,00010000,000,00000,0000
var spfunction6 = new Array(0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,04000,0x4040101010,010,0x400000,0000000000,000100001000010000000000100000001000000000010000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 、0x400010,0x20004010,0x4000,0x404000,0x20004010、 0x10,0x20400010,0x20400010,0,0x404010,0x2040404000,0x4010,0x404000,0x204040404040404040404040404000,0x10,0x204000101010,0,0x4040000000000,000000000000000000000000000000000000000 0x20004000,0x200000,0x4010,0x20000010,0x2040404040,0x404000、 0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x4040101010101010104010010401010,0,0,020404000,0x2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
var spfunction7 = new Array(0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,04200802,0x200000,0,0x4000002,0002,0x40000,000,0002,0002,0002,0002,0002,0002,0002,0002,0002 0x200802,0x200002,0x4000800,0x4000002,0x4200000、 0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x400000000,0x200800,0x2000000000000002,0002,0x4000202000020000 、0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802、 0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x100002);
var spfunction8 = new Array(0x10001040,0x1000,0x40000,0x10041040,0x10000000,010001000,040,040,0x100400,0x10041040,0041000,0x100410040,00040,000,00040,040,0,0x100400,0x10041040,00040,000x4040404040404040,00040404040404040404040404040,000 0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040、 0x10040040,0x10041000,0x1040,0,0,0,0x10040040,0x10000040,01000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x100400401000x401000,0001000,0x40000,0x10041000,01000 、0x40,0x10000040,0x100400,0x10040040,0x10000000,0x40000、 0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x1000101000101000101000,0x41000,0x1040,0x1040,041000,0x41000,0x1040,0004100,000x100,000x100,000x100,0004100,0004100,0004100,000
//必要な16または48のサブキーを作成します
var keys = des_createkeys(key);
var m = 0、i、j、temp、temp2、right1、rigk2、左、右、ループ。
var cbcleft、cbcleft2、cbcright、cbcright2
var endloop、loopinc;
var len = message.length;
var chunk = 0;
//シングルおよびトリプルDESのループをセットアップします
var iterations = keys.length == 32? 3:9; //シングルまたはトリプルデス
if(iterations == 3){looping = encrypt?新しい配列(0、32、2):新しい配列(30、-2、-2);}
else {looping = encrypt?新しい配列(0、32、2、62、30、-2、64、96、2):新しい配列(94、62、-2、32、64、2、30、-2、-2);}
//パディングパラメーターに応じてメッセージをパッドします
if(padding == 2)message += ""; //スペースでメッセージをパッドします
else if(padding == 1){temp = 8-(len%8);メッセージ += String.FromCharcode(温度、温度、温度、温度、温度、温度、温度、温度); if(temp == 8)len+= 8;} // pkcs7パディング
else if(!padding)message += "/0/0/0/0/0/0/0"; // nullバイトでメッセージをパッドアウトします
//ここに結果を保存します
result = "";
tempresult = "";
if(mode == 1){// 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;
}
//メッセージの各64ビットチャンクをループします
while(m <len){
左=(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 ++);
//暗号ブロックチェーンモードの場合、前の結果とともにメッセージをXOR
if(mode == 1){if(encrypt){left ^= cbcleft;右 ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft =左; cbcright = right;}}
//最初に各64ですが、メッセージのチャンクはIPに従って順応する必要があります
temp =((左>>> 4) ^右)&0x0f0f0f0f;右 ^= temp;左 ^=(temp << 4);
temp =((左>>> 16) ^右)&0x0000ffff;右 ^= temp;左 ^=(temp << 16);
temp =((右>>> 2) ^左)&0x33333333;左 ^=温度;右 ^=(temp << 2);
temp =((右>>> 8) ^左)&0x00ff00ff;左 ^=温度;右 ^=(temp << 8);
temp =((左>>> 1) ^右)&0x55555555;右 ^= temp;左 ^=(temp << 1);
左=((左<< 1)|(左>>> 31));
右=((右<< 1)|(右>>> 31));
//メッセージのチャンクごとに1または3回これを行う
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 =((右>>> 4)|(右<< 28)) ^ keys [i+1];
//結果は、これらのバイトをS選択関数に渡すことで達成されます
temp =左;
左=右;
右= 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 =左;左=右;右=温度; //左と右の反逆
} // 1または3回の繰り返しの場合
//それぞれを右にビットに移動します
左=((左>>> 1)|(左<< 31));
右=((右>>> 1)|(右<< 31));
//次にIP-1を実行します。これは反対方向にIPです
temp =((左>>> 1) ^右)&0x55555555;右 ^= temp;左 ^=(temp << 1);
temp =((右>>> 8) ^左)&0x00ff00ff;左 ^=温度;右 ^=(temp << 8);
temp =((右>>> 2) ^左)&0x33333333;左 ^=温度;右 ^=(temp << 2);
temp =((左>>> 16) ^右)&0x0000ffff;右 ^= temp;左 ^=(temp << 16);
temp =((左>>> 4) ^右)&0x0f0f0f0f;右 ^= temp;左 ^=(temp << 4);
//暗号ブロックチェーンモードの場合、前の結果とともにメッセージをXOR
if(mode == 1){if(encrypt){cbcleft = left; cbcright = right;} else {left ^= cbcleft2;右 ^= cbcright2;}}
tempresult += string.fromCharCode((左>>> 24)、((左>>> 16)&0xff)、((左>>> 8)&0xff)、(左&0xff)、(右>>> 24)、((右>>> 16)&0xff)、((右>>> 8)&0xff)、(右&0xff));
チャンク += 8;
if(chunk == 512){result += tempresult; tempresult = ""; chunk = 0;}
} // 8文字ごとに、またはメッセージ内の64ビット
//結果を配列として返します
結果 + tempresult;
} // desの終わり
// des_createkeys
//これは、入力として64ビットキーとして使用されます(56ビットのみが使用されていても)
// 2つの整数の配列として、16 48ビットキーを返します
関数des_createkeys(key){
//これを宣言すると、物事が少しスピードを上げます
PC2BYTES0 = NEW ARRAY(0,0x4,0x20000000,0x20000004,0x1000000,0x10004,0x20010000,0x200002000020000,0x200204,0200,0200,02020010200,020010200,020010200,020010200,00020010200,0200104,000200104,0002002002
PC2BYTES1 = New Array(0,0x1,0x100000,0x100001,0x400000000,0x4000001,0x4100000,0x4100001,0x100,01,0x100100100,0x100101,0x4000100,0x40001010101,01,01,01,01,0101,01,0101,01,00001,0101,0001,00001,00001,00001,0001,000
PC2BYTES2 = New Array(0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808080808,0808,0x1000000,0x1000008,08800,0x1000808);
PC2BYTES3 = NEW ARRAY(0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x2200,0x8020000,0x82220000,0x20000,0x22222222000,00022000x2200,000x220000,000x220000,000220000,00020220000,000
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,0420,0x200000000,0x2000400,0x20020020020,0x2000420);
PC2BYTES6 = NEW ARRAY(0,0x10000000,0x80000,0x100800,0x2,0x10000002,0x80002,0x10080002,0,0x1000000,000,0x80000,0x100800,0x2,0x1000000002,0x80002,02,02,0100002);
PC2BYTES7 =新しい配列(0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000,0x20010800,0x200,0x30000,0x20800,0x30800、0x2000000000000,0x20030000,000800,000800,000800,000800
PC2Bytes8 = new Array(0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x20000,0x2040000,0x2000002,0x2040002,0x20000002,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,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x10202020,20,0x102000,0002020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020);
PC2BYTES11 = New Array(0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x50000000000,0x4000200,0x5000200,000000000000000000000000000,0020000200200200,000000000000,0000000000000020000200200
pc2bytes12 = new Array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010);
PC2BYTES13 =新しい配列(0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105);
//何回のイテレーション(1つは1、トリプルデスの場合は3)
var iterations = key.length> 8? 3:1; // Paul 16/6/2007によって変更されて、9+バイトキーにトリプルDESを使用します
//返品キーを保存します
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 ++){// 1または3 iterations
左=(key.charcodeat(m ++)<< 24)| (key.charcodeat(m ++)<< 16)| (key.charcodeat(m ++)<< 8)| key.charcodeat(m ++);
右=(key.charcodeat(m ++)<< 24)| (key.charcodeat(m ++)<< 16)| (key.charcodeat(m ++)<< 8)| key.charcodeat(m ++);
temp =((左>>> 4) ^右)&0x0f0f0f0f;右 ^= temp;左 ^=(temp << 4);
temp =((右>>> -16) ^左)&0x0000ffff;左 ^=温度;右 ^=(temp << -16);
temp =((左>>> 2) ^右)&0x33333333;右 ^= temp;左 ^=(temp << 2);
temp =((右>>> -16) ^左)&0x0000ffff;左 ^=温度;右 ^=(temp << -16);
temp =((左>>> 1) ^右)&0x55555555;右 ^= temp;左 ^=(temp << 1);
temp =((右>>> 8) ^左)&0x00ff00ff;左 ^=温度;右 ^=(temp << 8);
temp =((左>>> 1) ^右)&0x55555555;右 ^= temp;左 ^=(temp << 1);
//右側をシフトし、左側の最後の4ビットを取得する必要があります
temp =(左<< 8)| ((右>>> 20)&0x000000F0);
//左に逆さまにする必要があります
左=(右<< 24)| ((右<< 8)&0xff0000)| ((右>>> 8)&0xff00)| ((右>>> 24)&0xf0);
右=温度;
//次に、左右のキーでこれらのシフトを実行して実行します
for(var i = 0; i <shifts.length; i ++){
//キーを1つまたは2ビットの左にシフトします
if(shifts [i]){left =(left< 2)| (左>>> 26);右=(右<< 2)| (右>>> 26);}
else {left =(left << 1)| (左>>> 27);右=(右<< 1)| (右>>> 27);}
左&= -0xf;右&= -0xf;
//ここで、PC-2を適用します。暗号化または復号化するときにEが簡単になるようにEが簡単になります
//この変換は、各バイトの最後の6ビットのみが使用されることを除いて、PC-2のように見えます
// 48の連続したビットではなく、ラインの順序は次のとおりです
// S選択機能の適用方法:S2、S4、S6、S8、S1、S3、S5、S7
lefttemp = pc2bytes0 [左>>> 28] | pc2bytes1 [(左>>> 24)&0xf]
| pc2bytes2 [(左>>> 20)&0xf] | pc2bytes3 [(左>>> 16)&0xf]
| pc2bytes4 [(左>>> 12)&0xf] | pc2bytes5 [(左>>> 8)&0xf]
| pc2bytes6 [(左>>> 4)&0xf];
righttemp = pc2bytes7 [右>>> 28] | pc2bytes8 [(右>>> 24)&0xf]
| pc2bytes9 [(右>>> 20)&0xf] | pc2bytes10 [(右>>> 16)&0xf]
| pc2bytes11 [(右>>> 12)&0xf] | pc2bytes12 [(右>>> 8)&0xf]
| pc2bytes13 [(右>>> 4)&0xf];
temp =((righttemp >>> 16) ^ lefttemp)&0x0000ffff;
keys [n ++] = lefttemp ^ temp; keys [n ++] = righttemp ^(temp << 16);
}
} //各反復について
//作成したキーを返します
キーを返します。
} // des_createkeysの終わり
////////////////////////////// テスト /////////////////// /////////
関数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];}
rを返します。
}
関数hextostring(h){
var r = "";
for(var i =(h.substr(0、2)== "0x")?2:0; i <h.length; i += 2){r += string.fromCharcode(parseint(h.substr(i) 、2)、16));}
rを返します。
}
var key = "これは24バイトキーです!!";
var message = "これはテストメッセージです";
var ciphertext = des(key、message、1、0);
document.writeln( "des test:" + stringtohex(ciphertext));