この記事では、JavaScriptにSHA-1暗号化アルゴリズムを実装する方法について説明します。参照のためにそれを共有してください。特定の実装方法は次のとおりです。
コールメソッド:hex_sha1。
次のようにコードをコピーします:/*
*
*定義されているように、安全なハッシュアルゴリズムSHA-1のJavaScriptの実装
* FIPS Pub 180-1
*
* lizqによる
*
* 2006-11-11
*
*/
/*
*
*構成可能な変数。
*
*/
var hexcase = 0; /* hex出力形式。 0-小文字; 1-大文字 */
var chrsz = 8; /*入力文字ごとにビット。 8 -ASCII; 16 -Unicode */
/*
*
*メッセージダイジェストを計算する主な関数
*
*/
関数hex_sha1(s){
return binb2hex(core_sha1(alignsha1(s)));
}
/*
*
*簡単なセルフテストを実行して、VMが機能しているかどうかを確認します
*
*/
関数sha1_vm_test(){
return hex_sha1( "abc")== "a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
*
*ビッグエンディアンの単語の配列のSHA-1を計算し、少し長さを計算します
*
*/
function core_sha1(blockArray){
var x = blockArray; //パディングを追加します
var w = array(80);
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
var E = -1009589776;
for(var i = 0; i <x.length; i += 16)// 512-bit 16*32毎回処理
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;
for(var j = 0; j <80; j ++)// 512ビットごとに80ステップを実行します
{
if(j <16)
w [j] = x [i + j];
それ以外
w [j] = rol(w [j -3] ^ w [j -8] ^ w [j -14] ^ w [j -16]、1);
var t = safe_add(safe_add(rol(a、5)、sha1_ft(j、b、c、d))、safe_add(safe_add(e、w [j])、sha1_kt(j)));
E = D;
d = c;
c = rol(b、30);
b = a;
a = t;
}
a = safe_add(a、olda);
b = safe_add(b、oldb);
c = safe_add(c、oldc);
d = safe_add(d、oldd);
e = safe_add(e、olde);
}
新しい配列(a、b、c、d、e)を返します。
}
/*
*
*電流の適切なトリプレットの組み合わせ関数を実行する
*反復
*
*対応するf関数の値を返します
*
*/
関数sha1_ft(t、b、c、d){
if(t <20)
return(B&C)| ((〜b)&d);
if(t <40)
b ^ c ^ dを返します。
if(t <60)
return(B&C)| (B&D)| (CD);
b ^ c ^ dを返します。 // t <80
}
/*
*
*現在の反復に適切な追加定数を決定する
*
*対応するKT値を返します
*
*/
関数sha1_kt(t){
return(t <20)? 1518500249:(t <40)? 1859775393 :( t <60)? -1894007588:-899497514;
}
/*
*
*整数を追加し、2^32でラッピングします。これは、内部で16ビット操作を使用します
*
*いくつかのJS通訳者のバグを回避する。
*
* 32ビット数を追加のためにそれぞれ上部16ビットと下部16ビットに分割し、それによってmod 2^32の添加を実現します
*
*/
function safe_add(x、y){
var lsw =(x&0xffff) +(y&0xfff);
var msw =(x >> 16) +(y >> 16) +(lsw >> 16);
return(msw << 16)| (LSW&0xffff);
}
/*
*
*ビットワイズ32ビット番号を左に回転させます。
*
* 32ビットバイナリ番号ループ左シフト
*
*/
function rol(num、cnt){
return(num << cnt)| (num >>>(32 -cnt));
}
/*
*
*標準のSHA1には、ブロックに収まる入力文字列が必要です
*
*この関数は、入力文字列を調整して要件を満たす
*
*/
関数alignsha1(str){
var nblk =((str.length + 8)>> 6) + 1、blks = new Array(nblk * 16);
for(var i = 0; i <nblk * 16; i ++)
blks [i] = 0;
for(i = 0; i <str.length; i ++)
blks [i >> 2] | = str.charcodeat(i)<<(24-(i&3) * 8);
blks [i >> 2] | = 0x80 <<(24-(i&3) * 8);
blks [nblk * 16-1] = str.length * 8;
blksを返します。
}
/*
*
*エンディアンの単語の配列を16進ストリングに変換します。
*
*/
関数binb2hex(binarray){
var hex_tab = hexcase? "0123456789ABCDEF": "0123456789ABCDEF";
var str = "";
for(var i = 0; i <binary.length * 4; i ++){
str + = hex_tab.charat((binarray [i >> 2] >>((3 -i%4) * 8 + 4)&0xf) +
hex_tab.charat((binarray [i >> 2] >>((3 -i%4) * 8))&0xf);
}
strを返します。
}
/*
*
*入力されたソースメッセージに従ってMESSAGEDGESTを計算します
*
*/
関数calcdigest(){
var digestm = hex_sha1(document.shaform.sourcemessage.value);
document.shaform.messagedigest.value = digestm;
}
この記事がみんなのJavaScriptプログラミングに役立つことを願っています。