Symmetric
為 ESP 3DES-CBC 生成 IV
我有一個用 C 編寫的應用程序,在 Linux 中執行。它使用
IPsec (ESP)
(手動將 IPSec 數據包放在一起)發送某些數據包。用於加密有效載荷的算法是3DES-CBC
(使用Libgcrypt
)。所以我的懷疑是關於
IV
我必須使用的。為了使該方案安全:生成一個隨機數就足夠了
IV
嗎?如果是這樣,我應該為此使用什麼隨機數生成器源?(例如 /dev/random)我在閱讀RFC 1851時注意到的另一個要求
IV
是 64 位長。更新:
$$ PDF $$狀態:
有兩種推薦的方法來生成不可預測的 IV。第一種方法是在用於加密明文的相同密鑰下將前向密碼函式應用於隨機數。nonce 必須是每次執行加密操作時唯一的數據塊。例如,nonce 可以是一個計數器,如附錄 B 中所述,或者是一個消息編號。第二種方法是使用FIPS 批准的隨機數生成器生成隨機數據塊。
試圖找到所有經過 FIPS 批准但找不到太多資訊的 Linux 隨機數生成器實現的列表。
要為 CBC 模式安全地生成 IV,有兩種明顯的方法(NIST 引用了這兩種方法):
- 對於每個數據包,選擇一個隨機數(IPSec 序列號,填充為 64 位,工作正常),在 ECB 模式下對其進行加密,然後使用生成的密文塊作為 IV。一種等效的方法是獲取 64 位隨機數,將其添加到字節明文,用固定 IV 加密明文(和 64 位隨機數),然後傳輸密文的前 64 位(不包括你使用的固定IV)作為IV,其餘的密文作為密文體。事實證明,這與第一種方法等效,因為 CBC 模式在內部是如何工作的。
- 呼叫隨機數生成器來選擇 64 位 IV,並使用它。您引用的 NIST 的文本說 rng 必須經過 FIPS 批准;實際上,除非您關心 FIPS 合規性,否則任何不可預測的 rng 都應該起作用;我不希望有任何問題 /dev/random
就個人而言,我懷疑您會發現第一個選項更容易。
您應該考慮的另一件事是誠信。有人可以通過修改密文,然後讓某人嘗試解密它來造成令人驚訝的惡作劇。現在,IPSec 對此有了答案(包括 MAC 和密文;如果有人修改密文,MAC 將失敗);你包括那個嗎?
順便說一句:您引用的 RFC (RFC1851) 已經過時了,並且不會與現代版本的 IPSec 互操作;至少,現代版本會期望填充具有特定的模式。如果您正在實現協議的雙方,這並不重要。但是,如果對方是非古代 IPSec 實現,請查看RFC2406和RFC2451