Aes

AES-256 模式,每塊密鑰是 SHA-256 的秘密密鑰、隨機公共鹽和塊號的 SHA-256。有什麼問題?

  • October 18, 2015

請批評下面描述的(自製?)模式;指出一個主要缺陷/不確定性或與(分析)等效結構的連結就足夠了。假設性能被忽略以支持安全性。

這個方案看起來像是不時出現的東西。這是另一個地方,任何人都可以發現它的描述並迅速理解為什麼現在或永遠不應該應用它。

有一個系統是作為 foss 項目的一部分製造的,面向擁有給定文件的單個使用者(或更準確地說,任何具有相同權限的使用者組)並將其以加密形式放置在可公開訪問的儲存中(它是一個系統的基本操作)。為了簡單起見,我們假設文件名已經是一個偽隨機的 256 位字元串(這是另一個基本操作)。要求是:

  • 除了使用者之外,沒有人應該能夠知道文件的原始內容和/或對其做出合理的結論——除了最後一次修改的時間(幾小時內準確)、大小和派生資訊——盡可能多盡可能的時間
  • 使用者應該能夠檢測到加密形式的任何損壞/修改

使用以下符號:

  • FILE = (f 1 ;f 2 ;…) — 8 位字節的有限字元串
  • KEY — 32 字節的字元串,只有使用者知道
  • **SALT——**使用者知道的 32 字節字元串,也可能為宇宙中的每個人都知道,儘管每個新文件都是“隨機的”
  • SHA 256 (m) — 字節串/消息m的標準 SHA-256 散列
  • H(m) = SHA 256 (SHA 256 (0 512 || m)) — Cryptography Engineering (Ferguson, Schneier, Kohno, 2010)第 5.4.2 小節中描述的 SHA-256 修改,旨在抵消長度擴展和部分消息衝突問題。0 512是 64 個零字節,m是實際消息,A||B表示AB(位)字元串的串聯

目標是將FILE轉換為加密形式EN-FILE,然後將其與完整性驗證一起解密。加密是這樣完成的:

  1. FILE在最後被填充,所以它的大小變成 16 的倍數,相同的字節的值LB等於它們的非零數(1 到 16)。結果是PD-FILE
  2. 控制雜湊D-HASH(32 字節長)計算為H(PD-FILE)
  3. D-HASH附加到PD-FILE的末尾,所以它變成了 CHPD-FILE
  4. CHPD-FILE分為 16 字節塊,從 1 到 n+2 列舉(最後兩個是D-HASH
  5. 基本)每個數字 k 的塊都使用 block-key = H(KEY || SALT || k)進行 AES-256 加密,其中 k 是……本身的 8 字節值。結果是EN-FILE

EN-FILE被放置在儲存上。在那裡它可能會損壞,也可能不會;一段時間後它變成EN-FILE’。然後將其帶回(適當隔離的)使用者機器,並在本地“以相反的順序”進行解密(由於檢查,更多項目):

  1. **EN-FILE’**的長度經驗證不小於 16+32=48 和 16 的倍數。如果不是,則文件損壞並停止解密。如果是,
  2. **EN-FILE’**分為16字節塊,從1列舉到n’+2
  3. 每個編號為 k 的塊都使用 block-key = H(KEY || SALT || k)進行 AES-256 解密。結果是CHPD-FILE’。它的最後兩個 16 字節塊是 32 字節AP-HASH’
  4. 丟棄AP-HASH’ , CHPD -FILE’變成PD-FILE’
  5. PD-FILE’的最後一個字節是LB’,應該是一個填充字節。如果它不屬於範圍 1-16,則文件已損壞並且解密將停止。如果是這樣,
  6. LB’ PD-FILE’的最後一個字節應該相同並且等於LB’。如果不是,則文件已損壞並且解密將停止。如果它們是,
  7. D-HASH’計算為H(PD-FILE’)
  8. 如果D-HASH’不等於AP-HASH’,則文件已損壞並且解密停止。如果是,
  9. LB’PD -FILE’的最後一個字節被丟棄。剩下的被系統辨識為原始文件

請注意,解密可以分兩遍進行,第一遍是檢查一遍,其中沒有任何內容寫入本地驅動器,並且記憶體中的每個塊(n’、n’+1、n’+2 除外)被替換為一旦它被輸入到雜湊中,下一個。

被實現(C++),它實際上是有效的——文件被加密和解密,手動密文損壞被檢測到。顯然,有問題的是它在對抗環境中的安全性

這種方案容易受到“截斷攻擊”的影響,這使得攻擊者可以偽造新的密文(EN-FILE)。

這是它的工作原理。假設攻擊者控制了明文的一部分,並且可以(以合理的機率)預測該部分之前的明文。換句話說,一個值 $ A | B | C $ 已加密,其中 $ A $ 是可預測的並且 $ B $ 是攻擊者控制的。攻擊者可以選擇一些任意值 $ X $ , 確定填充字元串 $ P $ 需要墊 $ A | X $ , 併計算 $ \operatorname{D-HASH} = H(A | X | P) $ . 攻擊者送出 $ B = X | P | \operatorname{D-HASH} $ ,這將導致 $ A | X | P | \operatorname{D-HASH} | C $ 被加密。

假設攻擊者現在可以看到並修改生成的EN-FILE。攻擊者知道對應的密文塊數 $ A | X | P | \operatorname{D-HASH} $ , 我們稱之為 $ N $ . 首先 $ N $ EN-FILE塊本身就是一個有效的EN-FILE:如果這些 $ N $ 塊被送出給解密算法,它們將被成功解密為 $ A | X $ . 這是該方案的突破,因為經過身份驗證的加密必須防止密文偽造。

該方案也容易受到填充預言攻擊,因為填充是在D-HASH之前檢查的,這可以允許攻擊者提取明文的部分(或有關)的資訊。

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