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中setAttribute用法介绍
Jul 20 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
基于BootStrap的图片轮播效果展示实例代码
May 23 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
Vue.js每天必学之指令系统与自定义指令
Sep 07 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
Apr 27 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
Jun 09 jQuery
解决Mac安装thrift因bison报错的问题
May 17 Javascript
深入理解react-router 路由的实现原理
Sep 26 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
菜鸟修复电子管记
2021/03/02 无线电
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
跟老齐学Python之编写类之二方法
2014/10/11 Python
python随机生成指定长度密码的方法
2015/04/04 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python3.5运算符操作实例详解
2019/04/25 Python
师德师风事迹材料
2014/12/20 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
行政前台岗位职责
2015/04/16 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js