JavaScript实现SHA-1加密算法的方法


Posted in Javascript onMarch 11, 2015

本文实例讲述了JavaScript实现SHA-1加密算法的方法。分享给大家供大家参考。具体实现方法如下:

调用方法:hex_sha1即可。

/*

 *

 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined

 * in FIPS PUB 180-1

 *

 * By lizq

 *

 * 2006-11-11

 *

 */

/*

 *

 * Configurable variables.

 *

 */

var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */

var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */

/*

 *

 * The main function to calculate message digest

 *

 */

function hex_sha1(s){

    return binb2hex(core_sha1(AlignSHA1(s)));

}

/*

 *

 * 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(blockArray){

    var x = blockArray; // append padding

    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) // 每次处理512位 16*32

    {

        var olda = a;

        var oldb = b;

        var oldc = c;

        var oldd = d;

        var olde = e;

        for (var j = 0; j < 80; j++) // 对每个512位进行80步操作

        {

            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 new Array(a, b, c, d, e);

}

/*

 *

 * Perform the appropriate triplet combination function for the current

 * iteration

 *

 * 返回对应F函数的值

 *

 */

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; // t<80

}

/*

 *

 * Determine the appropriate additive constant for the current iteration

 *

 * 返回对应的Kt值

 *

 */

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.

 *

 * 将32位数拆成高16位和低16位分别进行相加,从而实现 MOD 2^32 的加法

 *

 */

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.

 *

 * 32位二进制数循环左移

 *

 */

function rol(num, cnt){

    return (num << cnt) | (num >>> (32 - cnt));

}

/*

 *

 * The standard SHA1 needs the input string to fit into a block

 *

 * This function align the input string to meet the requirement

 *

 */

function AlignSHA1(str){

    var nblk = ((str.length + 8) >> 6) + 1, blks = new Array(nblk * 16);

    for (var i = 0; i < nblk * 16; i++) 

        blks[i] = 0;

    for (i = 0; i < str.length; i++) 

        blks[i >> 2] |= str.charCodeAt(i) << (24 - (i & 3) * 8);

    blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);

    blks[nblk * 16 - 1] = str.length * 8;

    return blks;

}

/*

 *

 * 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;

}

/*

 *

 * calculate MessageDigest accord to source message that inputted

 *

 */

function calcDigest(){

    var digestM = hex_sha1(document.SHAForm.SourceMessage.value);

    document.SHAForm.MessageDigest.value = digestM;

}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
JavaScript设置获取和设置属性的方法
Mar 04 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
Js获取图片原始宽高的实现代码
May 17 Javascript
ReactNative 之FlatList使用及踩坑封装总结
Nov 29 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
微信小程序实现单列下拉菜单效果
Apr 25 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
js实现幻灯片轮播图
Aug 14 Javascript
如何用JavaScipt测网速
May 09 Javascript
JavaScript前补零操作实例
Mar 11 #Javascript
JavaScript限定图片显示大小的方法
Mar 11 #Javascript
iScroll中事件点击触发两次解决方案
Mar 11 #Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 #Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 #Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 #Javascript
javascript与css3动画结合使用小结
Mar 11 #Javascript
You might like
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
vue组件学习教程
2017/09/09 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
vue 获取视频时长的实例代码
2019/08/20 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
python列表的常用操作方法小结
2016/05/21 Python
django之常用命令详解
2016/06/30 Python
Python中%r和%s的详解及区别
2017/03/16 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Python安装selenium包详细过程
2019/07/23 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
机械工程师求职自我评价
2013/09/23 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
小学毕业演讲稿
2014/04/25 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
端午节活动总结
2014/08/26 职场文书
财务工作个人总结
2015/02/27 职场文书
浅谈Python中的正则表达式
2021/06/28 Python
Python实现抖音热搜定时爬取功能
2022/03/16 Python