Javascript实现的SHA-256加密算法完整实例
本文实例讲述了Javascript实现的SHA-256算法。分享给大家供大家参考,具体如下:
/**
*
*SecureHashAlgorithm(SHA256)
*http://www.webtoolkit.info/
*
*OriginalcodebyAngelMarin,PaulJohnston.
*
**/
functionSHA256(s){
varchrsz=8;
varhexcase=0;
functionsafe_add(x,y){
varlsw=(x&0xFFFF)+(y&0xFFFF);
varmsw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
}
functionS(X,n){return(X>>>n)|(X<<(32-n));}
functionR(X,n){return(X>>>n);}
functionCh(x,y,z){return((x&y)^((~x)&z));}
functionMaj(x,y,z){return((x&y)^(x&z)^(y&z));}
functionSigma0256(x){return(S(x,2)^S(x,13)^S(x,22));}
functionSigma1256(x){return(S(x,6)^S(x,11)^S(x,25));}
functionGamma0256(x){return(S(x,7)^S(x,18)^R(x,3));}
functionGamma1256(x){return(S(x,17)^S(x,19)^R(x,10));}
functioncore_sha256(m,l){
varK=newArray(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
varHASH=newArray(0x6A09E667,0xBB67AE85,0x3C6EF372,0xA54FF53A,0x510E527F,0x9B05688C,0x1F83D9AB,0x5BE0CD19);
varW=newArray(64);
vara,b,c,d,e,f,g,h,i,j;
varT1,T2;
m[l>>5]|=0x80<<(24-l%32);
m[((l+64>>9)<<4)+15]=l;
for(vari=0;i<m.length;i+=16){
a=HASH[0];
b=HASH[1];
c=HASH[2];
d=HASH[3];
e=HASH[4];
f=HASH[5];
g=HASH[6];
h=HASH[7];
for(varj=0;j<64;j++){
if(j<16)W[j]=m[j+i];
elseW[j]=safe_add(safe_add(safe_add(Gamma1256(W[j-2]),W[j-7]),Gamma0256(W[j-15])),W[j-16]);
T1=safe_add(safe_add(safe_add(safe_add(h,Sigma1256(e)),Ch(e,f,g)),K[j]),W[j]);
T2=safe_add(Sigma0256(a),Maj(a,b,c));
h=g;
g=f;
f=e;
e=safe_add(d,T1);
d=c;
c=b;
b=a;
a=safe_add(T1,T2);
}
HASH[0]=safe_add(a,HASH[0]);
HASH[1]=safe_add(b,HASH[1]);
HASH[2]=safe_add(c,HASH[2]);
HASH[3]=safe_add(d,HASH[3]);
HASH[4]=safe_add(e,HASH[4]);
HASH[5]=safe_add(f,HASH[5]);
HASH[6]=safe_add(g,HASH[6]);
HASH[7]=safe_add(h,HASH[7]);
}
returnHASH;
}
functionstr2binb(str){
varbin=Array();
varmask=(1<<chrsz)-1;
for(vari=0;i<str.length*chrsz;i+=chrsz){
bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(24-i%32);
}
returnbin;
}
functionUtf8Encode(string){
string=string.replace(/\r\n/g,"\n");
varutftext="";
for(varn=0;n<string.length;n++){
varc=string.charCodeAt(n);
if(c<128){
utftext+=String.fromCharCode(c);
}
elseif((c>127)&&(c<2048)){
utftext+=String.fromCharCode((c>>6)|192);
utftext+=String.fromCharCode((c&63)|128);
}
else{
utftext+=String.fromCharCode((c>>12)|224);
utftext+=String.fromCharCode(((c>>6)&63)|128);
utftext+=String.fromCharCode((c&63)|128);
}
}
returnutftext;
}
functionbinb2hex(binarray){
varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";
varstr="";
for(vari=0;i<binarray.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);
}
returnstr;
}
s=Utf8Encode(s);
returnbinb2hex(core_sha256(str2binb(s),s.length*chrsz));
}
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。