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 相关文章推荐
js定时器的使用(实例讲解)
Jan 06 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
js图片轮播手动切换特效
Jan 12 Javascript
原生JavaScript实现AJAX、JSONP
Feb 07 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
微信小程序对接七牛云存储的方法
Jul 30 Javascript
laravel5.4+vue+element简单搭建的示例代码
Aug 29 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 Javascript
微信小程序日历弹窗选择器代码实例
May 09 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 Javascript
js实现右键弹出自定义菜单
Sep 08 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
Node.js实现JS文件合并小工具
Feb 02 #Javascript
You might like
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
window.open的功能全解析
2006/10/10 Javascript
Javascript valueOf 使用方法
2008/12/28 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
Python求解平方根的方法
2015/03/11 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python实现桌面壁纸切换功能
2019/01/21 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python如何实现FTP功能
2020/05/28 Python
Python-for循环的内部机制
2020/06/12 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
PHP中如何使用Cookie
2015/10/28 面试题
高校十八大报告感想
2014/01/27 职场文书
品牌宣传方案
2014/03/21 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis