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

常用JS加密编码算法 四:MD4算法

阅读更多

四:MD4算法

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD4 Message
 * Digest Algorithm, as defined in RFC 1320.
 * Version 2.1 Copyright (C) Jerrad Pierce, 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
 */
function hex_md4(s){ return binl2hex(core_md4(str2binl(s), s.length * chrsz));}
function b64_md4(s){ return binl2b64(core_md4(str2binl(s), s.length * chrsz));}
function str_md4(s){ return binl2str(core_md4(str2binl(s), s.length * chrsz));}
function hex_hmac_md4(key, data) { return binl2hex(core_hmac_md4(key, data)); }
function b64_hmac_md4(key, data) { return binl2b64(core_hmac_md4(key, data)); }
function str_hmac_md4(key, data) { return binl2str(core_hmac_md4(key, data)); }

/* 
 * Perform a simple self-test to see if the VM is working 
 */
function md4_vm_test()
{
  return hex_md4("abc") == "a448017aaf21d8525fc10ae87aa6729d";
}

/*
 * Calculate the MD4 of an array of little-endian words, and a bit length
 */
function core_md4(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 = md4_ff(a, b, c, d, x[i+ 0], 3 );
    d = md4_ff(d, a, b, c, x[i+ 1], 7 );
    c = md4_ff(c, d, a, b, x[i+ 2], 11);
    b = md4_ff(b, c, d, a, x[i+ 3], 19);
    a = md4_ff(a, b, c, d, x[i+ 4], 3 );
    d = md4_ff(d, a, b, c, x[i+ 5], 7 );
    c = md4_ff(c, d, a, b, x[i+ 6], 11);
    b = md4_ff(b, c, d, a, x[i+ 7], 19);
    a = md4_ff(a, b, c, d, x[i+ 8], 3 );
    d = md4_ff(d, a, b, c, x[i+ 9], 7 );
    c = md4_ff(c, d, a, b, x[i+10], 11);
    b = md4_ff(b, c, d, a, x[i+11], 19);
    a = md4_ff(a, b, c, d, x[i+12], 3 );
    d = md4_ff(d, a, b, c, x[i+13], 7 );
    c = md4_ff(c, d, a, b, x[i+14], 11);
    b = md4_ff(b, c, d, a, x[i+15], 19);

    a = md4_gg(a, b, c, d, x[i+ 0], 3 );
    d = md4_gg(d, a, b, c, x[i+ 4], 5 );
    c = md4_gg(c, d, a, b, x[i+ 8], 9 );
    b = md4_gg(b, c, d, a, x[i+12], 13);
    a = md4_gg(a, b, c, d, x[i+ 1], 3 );
    d = md4_gg(d, a, b, c, x[i+ 5], 5 );
    c = md4_gg(c, d, a, b, x[i+ 9], 9 );
    b = md4_gg(b, c, d, a, x[i+13], 13);
    a = md4_gg(a, b, c, d, x[i+ 2], 3 );
    d = md4_gg(d, a, b, c, x[i+ 6], 5 );
    c = md4_gg(c, d, a, b, x[i+10], 9 );
    b = md4_gg(b, c, d, a, x[i+14], 13);
    a = md4_gg(a, b, c, d, x[i+ 3], 3 );
    d = md4_gg(d, a, b, c, x[i+ 7], 5 );
    c = md4_gg(c, d, a, b, x[i+11], 9 );
    b = md4_gg(b, c, d, a, x[i+15], 13);

    a = md4_hh(a, b, c, d, x[i+ 0], 3 );
    d = md4_hh(d, a, b, c, x[i+ 8], 9 );
    c = md4_hh(c, d, a, b, x[i+ 4], 11);
    b = md4_hh(b, c, d, a, x[i+12], 15);
    a = md4_hh(a, b, c, d, x[i+ 2], 3 );
    d = md4_hh(d, a, b, c, x[i+10], 9 );
    c = md4_hh(c, d, a, b, x[i+ 6], 11);
    b = md4_hh(b, c, d, a, x[i+14], 15);
    a = md4_hh(a, b, c, d, x[i+ 1], 3 );
    d = md4_hh(d, a, b, c, x[i+ 9], 9 );
    c = md4_hh(c, d, a, b, x[i+ 5], 11);
    b = md4_hh(b, c, d, a, x[i+13], 15);
    a = md4_hh(a, b, c, d, x[i+ 3], 3 );
    d = md4_hh(d, a, b, c, x[i+11], 9 );
    c = md4_hh(c, d, a, b, x[i+ 7], 11);
    b = md4_hh(b, c, d, a, x[i+15], 15);

    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 basic operation for each round of the
 * algorithm.
 */
function md4_cmn(q, a, b, x, s, t)
{
  return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md4_ff(a, b, c, d, x, s)
{
  return md4_cmn((b & c) | ((~b) & d), a, 0, x, s, 0);
}
function md4_gg(a, b, c, d, x, s)
{
  return md4_cmn((b & c) | (b & d) | (c & d), a, 0, x, s, 1518500249);
}
function md4_hh(a, b, c, d, x, s)
{
  return md4_cmn(b ^ c ^ d, a, 0, x, s, 1859775393);
}

/*
 * Calculate the HMAC-MD4, of a key and some data
 */
function core_hmac_md4(key, data)
{
  var bkey = str2binl(key);
  if(bkey.length > 16) bkey = core_md4(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_md4(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md4(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 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和常用工具

    开发者可以利用JavaScript库,如crypto-js,来实现3DES、MD5和Base64的功能。这些库提供了简单的API接口,使得开发者能够轻松地进行加密和解密操作。 对于3DES,开发者需要指定一个密钥,然后调用对应的encrypt和...

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

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

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

    4. **MD5加密**:MD5是一种广泛使用的哈希函数,它可以将任意长度的信息映射为固定长度的摘要。MD5主要用于验证数据完整性,而非加密。前端通常会使用MD5对用户输入的密码进行单向加密,这样即使数据被截获,也无法...

    MD5加密32位小写

    4. 获取哈希值:调用`digest()`方法计算MD5摘要,返回的是字节数组,通常会转换为16进制字符串展示。 ```java byte[] digestBytes = md.digest(); StringBuilder hexString = new StringBuilder(); for (byte b : ...

    js加密算法

    本文介绍了如何使用 JavaScript 实现 MD5 消息摘要算法以及 UTF-8 与 UTF-16 编码之间的转换方法。MD5 算法实现中包括了对输入字符串的处理、整数到十六进制的转换、核心的 MD5 轮函数以及主入口函数。对于 UTF-8 与...

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

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

    JavaScript的MD5加密

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

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

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

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

    常见的加密算法有Base64、MD5和SHA1。这些方法在不同的场景下有着各自的用途和特点。 1. **Base64编码**: Base64是一种用64个字符来表示任意二进制数据的方法。它不是一种加密方式,而是一种编码方式,主要用于在...

    前端常用加密Js库

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

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

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

    一个md5加密的javascript

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

    js常用加密文件.rar

    而“js常用加密文件.rar”这个压缩包显然包含了一些常用的JavaScript加密库,这些库用于增强应用程序的安全性,保护数据免受未经授权的访问或篡改。以下是对每个文件的详细解释: 1. **JS数字签名.js**: 数字签名...

    MD5,SHA-1加密算法(JS调用)

    ### MD5与SHA-1加密算法(JS实现) 在现代Web开发中,用户登录时的安全性至关重要。为了保护用户的隐私和个人信息安全,开发人员通常会在客户端对用户的密码进行加密处理,而不是直接以明文形式传输。这不仅可以...

    各种加密所需js MD5 esc 等等

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

    前端加密md5

    4. **简单性**:MD5算法简单,易于实现,这使得它在前端JavaScript环境中也能轻松应用。 在前端使用MD5加密JS库,例如"md5加密.js",通常包含以下功能: 1. **字符串加密**:可以对用户输入的字符串进行MD5哈希...

    MD5编码、MD5加密解密demo

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

    js版本的md5加密实现 转

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

Global site tag (gtag.js) - Google Analytics