參考文章:
密碼學與哈希
擴展長度攻擊
實驗要求如下:
構造 secret = “secrete” data = " message" Hash = md5 append = “whatever” 的攻擊串
登錄測驗代碼如下:(老師給的代碼是Python2的,我電腦上安裝的是python3.x,所以對于unquote的匯入和print的使用進行了一點適當修改) 改不來,傳入字串不知為何會出現亂碼而Python2貌似就沒有這個問題…
import hashlib
import sys
from urllib import unquote
def login(password, hash_val):
m = hashlib.md5()
secret_key = "secrete" # secret_key is a salt
m.update(secret_key + password)
# m.update(secret_key)
print m.hexdigest()
if(m.hexdigest() == hash_val):
print "Login Successful!"
else:
print "Login Failed"
if __name__ == "__main__":
password = unquote(sys.argv[1])
hash_val = unquote(sys.argv[2])
login(password, hash_val)
1. 正常登錄
首先在md5加密網站界面使用得到正常登錄的Hash值: 66331d29910ef42c7150e4110585343a (注意到python腳本得到的是小寫字母)

在命令列中測驗登錄成功:

2.password為空時的擴展長度攻擊
然后令password為空,在僅有密鑰的情況下得到的hash value:
36a5910394733b975acf825be4b26c5e(也可用1中的網址得到)

a)hashextension.c驗證
根據"secrete"字串長度為7,補足,并將長度欄位修改為7*8(decimal)=48(hexdecimal)
運行得到哈希值:
75403f802b3dd69f964837e256bcd2bf

hashextension.c 代碼如下:
#include <stdio.h>
#include <openssl/md5.h>
int main(int argc, const char *argv[])
{
MD5_CTX c;
unsigned char buffer[MD5_DIGEST_LENGTH];
int i;
MD5_Init(&c);
MD5_Update(&c, "secrete", 7);
MD5_Update(&c, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00"
"\x38\x00\x00\x00\x00\x00\x00\x00"
"message", 64);
/* MD5_Update(&c, "secrete", 7);
MD5_Update(&c, "message"
"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x70\x00\x00\x00\x00\x00\x00\x00"
"whatever", 65);*/
MD5_Final(buffer, &c);
for (i = 0; i < 16; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
將字串復制出來:
"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00"
"\x38\x00\x00\x00\x00\x00\x00\x00"
"message"
去掉引號,空格和回車,把\x替換為%,得到:
%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%38%00%00%00%00%00%00%00message(注意是沒有回車和換行的)
使用Python腳本測驗:

b)client.c驗證
使用哈希值36a5910394733b975acf825be4b26c5e,添加append資料“message”
得到哈希值75403f802b3dd69f964837e256bcd2bf可以看到與a)得到的哈希值一樣,證明沒有出錯,python腳本嘗試登錄結果相同,這里略去

client.c 代碼如下:
#include <stdio.h>
#include <openssl/md5.h>
int main(int argc, const char *argv[])
{
int i;
unsigned char buffer[MD5_DIGEST_LENGTH];
MD5_CTX c;
MD5_Init(&c);
MD5_Update(&c, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 64);
c.A = htonl(0x36a59103); /* <-- This is the hash we already had> */
c.B = htonl(0x94733b97);
c.C = htonl(0x5acf825b);
c.D = htonl(0xe4b26c5e);
// MD5_Update(&c, "append", 6); /* This is the appended data. */
MD5_Update(&c, "message", 7); /* This is the appended data. */
MD5_Final(buffer, &c);
for (i = 0; i < 16; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
3.password不為空時的擴展長度攻擊
然后令password為“message”,在僅有密鑰的情況下得到的哈希值:
66331d29910ef42c7150e4110585343a(也可用上述網站得到)

a)hashextension.c驗證
根據"secretemessage"字串長度為7+7=14,補足,并將長度欄位修改為14*8(decimal)=70(hexdecimal)
運行得到哈希值:
55fa0ec7c79c21499a1ffa95de587704

hashextension.c 代碼如下:
#include <stdio.h>
#include <openssl/md5.h>
int main(int argc, const char *argv[])
{
MD5_CTX c;
unsigned char buffer[MD5_DIGEST_LENGTH];
int i;
MD5_Init(&c);
MD5_Update(&c, "secrete", 7);
/*MD5_Update(&c, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00"
"\x38\x00\x00\x00\x00\x00\x00\x00"
"message", 64);*/
MD5_Update(&c, "secrete", 7);
MD5_Update(&c, "message"
"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x70\x00\x00\x00\x00\x00\x00\x00"
"whatever", 65);
MD5_Final(buffer, &c);
for (i = 0; i < 16; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
將字串復制出來:
"message"
"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x70\x00\x00\x00\x00\x00\x00\x00"
"whatever"
去掉引號,空格和回車,把\x替換為%,得到:
message%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%70%00%00%00%00%00%00%00whatever(注意是沒有回車和換行的)
使用Python腳本測驗:

b)client.c驗證
使用哈希值66331d29910ef42c7150e4110585343a,添加append資料“whatever”
得到哈希值55fa0ec7c79c21499a1ffa95de587704
可以看到與a)得到的哈希值一樣,證明沒有出錯,python腳本嘗試登錄結果相同,這里略去

client.c 代碼如下:
#include <stdio.h>
#include <openssl/md5.h>
int main(int argc, const char *argv[])
{
int i;
unsigned char buffer[MD5_DIGEST_LENGTH];
MD5_CTX c;
MD5_Init(&c);
MD5_Update(&c, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 64);
c.A = htonl(0x66331d29);
c.B = htonl(0x910ef42c);
c.C = htonl(0x7150e411);
c.D = htonl(0x0585343a);
// MD5_Update(&c, "append", 6); /* This is the appended data. */
MD5_Update(&c, "whatever", 8); /* This is the appended data. */
MD5_Final(buffer, &c);
for (i = 0; i < 16; i++) {
printf("%02x", buffer[i]);
}
printf("\n");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/302018.html
標籤:區塊鏈
上一篇:章魚網路劉毅:IBC 是跨鏈協議的黃金標準? | 算力智庫思想圓桌
下一篇:互聯網中的裂變是什么?
