JavaScript SHA-256加密算法详细代码


Posted in Javascript onOctober 06, 2016

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

/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
 * in FIPS 180-2
 * Version 2.2 Copyright Angel Marin, 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.
 * Also http://anmar.eu.org/projects/jssha2/
 */
 
/*
 * 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_sha256(s)  { return rstr2hex(rstr_sha256(str2rstr_utf8(s))); }
function b64_sha256(s)  { return rstr2b64(rstr_sha256(str2rstr_utf8(s))); }
function any_sha256(s, e) { return rstr2any(rstr_sha256(str2rstr_utf8(s)), e); }
function hex_hmac_sha256(k, d)
 { return rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_sha256(k, d)
 { return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_sha256(k, d, e)
 { return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
 
/*
 * Perform a simple self-test to see if the VM is working
 */
function sha256_vm_test()
{
 return hex_sha256("abc").toLowerCase() ==
      "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
}
 
/*
 * Calculate the sha256 of a raw string
 */
function rstr_sha256(s)
{
 return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8));
}
 
/*
 * Calculate the HMAC-sha256 of a key and some data (raw strings)
 */
function rstr_hmac_sha256(key, data)
{
 var bkey = rstr2binb(key);
 if(bkey.length > 16) bkey = binb_sha256(bkey, key.length * 8);
 
 var ipad = Array(16), opad = Array(16);
 for(var i = 0; i < 16; i++)
 {
  ipad[i] = bkey[i] ^ 0x36363636;
  opad[i] = bkey[i] ^ 0x5C5C5C5C;
 }
 
 var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
 return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256));
}
 
/*
 * 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 remainders = Array();
 var i, 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. We stop when the dividend is zero.
  * All remainders are stored for later use.
  */
 while(dividend.length > 0)
 {
  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[remainders.length] = 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]);
 
 /* Append leading zero equivalents */
 var full_length = Math.ceil(input.length * 8 /
                  (Math.log(encoding.length) / Math.log(2)))
 for(i = output.length; i < full_length; i++)
  output = encoding[0] + output;
 
 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;
}
 
/*
 * Main sha256 function, with its support functions
 */
function sha256_S (X, n) {return ( X >>> n ) | (X << (32 - n));}
function sha256_R (X, n) {return ( X >>> n );}
function sha256_Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
function sha256_Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
function sha256_Sigma0256(x) {return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));}
function sha256_Sigma1256(x) {return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));}
function sha256_Gamma0256(x) {return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));}
function sha256_Gamma1256(x) {return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));}
function sha256_Sigma0512(x) {return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));}
function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}
function sha256_Gamma0512(x) {return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7));}
function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}
 
var sha256_K = new Array
(
 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,
 -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986,
 -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885,
 -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,
 -1866530822, -1538233109, -1090935817, -965641998
);
 
function binb_sha256(m, l)
{
 var HASH = new Array(1779033703, -1150833019, 1013904242, -1521486534,
            1359893119, -1694144372, 528734635, 1541459225);
 var W = new Array(64);
 var a, b, c, d, e, f, g, h;
 var i, j, T1, T2;
 
 /* append padding */
 m[l >> 5] |= 0x80 << (24 - l % 32);
 m[((l + 64 >> 9) << 4) + 15] = l;
 
 for(i = 0; i < m.length; i += 16)
 {
  a = HASH[0];
  b = HASH[1];
  c = HASH[2];
  d = HASH[3];
  e = HASH[4];
  f = HASH[5];
  g = HASH[6];
  h = HASH[7];
 
  for(j = 0; j < 64; j++)
  {
   if (j < 16) W[j] = m[j + i];
   else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
                      sha256_Gamma0256(W[j - 15])), W[j - 16]);
 
   T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
                             sha256_K[j]), W[j]);
   T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
   h = g;
   g = f;
   f = e;
   e = safe_add(d, T1);
   d = c;
   c = b;
   b = a;
   a = safe_add(T1, T2);
  }
 
  HASH[0] = safe_add(a, HASH[0]);
  HASH[1] = safe_add(b, HASH[1]);
  HASH[2] = safe_add(c, HASH[2]);
  HASH[3] = safe_add(d, HASH[3]);
  HASH[4] = safe_add(e, HASH[4]);
  HASH[5] = safe_add(f, HASH[5]);
  HASH[6] = safe_add(g, HASH[6]);
  HASH[7] = safe_add(h, HASH[7]);
 }
 return HASH;
}
 
function safe_add (x, y)
{
 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
 return (msw << 16) | (lsw & 0xFFFF);
}

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

Javascript 相关文章推荐
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JQuery AJAX 中文乱码问题解决
Jun 05 Javascript
jquery 根据name名获取元素的value值
Feb 27 Javascript
chrome调试javascript详解
Oct 21 Javascript
AngularJs Scope详解及示例代码
Sep 01 Javascript
详谈angularjs中路由页面强制更新的问题
Apr 24 Javascript
AngularJS实现表单验证功能详解
Oct 12 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
Jul 13 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 25 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
JavaScript SHA1加密算法实现详细代码
Oct 06 #Javascript
JavaScript仿网易选项卡制作代码
Oct 06 #Javascript
Javascript中作用域的详细介绍
Oct 06 #Javascript
js实现非常棒的弹出div
Oct 06 #Javascript
jQuery事件用法详解
Oct 06 #Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
Oct 05 #Javascript
js改变html的原有内容实现方法
Oct 05 #Javascript
You might like
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
phpfans留言版用到的install.php
2007/01/04 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python检测IP地址变化并触发事件
2018/12/26 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
任课老师推荐信范文
2013/11/24 职场文书
岗位安全生产责任书
2014/07/28 职场文书
作风转变心得体会
2014/09/02 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
新郎答谢词
2015/01/04 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
js Proxy的原理详解
2021/05/25 Javascript