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判断两种格式的输入日期的正确性的代码
Mar 25 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
Feb 11 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
Apr 12 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
BootStrap创建响应式导航条实例代码
May 31 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
Feb 13 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
express框架实现基于Websocket建立的简易聊天室
Aug 10 Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
javascript实现贪吃蛇经典游戏
Apr 10 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与SQL注入攻击[二]
2007/04/17 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python socket实现简单聊天室
2018/04/01 Python
python3学生名片管理v2.0版
2018/11/29 Python
python实现网页自动签到功能
2019/01/21 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python dict如何定义
2020/09/02 Python
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
医生自荐信
2013/10/11 职场文书
行政经理岗位职责
2013/11/09 职场文书
小学教师评语大全
2014/04/23 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
2014年评职称工作总结
2014/11/20 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python