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 相关文章推荐
JavaScript常用对象的方法和属性小结
Jan 24 Javascript
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
在JavaScript中处理字符串之link()方法的使用
Jun 08 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
全面解析Javascript无限添加QQ好友原理
Jun 15 Javascript
angular.js分页代码的实例
Jul 27 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
详解ES6 系列之异步处理实战
Oct 26 Javascript
three.js显示中文字体与tween应用详析
Jan 04 Javascript
详解如何使用Node.js实现热重载页面
May 06 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 远程关机实现代码
2009/11/10 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
js压缩利器
2007/02/20 Javascript
javascript document.images实例
2008/05/27 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python合并字符串的3种方法
2015/05/21 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
Python Json数据文件操作原理解析
2020/05/09 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
python3跳出一个循环的实例操作
2020/08/18 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
室内设计专业学生的自我评价分享
2013/11/27 职场文书
干部对照检查材料范文
2014/08/26 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
php实例化对象的实例方法
2021/11/17 PHP
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android