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 相关文章推荐
javascript add event remove event
Apr 07 Javascript
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
jquery 构造函数在表单提交过程中修改数据
May 25 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
Sep 18 Javascript
angularjs select 赋值 ng-options配置方法
Feb 28 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
Sep 06 Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 Javascript
Vue组件为什么data必须是一个函数
Jun 11 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 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
php5 mysql分页实例代码
2008/04/10 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
PHP header函数分析详解
2011/08/06 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Postman参数化实现过程及原理解析
2020/08/13 Javascript
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
幼儿园教师辞职信
2014/01/18 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
长江三峡导游词
2015/01/31 职场文书
团委副书记工作总结
2015/08/14 职场文书
自信主题班会
2015/08/14 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS