Aes
是否可以在給定密鑰的一部分、密文、初始化向量和加密模式的情況下找到 AES 密鑰?
給出了以下詳細資訊:
- 部分密鑰:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011
- 初始化向量:
E898EF8E91F8C9B201E6E29DF87EE152
- 密文塊 1:
14B8D1412766A8520BACE4598F8AFAEE
- 密文塊 2:
7E687A49015FA6F1B914635325A6361B
- 密文塊 3:
8AD191394EF79CEC4B5A256313632CD4
- 密文塊 4:
8BB4D49F3FA7A917CDF02ECCAA8C4765
- CBC模式無填充
- 字元集:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890⌴‛~@#$%^&*(){}[]+=-_<>,.?/!:\;’|"
- 字元集資訊:範圍 [32,127),ASCII 編碼,每個字元為 8 位
我的想法是,您需要以某種方式使用已知的 32 位密鑰中的每一個來解密每個密文塊並進行處理。問題是第一個密文塊有一個不匹配的密鑰(XXX …)
因此,您將獲得除前 32 位之外的所有已知字元的純文字。
可以實現搜尋 32 位鍵空間嗎?
帶有 AES-NI 的 OpenSSL 可以在我的機器上每 3 秒在 CBC 模式下對 64 字節塊 AES-128 執行 61510120 次迭代。
執行
openssl speed -evp AES128
以查看您的機器。這使得 $ 2^{26} $ 鍵空間三秒鐘。一需要 $ 2^{6} =64*3 $ 幾秒鐘就可以找到具有良好編碼的關鍵候選者。
為您的事業創建 3 個功能;
- $ P = \operatorname{AES-Dec-CBC}(k, IV, C) $ 在哪裡 $ C $ 是密文塊和 $ P $ 是目前密鑰下的解密明文 $ k $ 的 $ C $ .
- $ k =\operatorname{GetNextCandidateKey(current)} $ 這個簡單的增加電流並創建一個鍵 $ k = current\mathbin|1100\cdots011 $ 以二進制形式。您需要將其轉換為二進制以適應標準加密庫
- $ b = \operatorname{CheckTheMessage}(P) $ . 此函式獲取明文並檢查字節是否在範圍內。如果不返回
0
,否則返回1
現在有了這三個功能;
current = -1 while current < 2^32 do: k = GetNextCandidateKey(current) P = AES-Dec-CBC(k, IV, C) b = CheckTheMessage(P) if b == 1 print(current) current++