為 OTP 切換密鑰的數學公式?
不是一遍又一遍地為一次性密碼生成隨機密鑰,是否有一個數學公式可以讓您將密鑰切換為新密鑰?新密鑰必須與原始密鑰一樣隨機且安全。
不是一遍又一遍地為一次性密碼生成隨機密鑰,是否有一個數學公式可以讓您將密鑰切換為新密鑰?
不。
(請繼續閱讀……)
一個單一的數學公式不會解決它。這就是密碼算法的用武之地。有很多密碼安全的偽隨機數生成器、流密碼等可用於創建密碼安全密鑰……但是當不得不依靠這些時,你可能以及簡單地首先使用它們並放棄你的一次性墊子的想法。
事實上,我有點想知道:*你做了什麼研究?*我問是因為您似乎跳過了定義 OTP 的一些重要部分。
根據定義,OTP 要求“密鑰”是……
- 一個真正隨機的一次性填充值,
- 以安全的方式生成和交換。
- 至少與消息一樣長,並且
- 只能使用一次。
與第 1 點相關:請注意,它說的是“真正隨機”而不是“偽隨機”。事實是,沒有任何數學函式本身可以是真正隨機的。含義:如果您使用數學函式(例如:乘以進位結構),它肯定不會**滿足 OTP 的定義。
在最佳情況下,您將處理 CSPRNG 或類似流密碼的解決方案。正如您可能知道的那樣,這些確實存在並且確實提供了加密安全的隨機性(在某種程度上),但是當沿著這條路思考時,您真的必須問自己是否真的想用汽車騎馬。
與其嘗試製作方形輪子,不如重新驗證您的想法並檢查已經存在的流密碼和/或密碼安全的偽數生成器,這將更具建設性。一個簡單的“它看起來很隨機,所以它必須是安全的”絕對無法處理這項工作!如有疑問,請查看已被密碼破解(實際上在眨眼間被密碼分析破壞)的眾多 PRNG。
與第 2 點到第 4 點相關: “*以安全方式進行交換”很重要,因為 OTP 只能與密鑰交換過程一樣安全,當消息或數據包大小達到幾兆字節或甚至千兆字節。
當然,這就是您的問題的根源。然而,試圖通過數學函式找到解決問題的方法既不是 OTP。也沒有加密安全。
最後但並非最不重要的…
新密鑰必須與原始密鑰一樣隨機且安全。
我想知道你打算如何比較它。看,真正隨機的來源是不可預測的。加密安全的隨機數生成器之類的東西也是如此(假設它們沒有缺陷或以某種方式損壞)。
總結一下:
如果你真的想堅持使用 OTP,除了使用真正隨機的、加密安全的源之外,你別無選擇(感謝它的定義)。
如果這不可用,您可以求助於 CSPRNG 或類似流密碼的構造(例如:基於 HMAC)。如前所述:一個簡單的*“數學公式”*是行不通的。只有加密算法才會接近術語“真正隨機”。
作為替代方案:如果您想要一些既加密安全又實用的東西(您表示這是您的主要問題),您絕對應該超越 OTP。例如:像 Salsa/Chacha 這樣的流密碼。從最廣泛的意義上說,流密碼“模擬”了一次性密碼的想法。使用它們,您無需考慮解決 OTP 的煩惱。
另外,我認為值得注意的是,使用像 AES/Rijndael 這樣經過良好審查的分組密碼並沒有錯。
(有趣的是,你甚至可以使用像 AES 這樣的分組密碼來創建一個 CSPRNG 結構,然後你可以濫用它來創建你的一次性填充值。但這有點矯枉過正,因為 AES 在加密數據方面做得很好– 這使得考慮 OTP 變得非常多餘。)
我想解決您問題的兩個方面,但是,在我這樣做之前,我必須簡要提及“多用墊”(MUP 而不是 OTP)。MUP 與 OTP 類似,不同之處在於它們可以在數字環境中重複使用,並且實用且高效——這意味著它們不必是真正(完美)的隨機字節數組。
- “新密鑰必須與原始密鑰一樣隨機且安全”。正如 e-sushi 指出的那樣,電腦生成的真正隨機 OTP 的概念是不現實的。也就是說,我的方法和研究集中在“重用”上,因此沒有必要獲得額外的 MUP;如果每條新消息都需要一個新的 OTP(就像紙和筆一樣:參見 Venona 項目),那麼 OTP 將永遠不會實用和安全。這是我想在下面解決的第二個方面或您的問題。
- “數學公式”。首先請允許我說,我更多地將數學視為基於“模式”的願景,它使用紀律和適當的技能來生成基於代數的表達式(稱為公式)。並非所有模式都可以限制在代數平台上。我見過許多使用公式的嘗試,例如使用較小的密鑰生成 OTP。最重要的是,一個較小的生成器有效地導致,不是一個真正的 OTP,而是一個可以被破壞/發現的小得多的“密鑰”(生成器)。
底線:獲得“無限密鑰大小”的優勢,無需生成完全隨機的字節數組,也沒有與密鑰重用相關的漏洞。
注意:我是這個站點的新手,並且剛剛意識到我必須指出我是 CORAcsi 的創始人和 MUP 的開發人員。