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 相关文章推荐
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
js正则表达exec与match的区别说明
Jan 29 Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
Jan 18 Javascript
Canvas 绘制粒子动画背景
Feb 15 Javascript
基于JS实现网页中的选项卡(两种方法)
Jun 16 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
vue 自定义全局方法,在组件里面的使用介绍
Feb 28 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
vue-router之解决addRoutes使用遇到的坑
Jul 19 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正则校验用户名介绍
2008/07/19 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
WAF的正确bypass
2017/01/05 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
Python ftp上传文件
2016/02/13 Python
Python基于select实现的socket服务器
2016/04/13 Python
Python生成密码库功能示例
2017/05/23 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
机械专业个人求职自荐信格式
2013/09/21 职场文书
建筑专业自荐信
2013/10/18 职场文书
高职教师岗位职责
2013/12/24 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
周一给客户的问候语
2015/11/10 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
python办公自动化之excel的操作
2021/05/23 Python