如何使用 7 位密鑰的 MD5 雜湊來暴力破解 sqlcipher 加密文件?
我有一個使用 sqlcipher 和 MD5 雜湊加密的數據庫文件。據我了解,Sqlcipher 提供 256 位 AES 加密。密鑰長度為 7 位。我該如何暴力破解它?
正如 SEJPM 在他的評論中已經暗示的那樣,一個 7 位的密鑰足夠短,可以進行簡單的暴力攻擊,因為只有 128 個不同的密鑰需要測試。
提示:7 位 =
1111111
= 127,密鑰 + 10000000
= 128 個可能的密鑰。即使在使用資源較少的設備時,測試 128 個不同的密鑰以找到正確的密鑰也應該是一項非常快速且容易處理的任務。
如果密鑰比這更長——例如:7 個字節——暴力破解所有密鑰的時間將與位數成倍增長。繼續範例:7 字節 = 7 * 8 位 = 56 位,這意味著普通的暴力攻擊最多需要測試 $ 2^{56} $ 鍵,沸騰到 $ 7.2057594037927936e16 $ (= 72,057,594,037,927,936) 不同的密碼來檢查……與暴力破解一個簡單的 7 位密鑰相比,這使得暴力破解變得相當不可行。
有關暴力攻擊的更多資訊,您可能需要查看brute-force-attack標籤下列出的問答和/或閱讀相關的 Wikipedia 文章。
如何…
實際上,您只需要創建所有可能密鑰的列表,並嘗試通過逐個瀏覽該列表來解密密文,直到明文類似於/適合您期望的解密文件數據。(由於您沒有提到要解密的文件類型,我假設您能夠比較解密結果以查看解密的數據是否確實符合預期的明文。)
無論您使用何種程式或腳本語言,這些步驟都很簡單。在這種情況下,您甚至可以手動執行此操作,因為您最多只需要測試 128 個不同的鍵:
- 密文 $ \rightarrow $ 使用具有 7 位值
0000000
(十六進制0x00
:)的密鑰解密 解密的數據是否符合預期的明文?如果“是”,您就找到了鑰匙。如果“否”,則測試下一個鍵。
- 密文 $ \rightarrow $ 使用具有 7 位值
0000001
(十六進制0x01
:)的密鑰解密 解密的數據是否符合預期的明文?如果“是”,您就找到了鑰匙。如果“否”,則測試下一個鍵。
- 密文 $ \rightarrow $ 使用具有 7 位值
0000010
(十六進制0x02
:)的密鑰解密 解密的數據是否符合預期的明文?如果“是”,您就找到了鑰匙。如果“否”,則測試下一個鍵。
- …
- 密文 $ \rightarrow $ 使用具有 7 位值
1111111
(十六進制0x7F
:)的密鑰解密 解密的數據是否符合預期的明文?如果“是”,您就找到了鑰匙。如果“否”,則正確的解密密鑰不是 7 位,或者您在創建測試密鑰時犯了一個錯誤(問自己:您確定您提供的是 7 位密鑰而不是其他密鑰嗎?),或者您有在將解密結果與您期望的明文進行比較時,只是錯過了正確的密鑰和解密結果。畢竟,這是一個 7 位密鑰可以擁有的最大密鑰值。
這裡的所有都是它的。
編輯
當您更新了問題並添加了使用 MD5 對 7 位密鑰進行雜湊處理的資訊時……請務必不要測試純 7 位密鑰,而是要測試
MD5(potential-key)
。除此之外,它不會影響我上面描述的方法。虛擬碼:
for(i=0;i<128;i++) { t = sqlcipherDecrypt(ciphertext, MD5(potential-7-bit-key[i])); if(verifyDecryptionResult(t) === TRUE) { output("Found valid key:" + potential-7-bit-key[i])); exit; } }
在哪裡
verifyDecryptionResult
很大程度上取決於您期望純文字是什麼文件格式。這個函式可以直言不諱地試圖用某個程序打開解密結果,或者將解密結果與已經可用的明文進行比較,或類似的功能。任何可以幫助您檢查解密結果是否符合您的要求的東西。列出所有選項將過於寬泛,但這應該有助於您掌握虛擬碼背後的一般概念以及如何暴力破解事物。