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 相关文章推荐
newxtree.js代码
Mar 13 Javascript
浅析JS中document对象的一些重要属性
Mar 06 Javascript
js实现网页自动刷新可制作节日倒计时效果
May 27 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
Dec 24 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
js实现显示当前状态的导航效果代码
Aug 28 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
layer弹出层取消遮罩的方法
Sep 25 Javascript
基于PHP pthreads实现多线程代码实例
Jun 24 Javascript
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
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 一个页面执行时间类代码
2010/03/05 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
javascript实现时钟动画
2020/12/03 Javascript
Python中的map、reduce和filter浅析
2014/04/26 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Pycharm修改python路径过程图解
2020/05/22 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
一道Delphi上机题
2012/06/04 面试题
国际贸易专业个人求职信格式
2014/02/02 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
勇敢的心观后感
2015/06/09 职场文书
大学副班长竞选稿
2015/11/21 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL