Aes

幫助我了解如何進行有關 AES/CBC 的加密分配

  • December 30, 2020

我正在學習 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。

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