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 相关文章推荐
基于JQuery的asp.net树实现代码
Nov 30 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
Dec 11 Javascript
表单序列化与jq中的serialize使用示例
Feb 21 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
javascript匀速动画和缓冲动画详解
Oct 20 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
Jun 04 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
Oct 28 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 session有效期问题
2009/04/26 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
围观tangram js库
2010/12/28 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
JSONP跨域请求
2017/03/02 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
JS 验证码功能的三种实现方式
2018/11/26 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
scrapy-splash简单使用详解
2021/02/21 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
升职自荐书范文
2013/11/28 职场文书
应届毕业生求职信范例分享
2013/12/17 职场文书
运动会入场词100字
2014/02/06 职场文书
五好关工委申报材料
2014/05/31 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
建筑横幅标语
2014/10/09 职场文书
实习介绍信模板
2015/01/30 职场文书
给领导敬酒词
2015/08/12 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang