2011-03-09 68 views
2

任何人都可以识别这个散列函数吗?它是用Javascript编写的。我想用另一种语言(PHP)复制它。我很难相信这是一个乏味的功能,因为这是一个人写的。该函数被称为“cValue”...也许这将有所帮助。提前致谢!你能识别用JavaScript编写的哈希函数吗?

function (s) { 
    function L(b, a) { 
     return (b << a) | (b >>> (32 - a)) 
    } 
    function K(k, b) { 
     var F, a, d, x, c; 
     d = (k & 2147483648); 
     x = (b & 2147483648); 
     F = (k & 1073741824); 
     a = (b & 1073741824); 
     c = (k & 1073741823) + (b & 1073741823); 
     if (F & a) { 
      return (c^2147483648^d^x) 
     } 
     if (F | a) { 
      if (c & 1073741824) { 
       return (c^3221225472^d^x) 
      } else { 
       return (c^1073741824^d^x) 
      } 
     } else { 
      return (c^d^x) 
     } 
    } 
    function r(a, c, b) { 
     return (a & c) | ((~a) & b) 
    } 
    function q(a, c, b) { 
     return (a & b) | (c & (~b)) 
    } 
    function p(a, c, b) { 
     return (a^c^b) 
    } 
    function n(a, c, b) { 
     return (c^(a | (~b))) 
    } 
    function u(G, F, aa, Z, k, H, I) { 
     G = K(G, K(K(r(F, aa, Z), k), I)); 
     return K(L(G, H), F) 
    } 
    function f(G, F, aa, Z, k, H, I) { 
     G = K(G, K(K(q(F, aa, Z), k), I)); 
     return K(L(G, H), F) 
    } 
    function D(G, F, aa, Z, k, H, I) { 
     G = K(G, K(K(p(F, aa, Z), k), I)); 
     return K(L(G, H), F) 
    } 
    function t(G, F, aa, Z, k, H, I) { 
     G = K(G, K(K(n(F, aa, Z), k), I)); 
     return K(L(G, H), F) 
    } 
    function e(k) { 
     var G; 
     var d = k.length; 
     var c = d + 8; 
     var b = (c - (c % 64))/64; 
     var F = (b + 1) * 16; 
     var H = Array(F - 1); 
     var a = 0; 
     var x = 0; 
     while (x < d) { 
      G = (x - (x % 4))/4; 
      a = (x % 4) * 8; 
      H[G] = (H[G] | (k.charCodeAt(x) << a)); 
      x++ 
     } 
     G = (x - (x % 4))/4; 
     a = (x % 4) * 8; 
     H[G] = H[G] | (128 << a); 
     H[F - 2] = d << 3; 
     H[F - 1] = d >>> 29; 
     return H 
    } 
    function B(c) { 
     var b = "", 
      d = "", 
      k, a; 
     for (a = 0; a <= 3; a++) { 
      k = (c >>> (a * 8)) & 255; 
      d = "0" + k.toString(16); 
      b = b + d.substr(d.length - 2, 2) 
     } 
     return b 
    } 
    function J(b) { 
     b = b.replace(/\r\n/g, "\n"); 
     var a = ""; 
     for (var k = 0; k < b.length; k++) { 
      var d = b.charCodeAt(k); 
      if (d < 128) { 
       a += String.fromCharCode(d) 
      } else { 
       if ((d > 127) && (d < 2048)) { 
        a += String.fromCharCode((d >> 6) | 192); 
        a += String.fromCharCode((d & 63) | 128) 
       } else { 
        a += String.fromCharCode((d >> 12) | 224); 
        a += String.fromCharCode(((d >> 6) & 63) | 128); 
        a += String.fromCharCode((d & 63) | 128) 
       } 
      } 
     } 
     return a 
    } 
    var C = Array(); 
    var P, h, E, v, g, Y, X, W, V; 
    var S = 7, 
     Q = 12, 
     N = 17, 
     M = 22; 
    var A = 5, 
     z = 9, 
     y = 14, 
     w = 20; 
    var o = 4, 
     m = 11, 
     l = 16, 
     j = 23; 
    var U = 6, 
     T = 10, 
     R = 15, 
     O = 21; 
    s = J(s); 
    C = e(s); 
    Y = 1732584193; 
    X = 4023233417; 
    W = 2562383102; 
    V = 271733878; 
    for (P = 0; P < C.length; P += 16) { 
     h = Y; 
     E = X; 
     v = W; 
     g = V; 
     Y = u(Y, X, W, V, C[P + 0], S, 3614090360); 
     V = u(V, Y, X, W, C[P + 1], Q, 3905402710); 
     W = u(W, V, Y, X, C[P + 2], N, 606105819); 
     X = u(X, W, V, Y, C[P + 3], M, 3250441966); 
     Y = u(Y, X, W, V, C[P + 4], S, 4118548399); 
     V = u(V, Y, X, W, C[P + 5], Q, 1200080426); 
     W = u(W, V, Y, X, C[P + 6], N, 2821735955); 
     X = u(X, W, V, Y, C[P + 7], M, 4249261313); 
     Y = u(Y, X, W, V, C[P + 8], S, 1770035416); 
     V = u(V, Y, X, W, C[P + 9], Q, 2336552879); 
     W = u(W, V, Y, X, C[P + 10], N, 4294925233); 
     X = u(X, W, V, Y, C[P + 11], M, 2304563134); 
     Y = u(Y, X, W, V, C[P + 12], S, 1804603682); 
     V = u(V, Y, X, W, C[P + 13], Q, 4254626195); 
     W = u(W, V, Y, X, C[P + 14], N, 2792965006); 
     X = u(X, W, V, Y, C[P + 15], M, 1236535329); 
     Y = f(Y, X, W, V, C[P + 1], A, 4129170786); 
     V = f(V, Y, X, W, C[P + 6], z, 3225465664); 
     W = f(W, V, Y, X, C[P + 11], y, 643717713); 
     X = f(X, W, V, Y, C[P + 0], w, 3921069994); 
     Y = f(Y, X, W, V, C[P + 5], A, 3593408605); 
     V = f(V, Y, X, W, C[P + 10], z, 38016083); 
     W = f(W, V, Y, X, C[P + 15], y, 3634488961); 
     X = f(X, W, V, Y, C[P + 4], w, 3889429448); 
     Y = f(Y, X, W, V, C[P + 9], A, 568446438); 
     V = f(V, Y, X, W, C[P + 14], z, 3275163606); 
     W = f(W, V, Y, X, C[P + 3], y, 4107603335); 
     X = f(X, W, V, Y, C[P + 8], w, 1163531501); 
     Y = f(Y, X, W, V, C[P + 13], A, 2850285829); 
     V = f(V, Y, X, W, C[P + 2], z, 4243563512); 
     W = f(W, V, Y, X, C[P + 7], y, 1735328473); 
     X = f(X, W, V, Y, C[P + 12], w, 2368359562); 
     Y = D(Y, X, W, V, C[P + 5], o, 4294588738); 
     V = D(V, Y, X, W, C[P + 8], m, 2272392833); 
     W = D(W, V, Y, X, C[P + 11], l, 1839030562); 
     X = D(X, W, V, Y, C[P + 14], j, 4259657740); 
     Y = D(Y, X, W, V, C[P + 1], o, 2763975236); 
     V = D(V, Y, X, W, C[P + 4], m, 1272893353); 
     W = D(W, V, Y, X, C[P + 7], l, 4139469664); 
     X = D(X, W, V, Y, C[P + 10], j, 3200236656); 
     Y = D(Y, X, W, V, C[P + 13], o, 681279174); 
     V = D(V, Y, X, W, C[P + 0], m, 3936430074); 
     W = D(W, V, Y, X, C[P + 3], l, 3572445317); 
     X = D(X, W, V, Y, C[P + 6], j, 76029189); 
     Y = D(Y, X, W, V, C[P + 9], o, 3654602809); 
     V = D(V, Y, X, W, C[P + 12], m, 3873151461); 
     W = D(W, V, Y, X, C[P + 15], l, 530742520); 
     X = D(X, W, V, Y, C[P + 2], j, 3299628645); 
     Y = t(Y, X, W, V, C[P + 0], U, 4096336452); 
     V = t(V, Y, X, W, C[P + 7], T, 1126891415); 
     W = t(W, V, Y, X, C[P + 14], R, 2878612391); 
     X = t(X, W, V, Y, C[P + 5], O, 4237533241); 
     Y = t(Y, X, W, V, C[P + 12], U, 1700485571); 
     V = t(V, Y, X, W, C[P + 3], T, 2399980690); 
     W = t(W, V, Y, X, C[P + 10], R, 4293915773); 
     X = t(X, W, V, Y, C[P + 1], O, 2240044497); 
     Y = t(Y, X, W, V, C[P + 8], U, 1873313359); 
     V = t(V, Y, X, W, C[P + 15], T, 4264355552); 
     W = t(W, V, Y, X, C[P + 6], R, 2734768916); 
     X = t(X, W, V, Y, C[P + 13], O, 1309151649); 
     Y = t(Y, X, W, V, C[P + 4], U, 4149444226); 
     V = t(V, Y, X, W, C[P + 11], T, 3174756917); 
     W = t(W, V, Y, X, C[P + 2], R, 718787259); 
     X = t(X, W, V, Y, C[P + 9], O, 3951481745); 
     Y = K(Y, h); 
     X = K(X, E); 
     W = K(W, v); 
     V = K(V, g) 
    } 
    var i = B(Y) + B(X) + B(W) + B(V); 
    return i.toLowerCase() 
}; 
+0

**你为什么要复制它? – amosrivera 2011-03-09 22:23:30

+0

我需要执行相同的哈希服务器端。 – Nate 2011-03-09 22:24:31

+0

此代码看起来像是故意模糊处理以防止您想要执行的操作。你最好的选择是跟踪原始的源代码,或者用你选择的语言逐行重写它。 – 2011-03-09 22:26:13

回答

8

定义这个功能a()

var a = /* what you posted */ 

,并调用以下:

a('test'); 
a('plop'); 
a('this is another test just to be sure'); 

我得到以下三个结果:

098f6bcd4621d373cade4e832627b4f6 
64a4e8faed1a1aa0bf8bf0fc84938d25 
17733df129ee53bd321a323b0ae55401 


32个字符长的字符串立即看起来像md5 hash;但让我们再验证一下。


调用这个在PHP:

var_dump(md5('test')); 
var_dump(md5('plop')); 
var_dump(md5('this is another test just to be sure')); 

我得到以下输出:

string '098f6bcd4621d373cade4e832627b4f6' (length=32) 
string '64a4e8faed1a1aa0bf8bf0fc84938d25' (length=32) 
string '17733df129ee53bd321a323b0ae55401' (length=32) 

这是三个完全相同的结果。


当然,只有三个测试不是很多,你应该做更多的事情来确定...但是,据我不能告诉,你的函数似乎是计算MD5散列 - 相应的PHP函数是md5() ;-)

+0

你太帅气了。我测试了更多,但这是疯狂的承诺。谢谢! – Nate 2011-03-09 22:31:32

+0

@Nate:不客气:-)玩得开心! *(与此同时,我已经用另外两个测试编辑了我的答案,作为预防措施)* – 2011-03-09 22:32:36

+0

这是MD5。转换矩阵是什么让它离开。以下是原始算法:http://www.faqs.org/rfcs/rfc1321.html - 参考'/ * Constants for MD5Transform routine .' lines,对应于'var S = 7,...'行。 – balupton 2011-03-10 00:22:54

0

由于在函数K()中使用XOR和调用函数的多阶段过程都使用K(),我最好的猜测是这是一个实现一些加密算法。另外,由于只似乎是一个多阶段的功能,它很可能是某种形式的哈希生成,如MD5