Javascript SHA-1:Secure Hash Algorithm


Posted in Javascript onDecember 20, 2006

From:http://pajhome.org.uk/crypt/md5/sha1src.html

/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase    */
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance  */
var chrsz  = 8; /* bits per input character. 8 - ASCII; 16 - Unicode   */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}

/*
 * Perform a simple self-test to see if the VM is working
 */
function sha1_vm_test()
{
 return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}

/*
 * Calculate the SHA-1 of an array of big-endian words, and a bit length
 */
function core_sha1(x, len)
{
 /* append padding */
 x[len >> 5] |= 0x80 << (24 - len % 32);
 x[((len + 64 >> 9) << 4) + 15] = len;

 var w = Array(80);
 var a = 1732584193;
 var b = -271733879;
 var c = -1732584194;
 var d = 271733878;
 var e = -1009589776;

 for(var i = 0; i < x.length; i += 16)
 {
  var olda = a;
  var oldb = b;
  var oldc = c;
  var oldd = d;
  var olde = e;

  for(var j = 0; j < 80; j++)
  {
   if(j < 16) w[j] = x[i + j];
   else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
   var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
            safe_add(safe_add(e, w[j]), sha1_kt(j)));
   e = d;
   d = c;
   c = rol(b, 30);
   b = a;
   a = t;
  }

  a = safe_add(a, olda);
  b = safe_add(b, oldb);
  c = safe_add(c, oldc);
  d = safe_add(d, oldd);
  e = safe_add(e, olde);
 }
 return Array(a, b, c, d, e);

}

/*
 * Perform the appropriate triplet combination function for the current
 * iteration
 */
function sha1_ft(t, b, c, d)
{
 if(t < 20) return (b & c) | ((~b) & d);
 if(t < 40) return b ^ c ^ d;
 if(t < 60) return (b & c) | (b & d) | (c & d);
 return b ^ c ^ d;
}

/*
 * Determine the appropriate additive constant for the current iteration
 */
function sha1_kt(t)
{
 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
     (t < 60) ? -1894007588 : -899497514;
}

/*
 * Calculate the HMAC-SHA1 of a key and some data
 */
function core_hmac_sha1(key, data)
{
 var bkey = str2binb(key);
 if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);

 var ipad = Array(16), opad = Array(16);
 for(var i = 0; i < 16; i++)
 {
  ipad[i] = bkey[i] ^ 0x36363636;
  opad[i] = bkey[i] ^ 0x5C5C5C5C;
 }

 var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
 return core_sha1(opad.concat(hash), 512 + 160);
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
 return (msw << 16) | (lsw & 0xFFFF);
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function rol(num, cnt)
{
 return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Convert an 8-bit or 16-bit string to an array of big-endian words
 * In 8-bit function, characters >255 have their hi-byte silently ignored.
 */
function str2binb(str)
{
 var bin = Array();
 var mask = (1 << chrsz) - 1;
 for(var i = 0; i < str.length * chrsz; i += chrsz)
  bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
 return bin;
}

/*
 * Convert an array of big-endian words to a string
 */
function binb2str(bin)
{
 var str = "";
 var mask = (1 << chrsz) - 1;
 for(var i = 0; i < bin.length * 32; i += chrsz)
  str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
 return str;
}

/*
 * Convert an array of big-endian words to a hex string.
 */
function binb2hex(binarray)
{
 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 var str = "";
 for(var i = 0; i < binarray.length * 4; i++)
 {
  str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
      hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
 }
 return str;
}

/*
 * Convert an array of big-endian words to a base-64 string
 */
function binb2b64(binarray)
{
 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 var str = "";
 for(var i = 0; i < binarray.length * 4; i += 3)
 {
  var triplet = (((binarray[i  >> 2] >> 8 * (3 - i  %4)) & 0xFF) << 16)
        | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
        | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
  for(var j = 0; j < 4; j++)
  {
   if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
   else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
  }
 }
 return str;
}
Javascript 相关文章推荐
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
Dec 19 Javascript
javascript异步编程的4种方法
Feb 19 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
May 04 Javascript
jquery控制select的text/value值为选中状态
Jun 03 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
Feb 10 Javascript
js实现导航吸顶效果
Feb 24 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
Code:findPosX 和 findPosY
Dec 20 #Javascript
Javascript MD4
Dec 20 #Javascript
用JavaScript获取网页中的js、css、Flash等文件
Dec 20 #Javascript
取得一定长度的内容,处理中文
Dec 20 #Javascript
解决FLASH需要点击激活的代码
Dec 20 #Javascript
用 JavaScript 迁移目录
Dec 18 #Javascript
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 #Javascript
You might like
PHP 日,周,月点击排行统计
2012/01/11 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
为你总结一些php系统类函数
2015/10/21 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
详解python配置虚拟环境
2019/04/08 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
使用索引有什么好处
2016/07/27 面试题
C#笔试题
2015/07/14 面试题
2015年毕业生个人自荐书
2015/03/24 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python