JavaScript实现的SHA-1加密算法完整实例


Posted in Javascript onFebruary 02, 2016

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

/**
*
* Secure Hash Algorithm (SHA1)
* http://www.webtoolkit.info/
*
**/
function SHA1 (msg) {
  function rotate_left(n,s) {
    var t4 = ( n<<s ) | (n>>>(32-s));
    return t4;
  };
  function lsb_hex(val) {
    var str="";
    var i;
    var vh;
    var vl;
    for( i=0; i<=6; i+=2 ) {
      vh = (val>>>(i*4+4))&0x0f;
      vl = (val>>>(i*4))&0x0f;
      str += vh.toString(16) + vl.toString(16);
    }
    return str;
  };
  function cvt_hex(val) {
    var str="";
    var i;
    var v;
    for( i=7; i>=0; i-- ) {
      v = (val>>>(i*4))&0x0f;
      str += v.toString(16);
    }
    return str;
  };
  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;
  };
  var blockstart;
  var i, j;
  var W = new Array(80);
  var H0 = 0x67452301;
  var H1 = 0xEFCDAB89;
  var H2 = 0x98BADCFE;
  var H3 = 0x10325476;
  var H4 = 0xC3D2E1F0;
  var A, B, C, D, E;
  var temp;
  msg = Utf8Encode(msg);
  var msg_len = msg.length;
  var word_array = new Array();
  for( i=0; i<msg_len-3; i+=4 ) {
    j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
    msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
    word_array.push( j );
  }
  switch( msg_len % 4 ) {
    case 0:
      i = 0x080000000;
    break;
    case 1:
      i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
    break;
    case 2:
      i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
    break;
    case 3:
      i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8  | 0x80;
    break;
  }
  word_array.push( i );
  while( (word_array.length % 16) != 14 ) word_array.push( 0 );
  word_array.push( msg_len>>>29 );
  word_array.push( (msg_len<<3)&0x0ffffffff );
  for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
    for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
    for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
    A = H0;
    B = H1;
    C = H2;
    D = H3;
    E = H4;
    for( i= 0; i<=19; i++ ) {
      temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
      E = D;
      D = C;
      C = rotate_left(B,30);
      B = A;
      A = temp;
    }
    for( i=20; i<=39; i++ ) {
      temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
      E = D;
      D = C;
      C = rotate_left(B,30);
      B = A;
      A = temp;
    }
    for( i=40; i<=59; i++ ) {
      temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
      E = D;
      D = C;
      C = rotate_left(B,30);
      B = A;
      A = temp;
    }
    for( i=60; i<=79; i++ ) {
      temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
      E = D;
      D = C;
      C = rotate_left(B,30);
      B = A;
      A = temp;
    }
    H0 = (H0 + A) & 0x0ffffffff;
    H1 = (H1 + B) & 0x0ffffffff;
    H2 = (H2 + C) & 0x0ffffffff;
    H3 = (H3 + D) & 0x0ffffffff;
    H4 = (H4 + E) & 0x0ffffffff;
  }
  var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
  return temp.toLowerCase();
}

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

Javascript 相关文章推荐
javascript学习随笔(使用window和frame)的技巧
Mar 08 Javascript
ArrayList类(增强版)
Apr 04 Javascript
jquery的flexigrid无法显示数据提示获取到数据
Jul 19 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
May 11 Javascript
JavaScript获取表单内所有元素值的方法
Apr 02 Javascript
Bootstrap实现带动画过渡的弹出框
Aug 09 Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
解决vue中虚拟dom,无法实时更新的问题
Sep 15 Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 Javascript
Vue Router的手写实现方法实现
Mar 02 Javascript
javascript实现画板功能
Apr 12 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
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
Node.js实现JS文件合并小工具
Feb 02 #Javascript
You might like
PHP5+UTF8多文件上传类
2008/10/17 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
Python端口扫描简单程序
2016/11/10 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python创造虚拟环境方法总结
2019/03/04 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
了解一下python内建模块collections
2020/09/07 Python
Django自带的用户验证系统实现
2020/12/18 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
python中time包实例详解
2021/02/02 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
软件配置管理有什么好处
2015/04/15 面试题
教育学专业实习生的自我鉴定
2013/11/26 职场文书
数学系毕业生求职信
2014/05/29 职场文书
企业环保标语
2014/06/10 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
股指期货心得体会
2014/09/13 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
关于车尾的标语大全
2015/08/11 职场文书
中学总务处工作总结
2015/08/12 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS