用Javascript实现SHA-1加密算法的方法
调用方法:hex_sha1。
将代码复制如下:
*
*一个安全散列alrithm,SHA-1的Javascript实现,定义
*在FIPS PUB 180-1
*
* lizq
*
* 2006-11-11
*
* /
*
*
*可配置变量。
*
* /
无功hexcase = 0; / *进制输出格式。0 -小写;1 -大写。
无功chrsz = 8;每输入字符 / *位。8 - ASCII码;16 - Unicode。
*
*
*计算消息摘要的主要功能
*
* /
功能hex_sha1(s){
返回binb2hex(core_sha1(alignsha1(S)));
}
*
*
*执行简单的自检,看看VM是否正常工作。
*
* /
功能sha1_vm_test(){
返回hex_sha1(ABC)= =a9993e364706816aba3e25717850c26c9cd0d89d ;
}
*
*
*计算大端字数组SHA-1,和一点
*
* /
功能core_sha1(blockarray){
var x = blockarray; / /添加填充
数组(80);
var a=1732584193;
var = 271733879;
var = 1732584194;
var=271733878;
var = 1009589776;
对于(var i = 0;i < x.length;i = 16) / /每512 16 * 32
{
VaR OLDA =一;
VaR现代化= B;
无功oldc = C;
无功氧化物轻掺杂漏衬垫结构= D;
VaR Olde = E;
对于每个512位80步(var = 0;j < 80);
{
如果(j<16)
w J = { i + j };
其他的
W { } =作用{J}.(W { 3 } ^ J W { 8 },{ 14 } ^ W J ^ W { 16 } J,1);
var t = safe_add(safe_add(ROL(一,5),sha1_ft(J,B,C,D));
e=d;
D = C;
C =控制(B,30);
乙=;
甲;
}
a safe_add(一处);
B = safe_add(B,奥尔登堡);
C = safe_add(C,oldc);
a safe_add(D,氧化物轻掺杂漏衬垫结构);
E = safe_add(E,奥尔德);
}
返回新数组(A,B,C,D,E);
}
*
*
*为当前执行适当的三重组合函数。
*迭代
*
*返回相应f函数的值。
*
* /
功能sha1_ft(T,B,C,D){
如果(t<20)
返回(B C)|((~ B)D);
如果(t<40)
返回;
如果(t<60)
返回(B C)|(B D)|(C D);
还可以返回80。
}
*
*
*确定当前迭代的适当相加常数
*
*返回相应的KT值。
*
* /
功能sha1_kt(T){
返回(t<20)1518500249:(t<40)1859775393:(t<60)- 1894007588:- 899497514;
}
*
*
*添加整数,包装在2×32。这在内部使用16位操作。
*
*在一些JS解释器中处理bug。
*
*将32位数字分别添加到高位16位和低16位,以便添加mod 2 - 32实现。
*
* /
功能safe_add(x,y){
VaR模型=(X 0xFFFF)+(Y 0xFFFF);
VaR垃圾=(x > 16)+(y > > 16)+(LSW > > 16);
返回(MSW<16)|(LSW 0xFFFF);
}
*
*
* Bitwise旋转一个32位数字的左边。
*
* 32位二进制数循环左移位
*
* /
功能作用(num,CNT){
返回(数字>(32 - CNT));
}
*
*
*标准SHA1需要输入的字符串插入块
*
*此函数对齐输入字符串以满足需求。
*
* /
功能alignsha1(STR){
无功nblk =((str.length + 8)> > 6)+ 1,盖帽=新的数组(nblk×16);
对于(var i = 0;i < nblk×16;i++)
盖帽{我} = 0;
为(i = 0;i < str.length;i++)
{ 2 } str.charcodeat盖帽(我)| =(24 -(3)* 8);
2次盖帽{我}0x80 | =(24 -(3)* 8);
盖帽{ nblk * 16 - 1 * 8 = str.length };
返回BLKS;
}
*
*
*将大端字数组一进制字符串。
*
* /
功能binb2hex(binarray){
无功hex_tab = hexcase0123456789abcdef 0123456789abcdef ;
var;
对于(var i = 0;i < binarray.length×4;i++){
(str = hex_tab.charat(binarray { 2 }我> > > >((3 - 4我%)* 8 + 4))+ 0xf)
hex_tab.charat((binarray { 2 }我> > >)((3 - % 4)* 8))0xf));
}
返回字符;
}
*
*
*计算消息摘要根据源信息,输入
*
* /
功能calcdigest(){
无功digestm = hex_sha1(文档。shaform。信源。值);
document.shaform.messagedigest.value = digestm;
}
希望本文能对大家的javascript程序设计有所帮助。