能力值:
( LV2,RANK:10 )
2 楼
看看王小云的MD5破解论文 你会受益匪浅的
能力值:
(RANK:210 )
3 楼
除了穷举好像没别的好办法了吧。
能力值:
( LV12,RANK:779 )
4 楼
由crchead, crcfinal可快速得出1个32bit的值,这个32 bit是可逆的。
附件是我写的一个工具。
比如:
crchead = 0xFFFFFFFF;
crcfianl = 0xDEADBEEF;
5 byte, 每个byte范围 0 - FF,
则符合值为:
004E3726D4
01D80721A3
026256283A
...
FE55E8238E
FFC3D824F9
它们的crc都是
0xDEADBEEF
参考:
http://www.pediy.com/bbshtml/BBS6/pediy6937.htm
上传的附件:
能力值:
(RANK:1130 )
5 楼
太强了, 膜拜
能力值:
(RANK:350 )
6 楼
这工具收下来了,准备更新到主页上去
能力值:
( LV4,RANK:50 )
7 楼
强人,我看鬼子的软件实现了这样的算法,在网上也找到了一些e文资料,正琢磨是啃资料还是逆向哪个更省劲呢。没想到您已经做的这么完美了,谢谢您的工具,也谢谢能所给的引用,它比消化哪个e文资料轻松多了。
能力值:
( LV2,RANK:10 )
8 楼
认真学习一下
能力值:
( LV9,RANK:680 )
9 楼
还用不到,但是以后用得着时就方便了,呵呵,谢谢,收下了!
能力值:
( LV2,RANK:10 )
10 楼
楼上的头像好像在哪见过.
能力值:
( LV4,RANK:50 )
11 楼
那篇引用帖子不是太好琢磨啊,兄弟能否给发一份crc 求逆的代码?
能力值:
( LV12,RANK:779 )
12 楼
下面是crc32/ crc16求逆的代码。
其实就是DonQuixote的: CRC32碰撞的实现。做了以下改进。
以前看过一个软件注册算法用到了crc16的逆,crc16的逆就更简单了。
全部采用的查表法,速度较快。
首先构造tab/ rf_tab。rf_tab是求逆的表。 typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
#define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKEDWORD(a, b) ((DWORD)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define MakeWord(a,b) MAKEWORD(b,a)
#define MakeDWord(a,b) MAKEDWORD(b,a) // crc32/ crc16 funs
#define CRC32_NEW (0xFFFFFFFFUL)
#define CRC32_POLY (0xEDB88320UL)
#define CRC16_NEW (unsigned short)(0xFFFF)
#define CRC16_POLY (unsigned short)(0x8408)
#define CRC16_STD_POLY (unsigned short)(0xA001) unsigned int crc32_tab[256];
unsigned short crc16_tab[256];
unsigned char crc32_rf[256];
unsigned char crc16_rf[256];
void init_crc32_table(unsigned int poly)
{
unsigned int i,j;
unsigned int crc;
for( i = 0; i < 256; i ++ ) {
crc = i;
for( j = 0; j < 8; j ++ ){
if(crc & 1) crc = (crc >> 1) ^ poly;
else crc >>= 1;
}
crc32_tab[i] = crc;
}
return;
}
void init_crc32_rf_table(void)
{
unsigned int i,j;
for(i=0; i<256; i++) {
j = HIBYTE(HIWORD(crc32_tab[i]));
crc32_rf[j] = i;
}
return;
}
/* must init_crc32_rf_table() first */
#define RF(x) crc32_rf[(BYTE) x]
#define F(x) HIBYTE(HIWORD(crc32_tab[(BYTE) x]))
#define G(x) LOBYTE(HIWORD(crc32_tab[(BYTE) x]))
#define H(x) HIBYTE(LOWORD(crc32_tab[(BYTE) x]))
#define I(x) LOBYTE(LOWORD(crc32_tab[(BYTE) x]))
/*
given crc_head = ABCD
find abcd;
that crc(abcd) = WXYZ
*/
unsigned int rCRC32(unsigned int WXYZ,unsigned int ABCD)
{
BYTE p,o,n,m,a,b,c,d,W,X,Y,Z,A,B,C,D;
W=HIBYTE(HIWORD(WXYZ));
X=LOBYTE(HIWORD(WXYZ));
Y=HIBYTE(LOWORD(WXYZ));
Z=LOBYTE(LOWORD(WXYZ));
A=HIBYTE(HIWORD(ABCD));
B=LOBYTE(HIWORD(ABCD));
C=HIBYTE(LOWORD(ABCD));
D=LOBYTE(LOWORD(ABCD));
p=crc32_rf[W];
o=crc32_rf[(BYTE) (X^G(p))];
n=crc32_rf[(BYTE) (Y^G(o)^H(p))];
m=crc32_rf[(BYTE) (Z^G(n)^H(o)^I(p))];
d=m^D;
c=n^C^I(m);
b=o^B^H(m)^I(n);
a=p^A^G(m)^H(n)^I(o);
return MakeDWord(MakeWord(a,b),MakeWord(c,d));
} #define FF(x) HIBYTE(crc16_tab[(unsigned char)x])
#define GG(x) LOBYTE(crc16_tab[(unsigned char)x])
void init_crc16_table(unsigned short poly)
{
unsigned int i,j;
unsigned short crc;
for( i = 0; i < 256; i ++ ) {
crc = i;
for( j = 0; j < 8; j ++ ){
if(crc & 1) crc = (crc >> 1) ^ poly;
else crc >>= 1;
}
crc16_tab[i] = crc;
}
return;
}
void init_crc16_rf_table(void)
{
unsigned int i,j;
for(i=0; i<256; i++) {
j = HIBYTE(crc16_tab[i]);
crc16_rf[j] = i;
}
return;
}
unsigned short rCRC16(unsigned short XY, unsigned short AB)
{
BYTE X,Y,A,B,a,b,m,n;
X=HIBYTE(XY);
Y=LOBYTE(XY);
A=HIBYTE(AB);
B=LOBYTE(AB);
n=crc16_rf[X];
m=crc16_rf[(BYTE) (Y^GG(n))];
b=m^B;
a=n^A^GG(m);
return MakeWord(a,b);
}
能力值:
( LV12,RANK:779 )
13 楼
前面的crc3x是可以指定范围的。
比如12字节,len=12
范围
'1' - '9'
CHAR:
0x31 - 0x39
想要多少个,NUM填示例数目。
比如我要5个实例,num = 5.
crc32 = 0x12345678
数据会自动保存在 crc32x-yyyymmdd-hh-mm.txt
CRC32x-20080619-2208.txt
116534385183
126488432389
131875263511
177354617145
188428597511
能力值:
( LV2,RANK:10 )
14 楼
谢谢你的分享
说说我的理解
文章所说的意思是:
x: CRCSTart
y: 要计算CRC值的目标数
z: 最终的CRC值
x,y,z 是int32
只要知道 x,y,z的任两个,都可以快速的求出余下的一个,我验证了以下那个程序,确实是这样
但是如何能够做到指定范围呢?如要求其逆是可见字符?正如你的工具所实现的那样
能力值:
( LV2,RANK:10 )
15 楼
膜拜强人,学习一下
能力值:
( LV4,RANK:50 )
16 楼
终于看明白了,看来脑子长久不思考真的会生锈!还是要经常磨磨的
能力值:
( LV2,RANK:10 )
17 楼
不错!学习一下!谢谢!
能力值:
( LV13,RANK:970 )
18 楼
膜拜一下。回头看发展一个MD5的,以后根据一个MD5值争取把一个DVD给还原出来