Welcome 微信登录

首页 / 脚本样式 / JavaScript / Javascript SHA-1:Secure Hash Algorithm

From:http://pajhome.org.uk/crypt/md5/sha1src.html
/* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. *//* * Configurable variables. You may need to tweak these to be compatible with * the server-side, but the defaults work in most cases. */var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase*/var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance*/var chrsz= 8; /* bits per input character. 8 - ASCII; 16 - Unicode *//* * These are the functions you"ll usually want to call * They take string arguments and return either hex or base-64 encoded strings */function hex_sha1s{return binb2hexcore_sha1str2binbs,s.length * chrsz;}function b64_sha1s{return binb2b64core_sha1str2binbs,s.length * chrsz;}function str_sha1s{return binb2strcore_sha1str2binbs,s.length * chrsz;}function hex_hmac_sha1key, data{ return binb2hexcore_hmac_sha1key, data;}function b64_hmac_sha1key, data{ return binb2b64core_hmac_sha1key, data;}function str_hmac_sha1key, data{ return binb2strcore_hmac_sha1key, data;}/* * Perform a simple self-test to see if the VM is working */function sha1_vm_test{ return hex_sha1"abc" == "a9993e364706816aba3e25717850c26c9cd0d89d";}/* * Calculate the SHA-1 of an array of big-endian words, and a bit length */function core_sha1x, len{ /* append padding */ x[len >> 5] |= 0x80 << 24 - len % 32; x[len + 64 >> 9 << 4 + 15] = len; var w = Array80; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; forvar i = 0; i < x.length; i += 16 {var olda = a;var oldb = b;var oldc = c;var oldd = d;var olde = e;forvar j = 0; j < 80; j++{ ifj < 16 w[j] = x[i + j]; else w[j] = rolw[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1; var t = safe_addsafe_addrola, 5, sha1_ftj, b, c, d,safe_addsafe_adde, w[j], sha1_ktj; e = d; d = c; c = rolb, 30; b = a; a = t;}a = safe_adda, olda;b = safe_addb, oldb;c = safe_addc, oldc;d = safe_addd, oldd;e = safe_adde, olde; } return Arraya, b, c, d, e;}/* * Perform the appropriate triplet combination function for the current * iteration */function sha1_ftt, b, c, d{ ift < 20 return b & c | ~b & d; ift < 40 return b ^ c ^ d; ift < 60 return b & c | b & d | c & d; return b ^ c ^ d;}/* * Determine the appropriate additive constant for the current iteration */function sha1_ktt{ return t < 201518500249 : t < 401859775393 : t < 60 ? -1894007588 : -899497514;}/* * Calculate the HMAC-SHA1 of a key and some data */function core_hmac_sha1key, data{ var bkey = str2binbkey; ifbkey.length > 16 bkey = core_sha1bkey, key.length * chrsz; var ipad = Array16, opad = Array16; forvar i = 0; i < 16; i++ {ipad[i] = bkey[i] ^ 0x36363636;opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_sha1ipad.concatstr2binbdata, 512 + data.length * chrsz; return core_sha1opad.concathash, 512 + 160;}/* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */function safe_addx, y{ var lsw = x & 0xFFFF + y & 0xFFFF; var msw = x >> 16 + y >> 16 + lsw >> 16; return msw << 16 | lsw & 0xFFFF;}/* * Bitwise rotate a 32-bit number to the left. */function rolnum, cnt{ return num << cnt | num >>> 32 - cnt;}/* * Convert an 8-bit or 16-bit string to an array of big-endian words * In 8-bit function, characters >255 have their hi-byte silently ignored. */function str2binbstr{ var bin = Array; var mask = 1 << chrsz - 1; forvar i = 0; i < str.length * chrsz; i += chrszbin[i>>5] |= str.charCodeAti / chrsz & mask << 32 - chrsz - i%32; return bin;}/* * Convert an array of big-endian words to a string */function binb2strbin{ var str = ""; var mask = 1 << chrsz - 1; forvar i = 0; i < bin.length * 32; i += chrszstr += String.fromCharCodebin[i>>5] >>> 32 - chrsz - i%32 & mask; return str;}/* * Convert an array of big-endian words to a hex string. */function binb2hexbinarray{ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; forvar i = 0; i < binarray.length * 4; i++ {str += hex_tab.charAtbinarray[i>>2] >> 3 - i%4*8+4 & 0xF +hex_tab.charAtbinarray[i>>2] >> 3 - i%4*8  & 0xF; } return str;}/* * Convert an array of big-endian words to a base-64 string */function binb2b64binarray{ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; forvar i = 0; i < binarray.length * 4; i += 3 {var triplet = 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;forvar j = 0; j < 4; j++{ ifi * 8 + j * 6 > binarray.length * 32 str += b64pad; else str += tab.charAttriplet >> 6*3-j & 0x3F;} } return str;}