protected static final int getHash(byte [] data, int off, int len) { int k = 147; try{ for(int l = off + len; l > off;) k = k * 147 ^ data[--l]; return k; } catch(Throwable throwable){ return k; } } 如果给出一个int的值,如何反过来得到data的值呢。 征求算法!!!
道理很简单,这应该是一个“摘要算法”,把一个任意长度的信息摘要成为一个固定宽度(本算法中就是一个 int 的大小)的值。我们知道,MD5 就是一个经典的摘要算法。
摘要算法当然是不可逆的。
然后,又仔细看了看这个算法,发现它是一个简单的递推算法,这样的话,在某些情况下也许是可以反推的。
我写了一段程序,把算法的过程显示了出来,这样,就很容易看出 k 的计算过程了。比如,当原字符串为 "src" 的时候,计算过程是这样的:
k c k*147 k*147^c
00000093 c 63 0000000000005469 000000000000540A
0000540A r 72 00000000003041BE 00000000003041CC
003041CC s 73 000000001BB5C824 000000001BB5C857
protected static final int getHash(byte[] data, int off, int len) {
int k = 147;
try {
System.out.printf("%-8s\t%-2s\t%-16s\t%-16s\r\n", "k", "c", "k*147", "k*147^c");
for (int l = off + len; l > off;) {
int c = data[--l];
System.out.printf("%08X\t%c %02X\t%016X\t%016X\r\n", k, c, c, k*147, ((long)k*147)^c);
k = (k * 147) ^ c;
}
return k;
} catch (Throwable throwable) {
return k;
}
}
protected static char guess(int k) {
char c = '?';
int b = k / 147;
for (int i=0; i<2; i++) {
int k2 = (b+i) * 147;
c = (char)(k2 ^ k);
System.out.printf("guess: %d: %08X\t%08X\t%02X\r\n", i, k, k2, (byte)c);
if (c >= ' ' && c <= '~') break;
}
return c;
}
protected static String decode(int k) {
String plain = "";
int i = 0;
while (true) {
char c = guess(k);
plain += c;
k = (k^c)/147;
if (++i > 10 || k==147) break;
}
提供一些例子。望各位出手
30431e id
26ef2ce3 title
bea8f922 align
1bb5c857 src
1bbc18f0 alt
ea6d7c86 href
2880a8e2 value
e9a39a2b type
e9a04f90 name
2dc86ad3 maxlength
e9a7395a size
eb7b28b6 method