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 相关文章推荐
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 Javascript
Jquery图形报表插件 jqplot简介及参数详解
Oct 10 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
详解vue-Resource(与后端数据交互)
Jan 16 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
详解JavaScript中关于this指向的4种情况
Apr 18 Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
微信小程序 根据不同用户切换不同TabBar
Apr 21 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
Django实现快速分页的方法实例
2017/10/22 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
python多进程控制学习小结
2018/10/31 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
银行员工辞职信范文
2014/01/20 职场文书
教师考察材料范文
2014/06/03 职场文书
八一建军节演讲稿
2014/09/10 职场文书
超市创业计划书
2014/09/15 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书