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向flash swf文件传递参数值注意细节
Dec 11 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
Sep 01 Javascript
js检测用户输入密码强度
Oct 22 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
Feb 19 Javascript
JSON与JS对象的区别与对比
Mar 01 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
解决bootstrap模态框数据缓存的问题方法
Aug 10 Javascript
解决layer图标icon不加载的问题
Sep 04 Javascript
JavaScript鼠标拖拽事件详解
Apr 03 Javascript
微信小程序纯文本实现@功能
Apr 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中使用Oracle数据库(2)
2006/10/09 PHP
PHP操作数组相关函数
2011/02/03 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
javascript 一些用法小结
2009/09/11 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Django logging配置及使用详解
2019/07/23 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
美国电视购物HSN官网:HSN
2016/09/07 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
教育专业自荐书范文
2013/12/17 职场文书
个人创业事迹材料
2014/12/30 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
一条 SQL 语句执行过程
2022/03/17 MySQL