Sha-1
兩條不同消息的前 32 位的 SHA1 衝突
是否可以創建一個程序來使用 sha1 散列查找具有相同前 32 位的 2 條不同消息的衝突?我嘗試使用 while 循環,但它無休止地執行,好像沒有找到匹配項。我正在用 Java 做這個。這 2 條消息必須包含“abc123”。
我的 while 邏輯是在字元串末尾添加一個數字,但它失敗了。
下面是我的 sha1 散列(姑且稱之為)虛擬碼:
public static String sha1Hashing (String message) { String sha1 = ""; StringBuffer sb = new StringBuffer(); try { MessageDigest mDigest = MessageDigest.getInstance("SHA1"); byte[] result = mDigest.digest(message.getBytes()); for (int i = 0; i < result.length; i++) { sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1)); } } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } //return first 32 char sha1 = sb.toString().substring(0,32); return sha1; }
要找到碰撞,最好執行生日攻擊(正如我已經在問題下方評論過的那樣)。
您可以使用
abc123
作為前綴,然後附加一個計數器(使用任何編碼),創建要散列的消息。然後,您將計算消息的雜湊值並獲取前 4 個字節。您將使用 4 字節散列作為鍵(例如編碼為十六進制)和消息創建映射。現在您只需添加這些鍵/值對,直到找到重複的鍵。在這種情況下,您列印出目前消息和地圖中的消息,當然還有您發現的雜湊衝突。
由於生日問題,您希望在不到一秒的時間內找到匹配項,並且記憶體使用量最少。
證明:
Found match: abc123_owlstead_1255 and abc123_owlstead_59131 -> 992156E0 That took approximately 430 milli seconds
請注意,如果您將此作為答案發布,“owlstead”這個詞應該會引發一些問題,Google會很快找到這個答案。所以如果我是你,我不會複製粘貼這個答案。
可以找到具有相同前 32 位 sha1 的 2 個字元串。例如,十六進製字元串 616263313233bffa0000 和 616263313233e6280100 的 sha1 的前 32 位都是 e5c993e0。您可以使用生日攻擊。
substring(0,32)
給你前 32 個字節。您需要前 32 位或前 8 個字節。你應該使用substring(0,8)
.