hash碰撞(选做)
hash碰撞(选做)
查找资料,提供不少于3条md5算法和3条sh1算法的碰撞实例
1 提供数据和数据来源(图书,网站...)
2 用openssl命令验证碰撞,提交演示街头
MD5碰撞实例
实例1
来源:
these different 2 Images Has The Same MD5 Hash : DataHoarder (reddit.com)
两张完全不一样的图片,一张飞机,一张轮船,但是他们md5居然是相同的。
使用openssl验证:
实例2
HEX样本C:两段16进制样本,有少许不同,但是md5值相同。
-
样本1:
0e306561559aa787d00bc6f70bbdfe34
04cf03659e704f8534c00ffb659c4c87
40cc942feb2da115a3f4155cbb860749
7386656d7d1f34a42059d78f5a8dd1ef -
样本2:
0e306561559aa787d00bc6f70bbdfe34
04cf03659e744f8534c00ffb659c4c87
40cc942feb2da115a3f415dcbb860749
7386656d7d1f34a42059d78f5a8dd1ef
注意到这两个样本并不同,第二行和第三行都有明显不同。
使用openssl验证:
可以使用echo和xxd结合,不用输入\x就可以以十六进制输入到二进制文件中。
可以使用命令如echo "1234abcd" | xxd -r -ps > 1.bin写入二进制文件,或用于传给openssl计算哈希。
实例3
来源:
Peter Selinger: MD5 Collision Demo (dal.ca)
两个小二进制可执行文件,erase.exe和hello.exe,在win下能成功执行得到不同输出:
使用openssl验证:
可见两个不同的可执行文件是完全相同的md5值。
SHA-1碰撞实例
实例1
来源:
SHAttered
两个不同的pdf文件,具有相同的SHA-1哈希值。
实例2
来源:
SHA-1 is a Shambles (sha-mbles.github.io)
这个网站给出了一个选择前缀攻击,两个文件messageA和messageB内容不同,但具有相同SHA-1值。
- messageA:
0000000 99 04 0d 04 7f e8 17 80 01 20 00 ff 4b 65 79 20
0000020 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6c
0000040 6c 69 73 69 6f 6e 21 20 49 74 27 73 20 61 20 74
0000060 72 61 70 21 79 c6 1a f0 af cc 05 45 15 d9 27 4e
0000100 73 07 62 4b 1d c7 fb 23 98 8b b8 de 8b 57 5d ba
0000120 7b 9e ab 31 c1 67 4b 6d 97 43 78 a8 27 73 2f f5
0000140 85 1c 76 a2 e6 07 72 b5 a4 7c e1 ea c4 0b b9 93
0000160 c1 2d 8c 70 e2 4a 4f 8d 5f cd ed c1 b3 2c 9c f1
0000200 9e 31 af 24 29 75 9d 42 e4 df db 31 71 9f 58 76
0000220 23 ee 55 29 39 b6 dc dc 45 9f ca 53 55 3b 70 f8
0000240 7e de 30 a2 47 ea 3a f6 c7 59 a2 f2 0b 32 0d 76
0000260 0d b6 4f f4 79 08 4f d3 cc b3 cd d4 83 62 d9 6a
0000300 9c 43 06 17 ca ff 6c 36 c6 37 e5 3f de 28 41 7f
0000320 62 6f ec 54 ed 79 43 a4 6e 5f 57 30 f2 bb 38 fb
0000340 1d f6 e0 09 00 10 d0 0e 24 ad 78 bf 92 64 19 93
0000360 60 8e 8d 15 8a 78 9f 34 c4 6f e1 e6 02 7f 35 a4
0000400 cb fb 82 70 76 c5 0e ca 0e 8b 7c ca 69 bb 2c 2b
0000420 79 02 59 f9 bf 95 70 dd 8d 44 37 a3 11 5f af f7
0000440 c3 ca c0 9a d2 52 66 05 5c 27 10 47 55 17 8e ae
0000460 ff 82 5a 2c aa 2a cf b5 de 64 ce 76 41 dc 59 a5
0000500 41 a9 fc 9c 75 67 56 e2 e2 3d c7 13 c8 c2 4c 97
0000520 90 aa 6b 0e 38 a7 f5 5f 14 45 2a 1c a2 85 0d dd
0000540 95 62 fd 9a 18 ad 42 49 6a a9 70 08 f7 46 72 f6
0000560 8e f4 61 eb 88 b0 99 33 d6 26 b4 f9 18 74 9c c0
0000600 27 fd dd 6c 42 5f c4 21 68 35 d0 13 4d 15 28 5b
0000620 ab 2c b7 84 a4 f7 cb b4 fb 51 4d 4b f0 f6 23 7c
0000640 f0 0a 9e 9f 13 2b 9a 06 6e 6f d1 7f 6c 42 98 74
0000660 78 58 6f f6 51 af 96 74 7f b4 26 b9 87 2b 9a 88
0000700 e4 06 3f 59 bb 33 4c c0 06 50 f8 3a 80 c4 27 51
0000720 b7 19 74 d3 00 fc 28 19 a2 e8 f1 e3 2c 1b 51 cb
0000740 18 e6 bf c4 db 9b ae f6 75 d4 aa f5 b1 57 4a 04
0000760 7f 8f 6d d2 ec 15 3a 93 41 22 93 97 4d 92 8f 88
0001000 ce d9 36 3c fe f9 7c e2 e7 42 bf 34 c9 6b 8e f3
0001020 87 56 76 fe a5 cc a8 e5 f7 de a0 ba b2 41 3d 4d
0001040 e0 0e e7 1e e0 1f 16 2b db 6d 1e af d9 25 e6 ae
0001060 ba ae 6a 35 4e f1 7c f2 05 a4 04 fb db 12 fc 45
0001100 4d 41 fd d9 5c f2 45 96 64 a2 ad 03 2d 1d a6 0a
0001120 73 26 40 75 d7 f1 e0 d6 c1 40 3a e7 a0 d8 61 df
0001140 3f e5 70 71 88 dd 5e 07 d1 58 9b 9f 8b 66 30 55
0001160 3f 8f c3 52 b3 e0 c2 7d a8 0b dd ba 4c 64 02 0d
- messageB:
0000000 99 03 0d 04 7f e8 17 80 01 18 00 ff 50 72 61 63
0000020 74 69 63 61 6c 20 53 48 41 2d 31 20 63 68 6f 73
0000040 65 6e 2d 70 72 65 66 69 78 20 63 6f 6c 6c 69 73
0000060 69 6f 6e 21 1d 27 6c 6b a6 61 e1 04 0e 1f 7d 76
0000100 7f 07 62 49 dd c7 fb 33 2c 8b b8 c2 b7 57 5d be
0000120 c7 9e ab 2b e1 67 4b 7d b3 43 78 b4 cb 73 2f e1
0000140 89 1c 76 a0 26 07 72 a5 10 7c e1 f6 e8 0b b9 97
0000160 7d 2d 8c 68 52 4a 4f 9d 5f cd ed cd 0b 2c 9c e1
0000200 92 31 af 26 e9 75 9d 52 50 df db 2d 4d 9f 58 72
0000220 9f ee 55 33 19 b6 dc cc 61 9f ca 4f b9 3b 70 ec
0000240 72 de 30 a0 87 ea 3a e6 73 59 a2 ee 27 32 0d 72
0000260 b1 b6 4f ec c9 08 4f c3 cc b3 cd d8 3b 62 d9 7a
0000300 90 43 06 15 0a ff 6c 26 72 37 e5 23 e2 28 41 7b
0000320 de 6f ec 4e cd 79 43 b4 4a 5f 57 2c 1e bb 38 ef
0000340 11 f6 e0 0b c0 10 d0 1e 90 ad 78 a3 be 64 19 97
0000360 dc 8e 8d 0d 3a 78 9f 24 c4 6f e1 ea ba 7f 35 b4
0000400 c7 fb 82 72 b6 c5 0e da ba 8b 7c d6 55 bb 2c 2f
0000420 c5 02 59 e3 9f 95 70 cd a9 44 37 bf fd 5f af e3
0000440 cf ca c0 98 12 52 66 15 e8 27 10 5b 79 17 8e aa
0000460 43 82 5a 34 1a 2a cf a5 de 64 ce 7a f9 dc 59 b5
0000500 4d a9 fc 9e b5 67 56 f2 56 3d c7 0f f4 c2 4c 93
0000520 2c aa 6b 14 18 a7 f5 4f 30 45 2a 00 4e 85 0d c9
0000540 99 62 fd 98 d8 ad 42 59 de a9 70 14 db 46 72 f2
0000560 32 f4 61 f3 38 b0 99 23 d6 26 b4 f5 a0 74 9c d0
0000600 2b fd dd 6e 82 5f c4 31 dc 35 d0 0f 71 15 28 5f
0000620 17 2c b7 9e 84 f7 cb a4 df 51 4d 57 1c f6 23 68
0000640 fc 0a 9e 9d d3 2b 9a 16 da 6f d1 63 40 42 98 70
0000660 c4 58 6f ee e1 af 96 64 7f b4 26 b5 3f 2b 9a 98
0000700 e8 06 3f 5b 7b 33 4c d0 b2 50 f8 26 bc c4 27 55
0000720 0b 19 74 c9 20 fc 28 09 86 e8 f1 ff c0 1b 51 df
0000740 14 e6 bf c6 1b 9b ae e6 c1 d4 aa e9 9d 57 4a 00
0000760 c3 8f 6d ca 5c 15 3a 83 41 22 93 9b f5 92 8f 98
0001000 c2 d9 36 3e 3e f9 7c f2 53 42 bf 28 f5 6b 8e f7
0001020 3b 56 76 e4 85 cc a8 f5 d3 de a0 a6 5e 41 3d 59
0001040 ec 0e e7 1c 20 1f 16 3b 6f 6d 1e b3 f5 25 e6 aa
0001060 06 ae 6a 2d fe f1 7c e2 05 a4 04 f7 63 12 fc 55
0001100 41 41 fd db 9c f2 45 86 d0 a2 ad 1f 11 1d a6 0e
0001120 cf 26 40 6f f7 f1 e0 c6 e5 40 3a fb 4c d8 61 cb
0001140 33 e5 70 73 48 dd 5e 17 65 58 9b 83 a7 66 30 51
0001160 83 8f c3 4a 03 e0 c2 6d a8 0b dd b6 f4 64 02 1d
使用openssl验证:
实例3
来源:
sha 1 - SHA1 collision for first 32 bits for two different messages - Cryptography Stack Exchange
这只是一个弱碰撞,abc123_owlstead_1255
和abc123_owlstead_59131
的前32位哈希值相同。这个碰撞只包含哈希值的前32位,但是本来的消息就只有很短的两个字符串,所以还是不容小觑。
使用openssl验证:
实例4
来源:
PBKDF2+HMAC hash collisions explained · Mathias Bynens
这个实例是一个PBKDF2+HMAC的碰撞,给出了构造碰撞的方法,但可能不是一种SHA-1的碰撞,SHA-1的碰撞找到的没有md5的多。
两个字符串:plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
和eBkXQTfuBqp\'cTcar&g*
具有相同的hash值。
Python验证:
由于使用的是PBKDF2+HMAC,这里使用python验证。
用反查代码
源代码如下
#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
void md5hexToString(unsigned char *md,char *result){
// char tmp[3];
for (size_t i = 0; i <= 15; i++){
sprintf(result+i*2,"%02x",md[i]);
}
return;
}
int main(int argc, char const *argv[])
{
//存储md5的hex结果
unsigned char md[16] = {0};
//存储hex对应的字符串结果
char result[33] = {0};
char str[33] = {0};
printf("请输入小于6位的数字\n");
scanf("%s",str);
int len;
len = strlen(str);
MD5(str,len,md);
md5hexToString(md,result);
printf("%s\n",result);
//碰撞
char result1[33] = {0};
char str1[33] = {0};
int i;
for(i=0;i<=99999;i++)
{
sprintf(str1,"%d",i);
printf("%s\n",str1);
len = strlen(str1);
MD5(str1,len,md);
md5hexToString(md,result1);
printf("%s\n",result1);
if(strcmp(result1,result)==0)
break;
}
printf("MD5碰撞得出输入为:%d\n",i);
// scanf("%s",str1);
return 0;
}