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实现计算加载页面所用的时间
Apr 02 Javascript
使用JS 清空File控件的路径值
Jul 08 Javascript
简单谈谈javascript代码复用模式
Jan 28 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
JavaScript简单实现弹出拖拽窗口(二)
Jun 17 Javascript
JS 终止执行的实现方法
Nov 24 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
Jun 14 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 Javascript
javascript实现前端分页效果
Jun 24 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
sony ICF-2010 拆解与改装
2021/03/02 无线电
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
PHP加密解密类实例分析
2015/04/20 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
Javascript 面向对象特性
2009/12/28 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
js时间控件只显示年月
2017/01/08 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
对TensorFlow的assign赋值用法详解
2018/07/30 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
什么是类的返射机制
2016/02/06 面试题
诚信承诺书模板
2014/05/26 职场文书
债务纠纷起诉书
2015/05/20 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers