是否可以使用比明文小的密鑰來創建偽一次一密?
假設我想加密一個 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),並提供出色的安全保證。