首页
论坛
专栏
课程

[密码学] [己解决]根据CRC32值,是否能够快速获得其原始值?

2008-6-18 08:32 11542

[密码学] [己解决]根据CRC32值,是否能够快速获得其原始值?

2008-6-18 08:32
11542
有一个CRC32的值,是否能够快速获取其原始值?
CRC是多对一映射,能够回复其中的n个就可以了

查了一些资料,没找到其源码,恳请大侠指教

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (17)
xxyyzasabc 2008-6-18 10:39
2
0
看看王小云的MD5破解论文 你会受益匪浅的
zhuliang 5 2008-6-18 12:40
3
0
除了穷举好像没别的好办法了吧。
readyu 8 2008-6-18 17:04
4
0
由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
上传的附件:
海风月影 17 2008-6-18 17:54
5
0
太强了, 膜拜
kanxue 8 2008-6-18 19:27
6
0
这工具收下来了,准备更新到主页上去
arryang 1 2008-6-18 22:55
7
0
强人,我看鬼子的软件实现了这样的算法,在网上也找到了一些e文资料,正琢磨是啃资料还是逆向哪个更省劲呢。没想到您已经做的这么完美了,谢谢您的工具,也谢谢能所给的引用,它比消化哪个e文资料轻松多了。
zhucheba 2008-6-19 09:33
8
0
认真学习一下
playboysen 16 2008-6-19 11:40
9
0
还用不到,但是以后用得着时就方便了,呵呵,谢谢,收下了!
garasmc 2008-6-19 13:04
10
0
楼上的头像好像在哪见过.
arryang 1 2008-6-19 16:34
11
0
那篇引用帖子不是太好琢磨啊,兄弟能否给发一份crc 求逆的代码?
readyu 8 2008-6-19 21:49
12
0
下面是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);
}
readyu 8 2008-6-19 22:02
13
0
前面的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
allnew 2008-6-20 09:59
14
0
谢谢你的分享
说说我的理解
文章所说的意思是:
x: CRCSTart
y: 要计算CRC值的目标数
z: 最终的CRC值
x,y,z 是int32

只要知道 x,y,z的任两个,都可以快速的求出余下的一个,我验证了以下那个程序,确实是这样

但是如何能够做到指定范围呢?如要求其逆是可见字符?正如你的工具所实现的那样
小菜要飞 2008-6-20 10:18
15
0
膜拜强人,学习一下
arryang 1 2008-6-20 16:49
16
0
终于看明白了,看来脑子长久不思考真的会生锈!还是要经常磨磨的
bstzxy 2008-6-23 12:16
17
0
不错!学习一下!谢谢!
nbw 24 2008-6-23 18:57
18
0
膜拜一下。回头看发展一个MD5的,以后根据一个MD5值争取把一个DVD给还原出来
游客
登录 | 注册 方可回帖
返回