Sha-1

兩條不同消息的前 32 位的 SHA1 衝突

  • September 13, 2019

是否可以創建一個程序來使用 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).

引用自:https://crypto.stackexchange.com/questions/34575