多重加密 - 一次性密碼
眾所周知,一次性密碼 (OTP) 在理論上是牢不可破的,但由於密鑰長度的大小,使用起來不切實際。但是如果使用多重加密呢?不是要加密第一個密文,而是要加密密鑰。
首先,使用 OTP 對消息進行加密。然後使用橢圓曲線密碼系統 (ECC) 對用於 OTP 加密的密鑰進行加密。ECC 的私鑰再次使用 OTP 加密。有效減少密鑰長度,同時提供一次性密匙的安全性。
這可以是 OTP 的實際實現嗎?
不,以下是定義的細分:
- One Time Pad 加密是指使用一位密鑰材料最多加密一位輸出。
- “一次”部分至關重要。使用任何位兩次意味著您不能將新的加密算法稱為“一次性密碼”。
- OTP 中的“Pad”是關鍵。
- ECC 無法加密長消息。它可以加密許多小消息,但速度很慢。您可以加密許多小消息,但速度很慢,並且在正常情況下您需要使用隨機數。
- 不是使用非對稱算法來加密任意長的明文,而是使用的加密方案類型稱為“混合加密”。為了過度簡化,這個想法是使用非對稱加密來加密對稱密鑰(很短)。然後,您要發送的實際消息使用 ECC/RSA 加密密鑰使用流密碼(或其他算法)進行加密。這有效地允許對任意大的消息進行加密,而無需多次執行 ECC/RSA 加密/解密。
由此你可以得出結論:沒有。它不是一個實用的算法,因為它很慢。
對於困惑的全球觀眾,還有一些關於 OTP 是什麼和不是 OTP 的額外說明:
- 使用隨機位播種 PRNG 並使用輸出加密不是 OTP 算法。這通常稱為流密碼。
- 用一個 pad 對消息進行異或,並在用完後從同一個 pad 重複位不是 OTP 算法。
- 使用分組密碼、流密碼、海綿構造或散列函式從一次性填充中派生新的偽隨機位並使用該輸出進行加密不是 OTP 算法。
- 一旦生成了一位密文,任何形式的填充位重用不僅是作弊,還意味著您使用的不是一次性填充算法。
- 將一次性便箋簿想像成一條紙。從條帶的開頭讀取一個符號,使用該符號加密等量大小的純文字單元,在第一個和第二個符號之間撕紙,然後用你剛剛使用的符號燒掉這張紙。(如果有人找回了包含您的關鍵材料的紙本,那麼您的消息可以被找回。所以立即銷毀它。)此過程的數字等效項您可以稱為一次性便箋算法,但任何其他過程您不能稱為一次性密碼算法。
由此你可以再次得出相同的結論,不,它並不比普通的 OTP 算法更實用,因為兩次填充不是一次性填充。除非您只加密一條消息,否則您沒有 OTP 的安全屬性。即使您確實將自己限制在一條消息上,您也只是增加了複雜性而沒有獲得任何安全性。
現在來說第三個不切實際:
不存在具有比儲存明文所需的儲存空間更少的密文的加密算法。事實上,不存在可以映射一組 $ n $ 一組小於的輸入 $ n $ 輸出。
您不能將不可壓縮的明文字元串加密為較短的密文字元串。這包括 ECC 和 OTP 加密。如果一次性密文很長,那麼加密一次性密文將導緻密文較長。擁有短密鑰並不意味著您擁有短密文。
好消息是,非對稱系統、對稱系統和混合系統不如 OTP 加密“完美”並不重要。您可以選擇一些不會產生可破解密文的對稱算法。(它們當然不是“經典加密”算法。除了 OTP。)
我能想到我會選擇使用一次性填充算法的唯一原因是,如果在這種情況下我有理由不信任所有電腦(或實際的替代機器),我打算讓發送者和接收者都執行手動加密,我可以與我親自遇到的人共享紙上的一次性便箋,我可以驗證那個人的身份,如果我們都同意只解密消息,如果我們可以使用另一種算法來驗證密文完整性。
即使您以某種方式對其進行加密,您也在重複使用密鑰(又名“pad”),從而違反了 OTP 定義。
根據定義,OTP 要求“密鑰”是……
- 一個真正隨機的一次性填充值,
- 以安全的方式生成和交換。
- 至少與消息一樣長,並且
- 只能使用一次。
此外,當您認為多次重新加密密鑰以將其用於連續加密工作是一個新穎的想法時,我不得不說讓您有些失望:您不妨簡單地使用經過嚴格審查的流密碼(或 KDF - 取決於在確切的情況下)因為這就是你在這裡(不)實際地重新發明的東西。
順便說一句:對於一個非常相關的 OTP 問答,請查看*“為 OTP 切換密鑰的數學公式?”*