JavaScript SHA512加密算法详细代码


Posted in Javascript onOctober 06, 2016

本文实例为大家分享了JavaScript SHA512加密算法,供大家参考,具体内容如下

/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined
 * in FIPS 180-2
 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 * http://www.sharejs.com/codes
 */
 
/*
 * 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  */
 
/*
 * 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_sha512(s)  { return rstr2hex(rstr_sha512(str2rstr_utf8(s))); }
function b64_sha512(s)  { return rstr2b64(rstr_sha512(str2rstr_utf8(s))); }
function any_sha512(s, e) { return rstr2any(rstr_sha512(str2rstr_utf8(s)), e);}
function hex_hmac_sha512(k, d)
 { return rstr2hex(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_sha512(k, d)
 { return rstr2b64(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_sha512(k, d, e)
 { return rstr2any(rstr_hmac_sha512(str2rstr_utf8(k), str2rstr_utf8(d)), e);}
 
/*
 * Perform a simple self-test to see if the VM is working
 */
function sha512_vm_test()
{
 return hex_sha512("abc").toLowerCase() ==
  "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" +
  "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f";
}
 
/*
 * Calculate the SHA-512 of a raw string
 */
function rstr_sha512(s)
{
 return binb2rstr(binb_sha512(rstr2binb(s), s.length * 8));
}
 
/*
 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
 */
function rstr_hmac_sha512(key, data)
{
 var bkey = rstr2binb(key);
 if(bkey.length > 32) bkey = binb_sha512(bkey, key.length * 8);
 
 var ipad = Array(32), opad = Array(32);
 for(var i = 0; i < 32; i++)
 {
  ipad[i] = bkey[i] ^ 0x36363636;
  opad[i] = bkey[i] ^ 0x5C5C5C5C;
 }
 
 var hash = binb_sha512(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
 return binb2rstr(binb_sha512(opad.concat(hash), 1024 + 512));
}
 
/*
 * Convert a raw string to a hex string
 */
function rstr2hex(input)
{
 try { hexcase } catch(e) { hexcase=0; }
 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 var output = "";
 var x;
 for(var i = 0; i < input.length; i++)
 {
  x = input.charCodeAt(i);
  output += hex_tab.charAt((x >>> 4) & 0x0F)
      + hex_tab.charAt( x    & 0x0F);
 }
 return output;
}
 
/*
 * Convert a raw string to a base-64 string
 */
function rstr2b64(input)
{
 try { b64pad } catch(e) { b64pad=''; }
 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 var output = "";
 var len = input.length;
 for(var i = 0; i < len; i += 3)
 {
  var triplet = (input.charCodeAt(i) << 16)
        | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
        | (i + 2 < len ? input.charCodeAt(i+2)   : 0);
  for(var j = 0; j < 4; j++)
  {
   if(i * 8 + j * 6 > input.length * 8) output += b64pad;
   else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
  }
 }
 return output;
}
 
/*
 * Convert a raw string to an arbitrary string encoding
 */
function rstr2any(input, encoding)
{
 var divisor = encoding.length;
 var i, j, q, x, quotient;
 
 /* Convert to an array of 16-bit big-endian values, forming the dividend */
 var dividend = Array(Math.ceil(input.length / 2));
 for(i = 0; i < dividend.length; i++)
 {
  dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
 }
 
 /*
  * Repeatedly perform a long division. The binary array forms the dividend,
  * the length of the encoding is the divisor. Once computed, the quotient
  * forms the dividend for the next step. All remainders are stored for later
  * use.
  */
 var full_length = Math.ceil(input.length * 8 /
                  (Math.log(encoding.length) / Math.log(2)));
 var remainders = Array(full_length);
 for(j = 0; j < full_length; j++)
 {
  quotient = Array();
  x = 0;
  for(i = 0; i < dividend.length; i++)
  {
   x = (x << 16) + dividend[i];
   q = Math.floor(x / divisor);
   x -= q * divisor;
   if(quotient.length > 0 || q > 0)
    quotient[quotient.length] = q;
  }
  remainders[j] = x;
  dividend = quotient;
 }
 
 /* Convert the remainders to the output string */
 var output = "";
 for(i = remainders.length - 1; i >= 0; i--)
  output += encoding.charAt(remainders[i]);
 
 return output;
}
 
/*
 * Encode a string as utf-8.
 * For efficiency, this assumes the input is valid utf-16.
 */
function str2rstr_utf8(input)
{
 var output = "";
 var i = -1;
 var x, y;
 
 while(++i < input.length)
 {
  /* Decode utf-16 surrogate pairs */
  x = input.charCodeAt(i);
  y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
  if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
  {
   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
   i++;
  }
 
  /* Encode output as utf-8 */
  if(x <= 0x7F)
   output += String.fromCharCode(x);
  else if(x <= 0x7FF)
   output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                  0x80 | ( x     & 0x3F));
  else if(x <= 0xFFFF)
   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                  0x80 | ((x >>> 6 ) & 0x3F),
                  0x80 | ( x     & 0x3F));
  else if(x <= 0x1FFFFF)
   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                  0x80 | ((x >>> 12) & 0x3F),
                  0x80 | ((x >>> 6 ) & 0x3F),
                  0x80 | ( x     & 0x3F));
 }
 return output;
}
 
/*
 * Encode a string as utf-16
 */
function str2rstr_utf16le(input)
{
 var output = "";
 for(var i = 0; i < input.length; i++)
  output += String.fromCharCode( input.charCodeAt(i)    & 0xFF,
                 (input.charCodeAt(i) >>> 8) & 0xFF);
 return output;
}
 
function str2rstr_utf16be(input)
{
 var output = "";
 for(var i = 0; i < input.length; i++)
  output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                  input.charCodeAt(i)    & 0xFF);
 return output;
}
 
/*
 * Convert a raw string to an array of big-endian words
 * Characters >255 have their high-byte silently ignored.
 */
function rstr2binb(input)
{
 var output = Array(input.length >> 2);
 for(var i = 0; i < output.length; i++)
  output[i] = 0;
 for(var i = 0; i < input.length * 8; i += 8)
  output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
 return output;
}
 
/*
 * Convert an array of big-endian words to a string
 */
function binb2rstr(input)
{
 var output = "";
 for(var i = 0; i < input.length * 32; i += 8)
  output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
 return output;
}
 
/*
 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
 */
var sha512_k;
function binb_sha512(x, len)
{
 if(sha512_k == undefined)
 {
  //SHA512 constants
  sha512_k = new Array(
new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
new int64(-354779690, -840897762), new int64(-176337025, -294727304),
new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817));
 }
 
 //Initial hash values
 var H = new Array(
new int64(0x6a09e667, -205731576),
new int64(-1150833019, -2067093701),
new int64(0x3c6ef372, -23791573),
new int64(-1521486534, 0x5f1d36f1),
new int64(0x510e527f, -1377402159),
new int64(-1694144372, 0x2b3e6c1f),
new int64(0x1f83d9ab, -79577749),
new int64(0x5be0cd19, 0x137e2179));
 
 var T1 = new int64(0, 0),
  T2 = new int64(0, 0),
  a = new int64(0,0),
  b = new int64(0,0),
  c = new int64(0,0),
  d = new int64(0,0),
  e = new int64(0,0),
  f = new int64(0,0),
  g = new int64(0,0),
  h = new int64(0,0),
  //Temporary variables not specified by the document
  s0 = new int64(0, 0),
  s1 = new int64(0, 0),
  Ch = new int64(0, 0),
  Maj = new int64(0, 0),
  r1 = new int64(0, 0),
  r2 = new int64(0, 0),
  r3 = new int64(0, 0);
 var j, i;
 var W = new Array(80);
 for(i=0; i<80; i++)
  W[i] = new int64(0, 0);
 
 // append padding to the source string. The format is described in the FIPS.
 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
 x[((len + 128 >> 10)<< 5) + 31] = len;
 
 for(i = 0; i<x.length; i+=32) //32 dwords is the block size
 {
  int64copy(a, H[0]);
  int64copy(b, H[1]);
  int64copy(c, H[2]);
  int64copy(d, H[3]);
  int64copy(e, H[4]);
  int64copy(f, H[5]);
  int64copy(g, H[6]);
  int64copy(h, H[7]);
 
  for(j=0; j<16; j++)
  {
    W[j].h = x[i + 2*j];
    W[j].l = x[i + 2*j + 1];
  }
 
  for(j=16; j<80; j++)
  {
   //sigma1
   int64rrot(r1, W[j-2], 19);
   int64revrrot(r2, W[j-2], 29);
   int64shr(r3, W[j-2], 6);
   s1.l = r1.l ^ r2.l ^ r3.l;
   s1.h = r1.h ^ r2.h ^ r3.h;
   //sigma0
   int64rrot(r1, W[j-15], 1);
   int64rrot(r2, W[j-15], 8);
   int64shr(r3, W[j-15], 7);
   s0.l = r1.l ^ r2.l ^ r3.l;
   s0.h = r1.h ^ r2.h ^ r3.h;
 
   int64add4(W[j], s1, W[j-7], s0, W[j-16]);
  }
 
  for(j = 0; j < 80; j++)
  {
   //Ch
   Ch.l = (e.l & f.l) ^ (~e.l & g.l);
   Ch.h = (e.h & f.h) ^ (~e.h & g.h);
 
   //Sigma1
   int64rrot(r1, e, 14);
   int64rrot(r2, e, 18);
   int64revrrot(r3, e, 9);
   s1.l = r1.l ^ r2.l ^ r3.l;
   s1.h = r1.h ^ r2.h ^ r3.h;
 
   //Sigma0
   int64rrot(r1, a, 28);
   int64revrrot(r2, a, 2);
   int64revrrot(r3, a, 7);
   s0.l = r1.l ^ r2.l ^ r3.l;
   s0.h = r1.h ^ r2.h ^ r3.h;
 
   //Maj
   Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
   Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
 
   int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
   int64add(T2, s0, Maj);
 
   int64copy(h, g);
   int64copy(g, f);
   int64copy(f, e);
   int64add(e, d, T1);
   int64copy(d, c);
   int64copy(c, b);
   int64copy(b, a);
   int64add(a, T1, T2);
  }
  int64add(H[0], H[0], a);
  int64add(H[1], H[1], b);
  int64add(H[2], H[2], c);
  int64add(H[3], H[3], d);
  int64add(H[4], H[4], e);
  int64add(H[5], H[5], f);
  int64add(H[6], H[6], g);
  int64add(H[7], H[7], h);
 }
 
 //represent the hash as an array of 32-bit dwords
 var hash = new Array(16);
 for(i=0; i<8; i++)
 {
  hash[2*i] = H[i].h;
  hash[2*i + 1] = H[i].l;
 }
 return hash;
}
 
//A constructor for 64-bit numbers
function int64(h, l)
{
 this.h = h;
 this.l = l;
 //this.toString = int64toString;
}
 
//Copies src into dst, assuming both are 64-bit numbers
function int64copy(dst, src)
{
 dst.h = src.h;
 dst.l = src.l;
}
 
//Right-rotates a 64-bit number by shift
//Won't handle cases of shift>=32
//The function revrrot() is for that
function int64rrot(dst, x, shift)
{
  dst.l = (x.l >>> shift) | (x.h << (32-shift));
  dst.h = (x.h >>> shift) | (x.l << (32-shift));
}
 
//Reverses the dwords of the source and then rotates right by shift.
//This is equivalent to rotation by 32+shift
function int64revrrot(dst, x, shift)
{
  dst.l = (x.h >>> shift) | (x.l << (32-shift));
  dst.h = (x.l >>> shift) | (x.h << (32-shift));
}
 
//Bitwise-shifts right a 64-bit number by shift
//Won't handle shift>=32, but it's never needed in SHA512
function int64shr(dst, x, shift)
{
  dst.l = (x.l >>> shift) | (x.h << (32-shift));
  dst.h = (x.h >>> shift);
}
 
//Adds two 64-bit numbers
//Like the original implementation, does not rely on 32-bit operations
function int64add(dst, x, y)
{
  var w0 = (x.l & 0xffff) + (y.l & 0xffff);
  var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
  var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
  var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
  dst.l = (w0 & 0xffff) | (w1 << 16);
  dst.h = (w2 & 0xffff) | (w3 << 16);
}
 
//Same, except with 4 addends. Works faster than adding them one by one.
function int64add4(dst, a, b, c, d)
{
  var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
  var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
  var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
  var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
  dst.l = (w0 & 0xffff) | (w1 << 16);
  dst.h = (w2 & 0xffff) | (w3 << 16);
}
 
//Same, except with 5 addends
function int64add5(dst, a, b, c, d, e)
{
  var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff);
  var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16);
  var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16);
  var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
  dst.l = (w0 & 0xffff) | (w1 << 16);
  dst.h = (w2 & 0xffff) | (w3 << 16);
}

以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注三水点靠木的最新内容。

Javascript 相关文章推荐
IE本地存储userdata的一个bug说明
Jul 01 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
javascript解析json数据的3种方式
May 08 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
node.js实现博客小爬虫的实例代码
Oct 08 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
Sep 01 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
vue实现图片上传预览功能
Dec 23 Javascript
Vue Router 实现动态路由和常见问题及解决方法
Mar 06 Javascript
JQuery PHP图片在线裁剪实例
Jul 27 #Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 #Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 #Javascript
JavaScript仿网易选项卡制作代码
Oct 06 #Javascript
Javascript中作用域的详细介绍
Oct 06 #Javascript
js实现非常棒的弹出div
Oct 06 #Javascript
jQuery事件用法详解
Oct 06 #Javascript
You might like
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
详解vue路由
2020/08/05 Javascript
小小聊天室Python代码实现
2016/08/17 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
python反转列表的三种方式解析
2019/11/08 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
印度民族服装购物网站:BIBA
2019/08/05 全球购物
农村面貌改造提升实施方案
2014/03/18 职场文书
廉洁使者实施方案
2014/03/29 职场文书
购房协议书
2014/04/11 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
实习生矿工检讨书
2014/10/13 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Golang中interface{}转为数组的操作
2021/04/30 Golang
在pycharm中无法import所安装的库解决方案
2021/05/31 Python