幫助我了解如何進行有關 AES/CBC 的加密分配
我正在學習 Dan Boneh 的 Coursera 密碼學課程。我正在嘗試完成第 2 週的程式作業,但我認為我對理論、實際實現或兩者都有某種誤解。我既不是加密貨幣專家也不是 python 專家,所以我確定我把兩者都搞砸了。
本質上,我試圖在給定密鑰的情況下解密一些密文。聽起來很簡單。我們得到:
在這個項目中,您將實現兩個加密/解密系統,一個在 CBC 模式下使用 AES,另一個在計數器模式 (CTR) 下使用 AES。在這兩種情況下,16 字節的加密 IV 都是隨機選擇的,並預先添加到密文中。(我只是先做CBC)
CBC 密鑰:140b41b22a29beb4061bda66b6747e14
CBC密文:4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
我們還被告知:16 字節的加密 IV 是隨機選擇的,並添加到密文之前。
所以我將通過一個例子來說明我在前兩個塊中所做的事情。IV 是 16 位的並且是前置的,所以它是密文的前 16 個字元:
IV = 4ca00ff4c898d61e
接下來,我嘗試解密下一個塊,即密文的位置 16-31(0 索引):
C$$ 0 $$= 1edbf1800618fb28
我相信這應該如何工作是 m 的明文
$$ 0 $$應該: $$ m[0] = (c[0] \oplus k) \oplus IV $$
實際上,我的演講幻燈片說的是:
$$ m[0] = D(k, c[0]) \oplus IV $$
然後對於以下塊,只需將索引增加 1:$$ m[i] = D(k, c[i]) \oplus c[i-1] $$
但我不是 100% 確定“D”實際上是什麼(是的,解密……但它是異或嗎?還有別的嗎?)。當我輪流計算每一個時,我只是胡言亂語。如果我的理解是正確的(目前層的解密只是 xoring c
$$ i $$用鑰匙),那麼它可能是一個實施問題? 我也有點不確定是否將密鑰與塊進行異或運算。我知道 IV 應該與塊 (16) 的長度相同,但密鑰是 32 位。我是否填充或重複這些塊,使它們成為 32 位?我是否使用密鑰的前 16 位?等等我一直在使用教授在之前的作業中給出的這個功能:
def strxor(a, b): # xor two strings of different lengths if len(a) > len(b): return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)]) else: return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])
但我不知道這是否仍然是正確的方法。我知道我需要先 string.decode(‘hex’) 將內容輸入上述函式,然後再將 string.encode(‘hex’) 輸入十六進制。
對於CBC模式,加密和解密方程如下:
- CBC加密;
$$ \begin{align} C_1 &= E_k(P_1 \oplus IV)\ C_i &= E_k(P_i \oplus C_{i-1}),;; 1 < i < nb, \end{align} $$
- CBC解密;
$$ \begin{align} P_1 =& D_k(C_1) \oplus IV\ P_i =& D_k(C_i) \oplus C_{i-1},;; 1 < i < nb, \end{align} $$
但我不是 100% 確定“D”實際上是什麼(是的,解密……但它是異或嗎?還有別的嗎?)。
這 $ D $ 用於加密和 $ E $ 用於加密,並且 $ nb $ 是塊的數量。
如果我的理解是正確的(目前層的解密只是 xoring c
$$ i $$用鑰匙),那麼它可能是一個實施問題?
密鑰被提供給 AES 以產生加密和解密,我們不使用密鑰,即 OTP 或 Vigenere。
我也有點不確定是否將密鑰與塊進行異或運算。我知道 IV 應該與塊 (16) 的長度相同,但密鑰是 32 位。我是否填充或重複這些塊,使它們成為 32 位?我是否使用密鑰的前 16 位?
AES 具有 128 位塊大小,無論密鑰大小為 128,192 和 256。因此 AES 可以支持 128 位 IV/nonce。128 是 16 字節,256 是 32 字節。
使用 CBC 模式加密的消息需要適當的填充,如 PKCS#7 填充,並且在最後一個塊上執行填充。填充是用失去字節的計數填充失去的字節,如果最後一個塊已滿,則需要一個用 填充的新塊
10
。請記住 CBC 模式適用於由於錯誤使用填充錯誤和缺少 encrypt-then-mac 的填充預言攻擊。必須將密鑰大小提供給您,並且無法檢測到密鑰大小,除非在邊通道攻擊中,如果可以看到加密比 AES-128 慢 40%,那麼它必須是 AES-128。