JS实现的base64加密、md5加密及sha1加密详解
本文实例讲述了JS实现的base64加密、md5加密及sha1加密。分享给大家供大家参考,具体如下:
1、base64加密
在页面中引入base64.js文件,调用方法为:
<!DOCTYPEHTML>
<html>
<head>
<metacharset="utf-8">
<title>base64加密</title>
<scripttype="text/javascript"src="base64.js"></script>
<scripttype="text/javascript">
varb=newBase64();
varstr=b.encode("admin:admin");
alert("base64encode:"+str);
//解密
str=b.decode(str);
alert("base64decode:"+str);
</script>
</head>
<body>
</body>
</html>
2、md5加密
在页面中引用md5.js文件,调用方法为
<!DOCTYPEHTML>
<html>
<head>
<metacharset="utf-8">
<title>md5加密</title>
<scripttype="text/ecmascript"src="md5.js"></script>
<scripttype="text/javascript">
varhash=hex_md5("123dafd");
alert(hash)
</script>
</head>
<body>
</body>
</html>
3、sha1加密
据说这是最安全的加密
页面中引入sha1.js,调用方法为
<!DOCTYPEHTML>
<html>
<head>
<metacharset="utf-8">
<title>sha1加密</title>
<scripttype="text/ecmascript"src="sha1.js"></script>
<scripttype="text/javascript">
varsha=hex_sha1('mima123465')
alert(sha)
</script>
</head>
<body>
</body>
</html>
一下为js们的源代码
base64.js:
/**
*
*Base64encode/decode
*
*@authorhaitao.tu
*@date2010-04-26
*@emailtuhaitao@foxmail.com
*
*/
functionBase64(){
//privateproperty
_keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
//publicmethodforencoding
this.encode=function(input){
varoutput="";
varchr1,chr2,chr3,enc1,enc2,enc3,enc4;
vari=0;
input=_utf8_encode(input);
while(i<input.length){
chr1=input.charCodeAt(i++);
chr2=input.charCodeAt(i++);
chr3=input.charCodeAt(i++);
enc1=chr1>>2;
enc2=((chr1&3)<<4)|(chr2>>4);
enc3=((chr2&15)<<2)|(chr3>>6);
enc4=chr3&63;
if(isNaN(chr2)){
enc3=enc4=64;
}elseif(isNaN(chr3)){
enc4=64;
}
output=output+
_keyStr.charAt(enc1)+_keyStr.charAt(enc2)+
_keyStr.charAt(enc3)+_keyStr.charAt(enc4);
}
returnoutput;
}
//publicmethodfordecoding
this.decode=function(input){
varoutput="";
varchr1,chr2,chr3;
varenc1,enc2,enc3,enc4;
vari=0;
input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");
while(i<input.length){
enc1=_keyStr.indexOf(input.charAt(i++));
enc2=_keyStr.indexOf(input.charAt(i++));
enc3=_keyStr.indexOf(input.charAt(i++));
enc4=_keyStr.indexOf(input.charAt(i++));
chr1=(enc1<<2)|(enc2>>4);
chr2=((enc2&15)<<4)|(enc3>>2);
chr3=((enc3&3)<<6)|enc4;
output=output+String.fromCharCode(chr1);
if(enc3!=64){
output=output+String.fromCharCode(chr2);
}
if(enc4!=64){
output=output+String.fromCharCode(chr3);
}
}
output=_utf8_decode(output);
returnoutput;
}
//privatemethodforUTF-8encoding
_utf8_encode=function(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;
}
//privatemethodforUTF-8decoding
_utf8_decode=function(utftext){
varstring="";
vari=0;
varc=c1=c2=0;
while(i<utftext.length){
c=utftext.charCodeAt(i);
if(c<128){
string+=String.fromCharCode(c);
i++;
}elseif((c>191)&&(c<224)){
c2=utftext.charCodeAt(i+1);
string+=String.fromCharCode(((c&31)<<6)|(c2&63));
i+=2;
}else{
c2=utftext.charCodeAt(i+1);
c3=utftext.charCodeAt(i+2);
string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));
i+=3;
}
}
returnstring;
}
}
MD5.js:
/*
*AJavaScriptimplementationoftheRSADataSecurity,Inc.MD5Message
*DigestAlgorithm,asdefinedinRFC1321.
*Version2.1Copyright(C)PaulJohnston1999-2002.
*Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet
*DistributedundertheBSDLicense
*Seehttp://pajhome.org.uk/crypt/md5formoreinfo.
*/
/*
*Configurablevariables.Youmayneedtotweakthesetobecompatiblewith
*theserver-side,butthedefaultsworkinmostcases.
*/
varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/
varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/
varchrsz=8;/*bitsperinputcharacter.8-ASCII;16-Unicode*/
/*
*Thesearethefunctionsyou'llusuallywanttocall
*Theytakestringargumentsandreturneitherhexorbase-64encodedstrings
*/
functionhex_md5(s){returnbinl2hex(core_md5(str2binl(s),s.length*chrsz));}
functionb64_md5(s){returnbinl2b64(core_md5(str2binl(s),s.length*chrsz));}
functionstr_md5(s){returnbinl2str(core_md5(str2binl(s),s.length*chrsz));}
functionhex_hmac_md5(key,data){returnbinl2hex(core_hmac_md5(key,data));}
functionb64_hmac_md5(key,data){returnbinl2b64(core_hmac_md5(key,data));}
functionstr_hmac_md5(key,data){returnbinl2str(core_hmac_md5(key,data));}
/*
*Performasimpleself-testtoseeiftheVMisworking
*/
functionmd5_vm_test()
{
returnhex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72";
}
/*
*CalculatetheMD5ofanarrayoflittle-endianwords,andabitlength
*/
functioncore_md5(x,len)
{
/*appendpadding*/
x[len>>5]|=0x80<<((len)%32);
x[(((len+64)>>>9)<<4)+14]=len;
vara=1732584193;
varb=-271733879;
varc=-1732584194;
vard=271733878;
for(vari=0;i<x.length;i+=16)
{
varolda=a;
varoldb=b;
varoldc=c;
varoldd=d;
a=md5_ff(a,b,c,d,x[i+0],7,-680876936);
d=md5_ff(d,a,b,c,x[i+1],12,-389564586);
c=md5_ff(c,d,a,b,x[i+2],17,606105819);
b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);
a=md5_ff(a,b,c,d,x[i+4],7,-176418897);
d=md5_ff(d,a,b,c,x[i+5],12,1200080426);
c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);
b=md5_ff(b,c,d,a,x[i+7],22,-45705983);
a=md5_ff(a,b,c,d,x[i+8],7,1770035416);
d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);
c=md5_ff(c,d,a,b,x[i+10],17,-42063);
b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);
a=md5_ff(a,b,c,d,x[i+12],7,1804603682);
d=md5_ff(d,a,b,c,x[i+13],12,-40341101);
c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);
b=md5_ff(b,c,d,a,x[i+15],22,1236535329);
a=md5_gg(a,b,c,d,x[i+1],5,-165796510);
d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);
c=md5_gg(c,d,a,b,x[i+11],14,643717713);
b=md5_gg(b,c,d,a,x[i+0],20,-373897302);
a=md5_gg(a,b,c,d,x[i+5],5,-701558691);
d=md5_gg(d,a,b,c,x[i+10],9,38016083);
c=md5_gg(c,d,a,b,x[i+15],14,-660478335);
b=md5_gg(b,c,d,a,x[i+4],20,-405537848);
a=md5_gg(a,b,c,d,x[i+9],5,568446438);
d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);
c=md5_gg(c,d,a,b,x[i+3],14,-187363961);
b=md5_gg(b,c,d,a,x[i+8],20,1163531501);
a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);
d=md5_gg(d,a,b,c,x[i+2],9,-51403784);
c=md5_gg(c,d,a,b,x[i+7],14,1735328473);
b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);
a=md5_hh(a,b,c,d,x[i+5],4,-378558);
d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);
c=md5_hh(c,d,a,b,x[i+11],16,1839030562);
b=md5_hh(b,c,d,a,x[i+14],23,-35309556);
a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);
d=md5_hh(d,a,b,c,x[i+4],11,1272893353);
c=md5_hh(c,d,a,b,x[i+7],16,-155497632);
b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);
a=md5_hh(a,b,c,d,x[i+13],4,681279174);
d=md5_hh(d,a,b,c,x[i+0],11,-358537222);
c=md5_hh(c,d,a,b,x[i+3],16,-722521979);
b=md5_hh(b,c,d,a,x[i+6],23,76029189);
a=md5_hh(a,b,c,d,x[i+9],4,-640364487);
d=md5_hh(d,a,b,c,x[i+12],11,-421815835);
c=md5_hh(c,d,a,b,x[i+15],16,530742520);
b=md5_hh(b,c,d,a,x[i+2],23,-995338651);
a=md5_ii(a,b,c,d,x[i+0],6,-198630844);
d=md5_ii(d,a,b,c,x[i+7],10,1126891415);
c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);
b=md5_ii(b,c,d,a,x[i+5],21,-57434055);
a=md5_ii(a,b,c,d,x[i+12],6,1700485571);
d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);
c=md5_ii(c,d,a,b,x[i+10],15,-1051523);
b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);
a=md5_ii(a,b,c,d,x[i+8],6,1873313359);
d=md5_ii(d,a,b,c,x[i+15],10,-30611744);
c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);
b=md5_ii(b,c,d,a,x[i+13],21,1309151649);
a=md5_ii(a,b,c,d,x[i+4],6,-145523070);
d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);
c=md5_ii(c,d,a,b,x[i+2],15,718787259);
b=md5_ii(b,c,d,a,x[i+9],21,-343485551);
a=safe_add(a,olda);
b=safe_add(b,oldb);
c=safe_add(c,oldc);
d=safe_add(d,oldd);
}
returnArray(a,b,c,d);
}
/*
*Thesefunctionsimplementthefourbasicoperationsthealgorithmuses.
*/
functionmd5_cmn(q,a,b,x,s,t)
{
returnsafe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);
}
functionmd5_ff(a,b,c,d,x,s,t)
{
returnmd5_cmn((b&c)|((~b)&d),a,b,x,s,t);
}
functionmd5_gg(a,b,c,d,x,s,t)
{
returnmd5_cmn((b&d)|(c&(~d)),a,b,x,s,t);
}
functionmd5_hh(a,b,c,d,x,s,t)
{
returnmd5_cmn(b^c^d,a,b,x,s,t);
}
functionmd5_ii(a,b,c,d,x,s,t)
{
returnmd5_cmn(c^(b|(~d)),a,b,x,s,t);
}
/*
*CalculatetheHMAC-MD5,ofakeyandsomedata
*/
functioncore_hmac_md5(key,data)
{
varbkey=str2binl(key);
if(bkey.length>16)bkey=core_md5(bkey,key.length*chrsz);
varipad=Array(16),opad=Array(16);
for(vari=0;i<16;i++)
{
ipad[i]=bkey[i]^0x36363636;
opad[i]=bkey[i]^0x5C5C5C5C;
}
varhash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);
returncore_md5(opad.concat(hash),512+128);
}
/*
*Addintegers,wrappingat2^32.Thisuses16-bitoperationsinternally
*toworkaroundbugsinsomeJSinterpreters.
*/
functionsafe_add(x,y)
{
varlsw=(x&0xFFFF)+(y&0xFFFF);
varmsw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
}
/*
*Bitwiserotatea32-bitnumbertotheleft.
*/
functionbit_rol(num,cnt)
{
return(num<<cnt)|(num>>>(32-cnt));
}
/*
*Convertastringtoanarrayoflittle-endianwords
*IfchrszisASCII,characters>255havetheirhi-bytesilentlyignored.
*/
functionstr2binl(str)
{
varbin=Array();
varmask=(1<<chrsz)-1;
for(vari=0;i<str.length*chrsz;i+=chrsz)
bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);
returnbin;
}
/*
*Convertanarrayoflittle-endianwordstoastring
*/
functionbinl2str(bin)
{
varstr="";
varmask=(1<<chrsz)-1;
for(vari=0;i<bin.length*32;i+=chrsz)
str+=String.fromCharCode((bin[i>>5]>>>(i%32))&mask);
returnstr;
}
/*
*Convertanarrayoflittle-endianwordstoahexstring.
*/
functionbinl2hex(binarray)
{
varhex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";
varstr="";
for(vari=0;i<binarray.length*4;i++)
{
str+=hex_tab.charAt((binarray[i>>2]>>((i%4)*8+4))&0xF)+
hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF);
}
returnstr;
}
/*
*Convertanarrayoflittle-endianwordstoabase-64string
*/
functionbinl2b64(binarray)
{
vartab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
varstr="";
for(vari=0;i<binarray.length*4;i+=3)
{
vartriplet=(((binarray[i>>2]>>8*(i%4))&0xFF)<<16)
|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)
|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);
for(varj=0;j<4;j++)
{
if(i*8+j*6>binarray.length*32)str+=b64pad;
elsestr+=tab.charAt((triplet>>6*(3-j))&0x3F);
}
}
returnstr;
}
sha1.js:
/*
*AJavaScriptimplementationoftheSecureHashAlgorithm,SHA-1,asdefined
*inFIPSPUB180-1
*Version2.1-BETACopyrightPaulJohnston2000-2002.
*Othercontributors:GregHolt,AndrewKepert,Ydnar,Lostinet
*DistributedundertheBSDLicense
*Seehttp://pajhome.org.uk/crypt/md5fordetails.
*/
/*
*Configurablevariables.Youmayneedtotweakthesetobecompatiblewith
*theserver-side,butthedefaultsworkinmostcases.
*/
varhexcase=0;/*hexoutputformat.0-lowercase;1-uppercase*/
varb64pad="";/*base-64padcharacter."="forstrictRFCcompliance*/
varchrsz=8;/*bitsperinputcharacter.8-ASCII;16-Unicode*/
/*
*Thesearethefunctionsyou'llusuallywanttocall
*Theytakestringargumentsandreturneitherhexorbase-64encodedstrings
*/
functionhex_sha1(s){
returnbinb2hex(core_sha1(str2binb(s),s.length*chrsz));
}
functionb64_sha1(s){
returnbinb2b64(core_sha1(str2binb(s),s.length*chrsz));
}
functionstr_sha1(s){
returnbinb2str(core_sha1(str2binb(s),s.length*chrsz));
}
functionhex_hmac_sha1(key,data){
returnbinb2hex(core_hmac_sha1(key,data));
}
functionb64_hmac_sha1(key,data){
returnbinb2b64(core_hmac_sha1(key,data));
}
functionstr_hmac_sha1(key,data){
returnbinb2str(core_hmac_sha1(key,data));
}
/*
*Performasimpleself-testtoseeiftheVMisworking
*/
functionsha1_vm_test(){
returnhex_sha1("abc")=="a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
*CalculatetheSHA-1ofanarrayofbig-endianwords,andabitlength
*/
functioncore_sha1(x,len){
/*appendpadding*/
x[len>>5]|=0x80<<(24-len%32);
x[((len+64>>9)<<4)+15]=len;
varw=Array(80);
vara=1732584193;
varb=-271733879;
varc=-1732584194;
vard=271733878;
vare=-1009589776;
for(vari=0;i<x.length;i+=16){
varolda=a;
varoldb=b;
varoldc=c;
varoldd=d;
varolde=e;
for(varj=0;j<80;j++){
if(j<16)w[j]=x[i+j];
elsew[j]=rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);
vart=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);
}
returnArray(a,b,c,d,e);
}
/*
*Performtheappropriatetripletcombinationfunctionforthecurrent
*iteration
*/
functionsha1_ft(t,b,c,d){
if(t<20)return(b&c)|((~b)&d);
if(t<40)returnb^c^d;
if(t<60)return(b&c)|(b&d)|(c&d);
returnb^c^d;
}
/*
*Determinetheappropriateadditiveconstantforthecurrentiteration
*/
functionsha1_kt(t){
return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514;
}
/*
*CalculatetheHMAC-SHA1ofakeyandsomedata
*/
functioncore_hmac_sha1(key,data){
varbkey=str2binb(key);
if(bkey.length>16)bkey=core_sha1(bkey,key.length*chrsz);
varipad=Array(16),
opad=Array(16);
for(vari=0;i<16;i++){
ipad[i]=bkey[i]^0x36363636;
opad[i]=bkey[i]^0x5C5C5C5C;
}
varhash=core_sha1(ipad.concat(str2binb(data)),512+data.length*chrsz);
returncore_sha1(opad.concat(hash),512+160);
}
/*
*Addintegers,wrappingat2^32.Thisuses16-bitoperationsinternally
*toworkaroundbugsinsomeJSinterpreters.
*/
functionsafe_add(x,y){
varlsw=(x&0xFFFF)+(y&0xFFFF);
varmsw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
}
/*
*Bitwiserotatea32-bitnumbertotheleft.
*/
functionrol(num,cnt){
return(num<<cnt)|(num>>>(32-cnt));
}
/*
*Convertan8-bitor16-bitstringtoanarrayofbig-endianwords
*In8-bitfunction,characters>255havetheirhi-bytesilentlyignored.
*/
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;
}
/*
*Convertanarrayofbig-endianwordstoastring
*/
functionbinb2str(bin){
varstr="";
varmask=(1<<chrsz)-1;
for(vari=0;i<bin.length*32;i+=chrsz)
str+=String.fromCharCode((bin[i>>5]>>>(24-i%32))&mask);
returnstr;
}
/*
*Convertanarrayofbig-endianwordstoahexstring.
*/
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;
}
/*
*Convertanarrayofbig-endianwordstoabase-64string
*/
functionbinb2b64(binarray){
vartab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
varstr="";
for(vari=0;i<binarray.length*4;i+=3){
vartriplet=(((binarray[i>>2]>>8*(3-i%4))&0xFF)<<16)|(((binarray[i+1>>2]>>8*(3-(i+1)%4))&0xFF)<<8)|((binarray[i+2>>2]>>8*(3-(i+2)%4))&0xFF);
for(varj=0;j<4;j++){
if(i*8+j*6>binarray.length*32)str+=b64pad;
elsestr+=tab.charAt((triplet>>6*(3-j))&0x3F);
}
}
returnstr;
}
对于JavaScript加密感兴趣的朋友还可以参看本站在线工具:
MD5在线加密工具
Escape加密/解密工具
在线SHA1加密工具
迅雷、快车、旋风URL加密/解密工具
密码安全性在线检测
高强度密码生成器
更多关于JavaScript相关内容可查看本站专题:《JavaScript加密解密技巧汇总》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。