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 相关文章推荐
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
jquery模拟alert的弹窗插件
Jul 31 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
jquery实现简单Tab切换菜单效果
Jul 17 Javascript
JavaScript简单实现弹出拖拽窗口(二)
Jun 17 Javascript
概述javascript在Google IE中的调试技巧
Nov 24 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
Vue绑定内联样式问题
Oct 17 Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 Javascript
深入浅析Vue 中 ref 的使用
Apr 29 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培训要多少钱
2017/06/06 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Python Selenium截图功能实现代码
2020/04/26 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
大学生求职中的自我评价
2013/10/01 职场文书
函授药学自我鉴定
2014/02/07 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
六查六看剖析材料
2014/10/06 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis