Javascript实现的SHA-256加密算法完整实例


Posted in Javascript onFebruary 02, 2016

本文实例讲述了Javascript实现的SHA-256算法。分享给大家供大家参考,具体如下:

/**
*
* Secure Hash Algorithm (SHA256)
* http://www.webtoolkit.info/
*
* Original code by Angel Marin, Paul Johnston.
*
**/
function SHA256(s){
  var chrsz = 8;
  var hexcase = 0;
  function safe_add (x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
  }
  function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
  function R (X, n) { return ( X >>> n ); }
  function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
  function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
  function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
  function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
  function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
  function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
  function core_sha256 (m, l) {
    var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
    var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
    var W = new Array(64);
    var a, b, c, d, e, f, g, h, i, j;
    var T1, T2;
    m[l >> 5] |= 0x80 << (24 - l % 32);
    m[((l + 64 >> 9) << 4) + 15] = l;
    for ( var 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 ( var j = 0; j<64; j++) {
        if (j < 16) W[j] = m[j + i];
        else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
        T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
        T2 = safe_add(Sigma0256(a), 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 str2binb (str) {
    var bin = Array();
    var mask = (1 << chrsz) - 1;
    for(var i = 0; i < str.length * chrsz; i += chrsz) {
      bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
    }
    return bin;
  }
  function Utf8Encode(string) {
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";
    for (var n = 0; n < string.length; n++) {
      var c = string.charCodeAt(n);
      if (c < 128) {
        utftext += String.fromCharCode(c);
      }
      else if((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);
      }
    }
    return utftext;
  }
  function binb2hex (binarray) {
    var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    var str = "";
    for(var i = 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);
    }
    return str;
  }
  s = Utf8Encode(s);
  return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
Mar 08 Javascript
js取滚动条的尺寸的函数代码
Nov 30 Javascript
js中cookie的添加、取值、删除示例代码
Oct 21 Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 Javascript
JavaScript淡入淡出渐变简单实例
Aug 06 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
微信小程序-拍照或选择图片并上传文件
Jan 06 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
Mar 09 Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 Javascript
JavaScript 反射学习技巧
Oct 16 Javascript
JavaScript实现的SHA-1加密算法完整实例
Feb 02 #Javascript
javascript实现瀑布流加载图片原理
Feb 02 #Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 #Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 #Javascript
JavaScript实现的MD5算法完整实例
Feb 02 #Javascript
javascript禁止超链接跳转的方法
Feb 02 #Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 #Javascript
You might like
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
javascript学习网址备忘
2007/05/29 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
解决Vue打包后访问图片/图标不显示的问题
2019/07/25 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
python和pyqt实现360的CLable控件
2014/02/21 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
python小白切忌乱用表达式
2020/05/29 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
应届中专生自荐书范文
2014/02/13 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
家长反馈意见及建议
2015/06/03 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
浅谈MySQL之select优化方案
2021/08/07 MySQL
nginx lua 操作 mysql
2022/05/15 Servers
Nginx跨域问题解析与解决
2022/08/05 Servers