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读取中文COOKIE的解决办法
Feb 15 Javascript
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
Sep 04 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
js实现模拟购物商城案例
May 18 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
php5中类的学习
2008/03/28 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python实现发送email的几种常用方法
2014/08/18 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python中property函数用法实例分析
2018/06/04 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
什么是.net的Remoting技术
2016/07/08 面试题
大学生职业生涯规划书参考模板
2014/03/05 职场文书
2014年教师节寄语
2014/04/03 职场文书
应聘护士求职信
2014/07/21 职场文书
4s店活动策划方案
2014/08/25 职场文书
防灾减灾活动总结
2014/08/30 职场文书
小学庆六一主持词
2015/06/30 职场文书
2019年入党思想汇报
2019/03/25 职场文书
GPU服务器的多用户配置方法
2022/07/07 Servers