JavaScript SHA1加密算法实现详细代码


Posted in Javascript onOctober 06, 2016

本文实例为大家介绍了JavaScript SHA1加密算法吗,供大家参考,具体内容如下

/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS 180-1
 * Version 2.2 Copyright Paul Johnston 2000 - 2009.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 * http://www.sharejs.com
 */
 
/*
 * 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  */
 
/*
 * 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 rstr2hex(rstr_sha1(str2rstr_utf8(s))); }
function b64_sha1(s)  { return rstr2b64(rstr_sha1(str2rstr_utf8(s))); }
function any_sha1(s, e) { return rstr2any(rstr_sha1(str2rstr_utf8(s)), e); }
function hex_hmac_sha1(k, d)
 { return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); }
function b64_hmac_sha1(k, d)
 { return rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); }
function any_hmac_sha1(k, d, e)
 { return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
 
/*
 * Perform a simple self-test to see if the VM is working
 */
function sha1_vm_test()
{
 return hex_sha1("abc").toLowerCase() == "a9993e364706816aba3e25717850c26c9cd0d89d";
}
 
/*
 * Calculate the SHA1 of a raw string
 */
function rstr_sha1(s)
{
 return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8));
}
 
/*
 * Calculate the HMAC-SHA1 of a key and some data (raw strings)
 */
function rstr_hmac_sha1(key, data)
{
 var bkey = rstr2binb(key);
 if(bkey.length > 16) bkey = binb_sha1(bkey, key.length * 8);
 
 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 = binb_sha1(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
 return binb2rstr(binb_sha1(opad.concat(hash), 512 + 160));
}
 
/*
 * Convert a raw string to a hex string
 */
function rstr2hex(input)
{
 try { hexcase } catch(e) { hexcase=0; }
 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 var output = "";
 var x;
 for(var i = 0; i < input.length; i++)
 {
  x = input.charCodeAt(i);
  output += hex_tab.charAt((x >>> 4) & 0x0F)
      + hex_tab.charAt( x    & 0x0F);
 }
 return output;
}
 
/*
 * Convert a raw string to a base-64 string
 */
function rstr2b64(input)
{
 try { b64pad } catch(e) { b64pad=''; }
 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 var output = "";
 var len = input.length;
 for(var i = 0; i < len; i += 3)
 {
  var triplet = (input.charCodeAt(i) << 16)
        | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
        | (i + 2 < len ? input.charCodeAt(i+2)   : 0);
  for(var j = 0; j < 4; j++)
  {
   if(i * 8 + j * 6 > input.length * 8) output += b64pad;
   else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
  }
 }
 return output;
}
 
/*
 * Convert a raw string to an arbitrary string encoding
 */
function rstr2any(input, encoding)
{
 var divisor = encoding.length;
 var remainders = Array();
 var i, q, x, quotient;
 
 /* Convert to an array of 16-bit big-endian values, forming the dividend */
 var dividend = Array(Math.ceil(input.length / 2));
 for(i = 0; i < dividend.length; i++)
 {
  dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
 }
 
 /*
  * Repeatedly perform a long division. The binary array forms the dividend,
  * the length of the encoding is the divisor. Once computed, the quotient
  * forms the dividend for the next step. We stop when the dividend is zero.
  * All remainders are stored for later use.
  */
 while(dividend.length > 0)
 {
  quotient = Array();
  x = 0;
  for(i = 0; i < dividend.length; i++)
  {
   x = (x << 16) + dividend[i];
   q = Math.floor(x / divisor);
   x -= q * divisor;
   if(quotient.length > 0 || q > 0)
    quotient[quotient.length] = q;
  }
  remainders[remainders.length] = x;
  dividend = quotient;
 }
 
 /* Convert the remainders to the output string */
 var output = "";
 for(i = remainders.length - 1; i >= 0; i--)
  output += encoding.charAt(remainders[i]);
 
 /* Append leading zero equivalents */
 var full_length = Math.ceil(input.length * 8 /
                  (Math.log(encoding.length) / Math.log(2)))
 for(i = output.length; i < full_length; i++)
  output = encoding[0] + output;
 
 return output;
}
 
/*
 * Encode a string as utf-8.
 * For efficiency, this assumes the input is valid utf-16.
 */
function str2rstr_utf8(input)
{
 var output = "";
 var i = -1;
 var x, y;
 
 while(++i < input.length)
 {
  /* Decode utf-16 surrogate pairs */
  x = input.charCodeAt(i);
  y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
  if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
  {
   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
   i++;
  }
 
  /* Encode output as utf-8 */
  if(x <= 0x7F)
   output += String.fromCharCode(x);
  else if(x <= 0x7FF)
   output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                  0x80 | ( x     & 0x3F));
  else if(x <= 0xFFFF)
   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                  0x80 | ((x >>> 6 ) & 0x3F),
                  0x80 | ( x     & 0x3F));
  else if(x <= 0x1FFFFF)
   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                  0x80 | ((x >>> 12) & 0x3F),
                  0x80 | ((x >>> 6 ) & 0x3F),
                  0x80 | ( x     & 0x3F));
 }
 return output;
}
 
/*
 * Encode a string as utf-16
 */
function str2rstr_utf16le(input)
{
 var output = "";
 for(var i = 0; i < input.length; i++)
  output += String.fromCharCode( input.charCodeAt(i)    & 0xFF,
                 (input.charCodeAt(i) >>> 8) & 0xFF);
 return output;
}
 
function str2rstr_utf16be(input)
{
 var output = "";
 for(var i = 0; i < input.length; i++)
  output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
                  input.charCodeAt(i)    & 0xFF);
 return output;
}
 
/*
 * Convert a raw string to an array of big-endian words
 * Characters >255 have their high-byte silently ignored.
 */
function rstr2binb(input)
{
 var output = Array(input.length >> 2);
 for(var i = 0; i < output.length; i++)
  output[i] = 0;
 for(var i = 0; i < input.length * 8; i += 8)
  output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
 return output;
}
 
/*
 * Convert an array of big-endian words to a string
 */
function binb2rstr(input)
{
 var output = "";
 for(var i = 0; i < input.length * 32; i += 8)
  output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);
 return output;
}
 
/*
 * Calculate the SHA-1 of an array of big-endian words, and a bit length
 */
function binb_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] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
   var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
            safe_add(safe_add(e, w[j]), sha1_kt(j)));
   e = d;
   d = c;
   c = bit_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;
}
 
/*
 * 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 bit_rol(num, cnt)
{
 return (num << cnt) | (num >>> (32 - cnt));
}

以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注三水点靠木的最新内容。

Javascript 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
Mar 03 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
canvas绘图不清晰的解决方案
Feb 28 Javascript
深入理解Node.js中的进程管理
Mar 13 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
JS使用Date对象实时显示当前系统时间简单示例
Aug 23 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
canvas实现贪食蛇的实践
Feb 15 Javascript
JavaScript仿网易选项卡制作代码
Oct 06 #Javascript
Javascript中作用域的详细介绍
Oct 06 #Javascript
js实现非常棒的弹出div
Oct 06 #Javascript
jQuery事件用法详解
Oct 06 #Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
Oct 05 #Javascript
js改变html的原有内容实现方法
Oct 05 #Javascript
浅谈javascript:两种注释,声明变量,定义函数
Oct 05 #Javascript
You might like
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
php操作mysql数据库的基本类代码
2014/02/25 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
浅析php工厂模式
2014/11/25 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
javascript每日必学之继承
2016/02/23 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python及PyCharm下载与安装教程
2017/11/18 Python
python实现决策树分类算法
2017/12/21 Python
python实现图像识别功能
2018/01/29 Python
python实现图片横向和纵向拼接
2020/03/05 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
物业工作计划书
2014/01/10 职场文书
关于安全演讲稿
2014/05/09 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
教师师德工作总结2015
2015/07/22 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers