用Javascript实现SHA-1加密算法的方法

本文介绍一种用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程序设计有所帮助。