Cbc

需要 AES-128 CBC PKCS5 加密密鑰的無知生物學家

  • May 24, 2017

我是一名生物學家,為了研究而瘋狂地試圖在一夜之間了解密碼學的世界——請忽略我的無知。我得到了一大段要破解的文本,這些文本使用 AES-128 CBC 和 PKCS5 填充加密。密鑰是 HMAC-SHA1 中的 MD5 PBKDF2,我以“附加資訊”的形式獲得了一個 13 位數字。如何獲取解密密鑰?我應該在正文上使用 DK = PBKDF2(PRF, Password, Salt, c, dkLen) PBKDF2 派生函式嗎?我只需要“密碼”或“解密密鑰”即可使用。我知道——最好的無知——請像孩子一樣向我解釋這一點。

好吧,您的問題中有很多不同的概念。正如你所要求的,我認為你對他們所有人一無所知,除了他們的名字。我假設您習慣於使用本科數學和術語。

讓我們開始:

加密

您正在處理加密數據。為了產生這些,已經使用了一種*加密方案。*加密方案可以正式定義為元組 $ (\mathcal{P,C,K,E,D}) $ 有幾個屬性:

  • $ \mathcal{P} $ 是一個稱為“明文空間”的集合。它的元素稱為明文。
  • $ \mathcal{C} $ 是一個稱為“密文空間”的集合。它的元素被稱為密文。
  • $ \mathcal{K} $ 是一個稱為“關鍵空間”的集合。它的元素稱為鍵。
  • $ \mathcal{E}={E_k : k\in \mathcal{K}} $ 是一組函式 $ E_k : \mathcal{P}\rightarrow\mathcal{C} $ . 它的元素被稱為“加密函式”。
  • $ \mathcal{D}={D_k : k\in\mathcal{K}} $ 是一組函式 $ D_k : \mathcal{C}\rightarrow\mathcal{P} $ . 它的元素被稱為“解密函式”。

這樣對於每個 $ e\in\mathcal{K} $ , 那裡存在 $ d\in\mathcal{K} $ 這樣 $ D_d(E_e(p)) = p $ 對所有人 $ p\in\mathcal{P} $ .

這意味著對於每個鍵 $ e $ 在一組鍵中 $ \mathcal{K} $ , 有一把鑰匙 $ d $ 也在一組鍵中 $ \mathcal{K} $ 使得解密函式使用 $ d $ 作為一個鍵,稱為 $ D_d $ , 當應用於加密函式時,使用 $ e $ 作為一個鍵稱為 $ E_e $ 是恆等函式,因此當兩者連續應用時,從 $ E_e $ , 明文 $ p $ , 將恢復相同的明文 $ p $ .

在您的情況下,您正在使用 PKCS5 padding處理AES-128 CBC ,我將解釋這意味著什麼。

分組密碼

現在有一整套稱為“分組密碼”的加密方案。分組密碼是一種加密方案,其集合 $ \mathcal{P} $ 和 $ \mathcal{C} $ 相同且等於給定固定位大小的所有元素。它的功能 $ E_k $ 和 $ D_k $ 將一個大小的塊作為輸入 $ n $ 位和大小的密鑰 $ l $ 位並輸出一個大小的塊 $ n $ 位。

對於所有加密-解密密鑰對,分組密碼或多或少是*對稱的* $ (e,d)\in\mathcal{K}\times\mathcal{K} $ , 我們有 $ e=d $ ,,我們可以加密一個明文並用相同的密鑰解密相應的密文。

在您的情況下,分組密碼是AES-128,它有一個 128 位的塊。

操作模式

由於分組密碼只能處理分組*,為了加密任意數據,我們將它們與一種操作模式*結合使用。該操作模式允許將純數據拆分為多個塊,用塊密碼對其進行加密,並將它們連結在一起成為加密數據。

有多種操作模式具有不同的優點和缺點,但在您的情況下,操作模式是**CBC**。

填充

使用填充有多種原因,但在 CBC 情況下,您主要希望使用填充,以便確保明文中的比特數量是分組密碼的塊大小的倍數。

現在,所有這些東西都已經標準化了很多,您正在處理一種特定的填充類型,即PKCS5 填充


現在,關於密鑰,您提到以下內容:“密鑰是 HmacSHA1 中的 MD5 PBKDF2”,所以讓我解釋一下它們是什麼。

密鑰導出函式

PBKDF2 是一個*密鑰派生函式*,依靠給定的 PRF(在您的情況下為 HMAC-SHA1)從另一個密碼中派生出一個密碼,以保護前者免受暴力攻擊和字典攻擊等。(更多資訊可以例如,可以在這裡找到。)

密鑰派生函式通常至少需要兩個輸入:一個要處理的密碼和一個**,以確保如果使用兩個不同的鹽輸入相同的密碼,它不會產生相同的值。(從而避免字典攻擊。)

PBKDF2 還將多次迭代作為輸入,這將確定暴力破解它的“難度”。


為什麼我不能幫你

現在,問題是我們沒有足夠的數據來提供幫助。你至少提到兩件事我不知道該怎麼辦:

  • MD5是一個雜湊函式,我不明白為什麼已經使用 PBKDF2 派生密碼的人會使用 MD5 對其進行雜湊處理,因為它沒有用……但是當你正在製定它時,我會說你應該使用 MD5 對 PBKDF2 的結果進行散列以獲取密鑰。
  • 附加資訊,您有一個 13 位數字,但那是什麼?這是一個太大的數字,不能作為 PBKDF2 函式中應用的迭代次數,因此它可能是您應該使用 PBKDF2(然後可能使用 MD5)處理的初始密碼,但是您缺少鹽和能夠做到這一點的 PBKDF2 迭代次數……
  • 我不清楚你得到了什麼數據?我假設您擁有密文,但缺少密鑰。因為如果你有密文和密鑰,那麼你只需要應用AES-128-CBC 和PKCS5填充解密就可以了。如果給你用於生成它的程式碼,它也和只給你上面的資訊不一樣,因為在程式碼中我們可能會找到鹽和 PBKDF2 迭代的次數。

一夜之間瘋狂地試圖了解密碼學的世界

這極大地限制了您的選擇。首先:閱讀 Lery 的答案,以及您原始文章下的評論。然後:意識到你正在一頭扎進Kerckhoff 的原則,這對你來說意味著

即使您知道數據是通過什麼方法加密的,沒有密鑰也無法解密數據。

您最好利用有限的時間與其他科學家討論獲取有用數據的方法(也就是說,假設您正在嘗試訪問科學數據……)。

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