Hash

是否可以使用比明文小的密鑰來創建偽一次一密?

  • November 27, 2022

假設我想加密一個 10GiB 的文件,但我不想使用一次性密碼本,而只是從 /dev/random(在 Linux 中)中獲取的 1MiB 密鑰。

我知道密鑰不應該重複,但是是否可以通過在整個明文中使用相同的密鑰來做一種偽 OTP 形式?

我在一個方案中想到:使用散列函式(輸出大小與 64 字節塊大小相同)對密鑰的每個 64 字節塊進行雜湊處理,並與種子連接,並在密文的下一部分中重複密鑰時,使用另一個種子。基本上,偽 OTP 通過對密鑰的每次重複使用不同的種子(“密鑰”)。

/\ 這個方案有效嗎?

是否有另一種方案可以像使用比密文小的密鑰使用真正的 OTP 完成一樣安全?

您提出的建議稱為流密碼。大多數流密碼採用一組固定大小的密鑰,通常帶有一個稱為隨機數的固定大小的非秘密值,並生成一個非常大的密鑰流,可用於安全地加密大型明文。

在這種情況下,我們通常不會使用 1 MiB 這樣大的密鑰,因為我們目前認為,使用這個星球上的所有資源來暴力破解 128 位密鑰在計算上是不可行的。希望對沖額外加密進步的人可以選擇使用 256 位密鑰。請注意,/dev/random/dev/urandom是在 Linux 上使用 256 位流密碼生成的,因此沒有比這更高的安全性。

您使用固定密鑰和隨機數和/或計數器(您稱之為種子)的方案,通過 PRF 傳遞它們,例如加密安全雜湊函式,然後將其與明文進行 XOR,在一般情況下,稱為計數器模式,並且是安全的,前提是 PRF 是安全的。但是,沒有任何一種流密碼能夠像一次性一密那樣絕對安全。這實際上不是問題,因為我們有許多速度極快且安全性極佳的優秀流密碼。

實際上,您還需要使用消息身份驗證程式碼或 MAC,或使用包含加密和 MAC 的集成設計(稱為 AEAD)為明文提供完整性驗證。我建議不要使用您自己的算法,而是使用帶有 OCB 模式的 AES 或 XChaCha20-Poly1305,它們都是速度極快的 AEAD (4-11 GB/s),並提供出色的安全保證。

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