`
Neil_yang
  • 浏览: 130053 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

常用JS加密编码算法 三:MD5

阅读更多

三:MD5

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}

/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function core_md5(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;

  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);

}

/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t)
{
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
 * Calculate the HMAC-MD5, of a key and some data
 */
function core_hmac_md5(key, data)
{
  var bkey = str2binl(key);
  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md5(opad.concat(hash), 512 + 128);
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
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.
 */
function bit_rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Convert a string to an array of little-endian words
 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
function str2binl(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
}

/*
 * Convert an array of little-endian words to a string
 */
function binl2str(bin)
{
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
}

/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(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] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}

/*
 * Convert an array of little-endian words to a base-64 string
 */
function binl2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}

 

分享到:
评论

相关推荐

    JavaScript的加密算法类库:crypto-js

    总结来说,Crypto-js是一个强大且易用的JavaScript加密库,适用于前端开发中的数据加密和解密需求。合理使用它可以有效保护用户数据,提高应用程序的安全性。但同时也应意识到,前端加密并不能替代完整的安全策略,...

    js加密算法3des和md5-base64和常用工具

    本文将深入探讨三种常见的加密算法:3DES、MD5以及Base64,并介绍它们在实际应用中的工具和用途。 首先,我们来了解一下3DES(Triple DES,三重数据加密标准)。3DES是一种对称加密算法,它是DES(Data Encryption ...

    java后台及前端js使用AES互相加解密及前端md5加密

    JavaScript中,可以使用MD5库如`crypto-js`来计算MD5哈希值。 5. **Java与JavaScript之间的兼容**:在Java后台与JavaScript前端之间进行AES加解密时,需要注意密钥的统一和编码问题。通常,Java使用字节数组表示...

    MD5加密32位小写

    然而,由于其存在碰撞漏洞(即不同的输入可能会产生相同的输出),MD5现在更多地被用于验证文件完整性,而非敏感数据的加密。 在Java中实现MD5加密通常涉及以下步骤: 1. 引入库:Java标准库提供`java.security....

    JavaScript的MD5加密

    在JavaScript中实现MD5加密,通常依赖于第三方库,如`md5.js`。这个文件可能包含了一个完整的MD5实现,允许开发者通过简单的API调用来对字符串进行MD5加密。例如,使用`md5.js`,你可以如下所示对字符串进行MD5哈希...

    MD5编码、MD5加密解密demo

    在进行MD5编码时,会先将明文密码转化为字节序列,然后通过MD5算法计算摘要,最后将得到的16字节摘要以16进制字符串的形式表示。 在编程实践中,MD5的实现通常涉及特定的库函数,例如在Python中可以使用`hashlib`库...

    JavaScript资源:JavaScript MD5-2.3.0 加密工具

    JavaScript MD5-2.3.0 是一个用于JavaScript环境下的MD5加密库,它为开发者提供了在浏览器端或Node.js环境中对数据进行MD5哈希运算的功能。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,能够将任意...

    一个md5加密的javascript

    总之,`md5.js`文件是一个实现了MD5哈希算法的JavaScript库,旨在为开发人员提供简便、可靠的MD5加密功能。通过这个库,开发者可以在前端代码中轻松处理数据的加密和验证,提高应用的安全性。在实际项目中,我们可以...

    JS实现加密(base64, md5, sha1)

    在JavaScript中,可以使用第三方库如`crypto-js`来实现MD5计算。 3. **SHA1(Secure Hash Algorithm 1)**: SHA1是另一种哈希函数,其输出长度为160位(20字节),同样用于验证数据完整性。与MD5相比,SHA1的碰撞...

    加密js工具类:base64,md5,sha1

    `Base64`、`MD5`和`SHA1`是三种常见的编码和哈希算法,它们在处理数据加密和验证方面扮演着重要角色。这里我们将深入探讨这些工具类在JavaScript中的应用。 **Base64**是一种用于在网络上传输二进制数据的编码方式...

    JS实现密码加密(base64, md5, sha1)

    在JavaScript中,我们可以借助第三方库如`crypto-js`来实现MD5加密,例如`CryptoJS.MD5("password")`。 SHA1(Secure Hash Algorithm 1)是另一种哈希函数,与MD5类似,它将数据转化为160位的摘要。SHA1相比MD5提供...

    前端加密md5

    在前端使用MD5加密JS库,例如"md5加密.js",通常包含以下功能: 1. **字符串加密**:可以对用户输入的字符串进行MD5哈希运算,生成哈希值,用于密码存储或验证。 2. **文件哈希**:虽然前端环境不能直接读取本地...

    各种加密所需js MD5 esc 等等

    在标题和描述中提到的"各种加密所需js MD5 esc 等等",涉及到的是JavaScript(js)中的几种常见加密算法,包括MD5(Message-Digest Algorithm 5)、ESCAPE(字符串转义)以及可能误写的Base64编码。下面我们将详细...

    常用JS加密编码算法代码第1/2页

    在本文中,主要介绍了三种常用的JS加密编码算法,分别是Base64编码和解码函数、MD5和MD4算法以及SHA1算法。 首先,Base64编码是一种基于64个可打印字符表示任意二进制数据的方法。它经常用于电子邮件的传输、在网页...

    md5数据加密实例

    CryptoJS是一个开源的JavaScript库,提供了各种加密算法,如MD5、SHA-1、AES等。这个库非常适用于前端开发,可以在浏览器环境中进行数据的加密操作,而无需服务器端的支持。 以下是如何使用CryptoJS库进行MD5加密的...

    js版本的md5加密实现 转

    `md5.js`文件很可能是用于MD5加密的JavaScript库。在JavaScript中实现MD5,我们需要处理一系列的位操作、循环和转换,这通常是复杂的。一个常见的MD5库是`crypto-js`,但这里我们只关注`md5.js`这个文件,它可能包含...

    asp和javascript的md5加密函数(测试过两个值相同)

    console.log("JavaScript加密后的MD5值:" + hashedValue); ``` 在上述代码中,我们看到ASP使用了.NET框架的`System.Security.Cryptography.MD5CryptoServiceProvider`类来计算MD5,而JavaScript则借助...

    前端常用加密Js库

    本文将详细介绍标题所提及的“前端常用加密Js库”,包括Base64、MD5、SHA1、SHA256以及RSA这五种加密方法,以及它们在实际开发中的应用场景。 1. **Base64**:Base64是一种简单的编码方式,用于将二进制数据转换...

    数据加密MD5(包括javascript代码和java代码实现的两种方式)

    在JavaScript中,可以使用现成的库,如`crypto-js`,来实现MD5加密。以下是一个简单的示例: ```javascript var CryptoJS = require("crypto-js"); var message = "Hello, World!"; var hash = CryptoJS.MD5...

    VB MD5加密中文字符串源代码,JS中文MD5算法

    4. **JS中文字符串MD5加密脚本**:描述中还提到了JavaScript (JS)环境下的中文MD5实现。JS中处理中文字符串的步骤与VB类似,需要先将字符串编码,然后调用MD5函数,最后将结果转换为十六进制字符串。在浏览器环境中...

Global site tag (gtag.js) - Google Analytics