是否存在任何(非硬體)RNG 可用於創建用於加密目的的 OTP?
我偶然發現了一個系統(在工作方面),其中使用 OTP 使用簡單的 XOR 對小消息(512 字節或更少)進行加密和解密。該 OTP 是使用基於個人使用者密碼和簡單 PRNG 的種子創建的。
我目前看到以下問題:Alice 始終將她的密碼絕對保密,並且永遠不會共享或傳輸。但是加密消息可能會被 Eve 截獲,Eve 可能足夠聰明,可以檢測到用於對消息進行異或運算的模式(因為 PRNG 功能被廣泛用作簡單的 C-lib
rand()
功能,因此是公開可用的)。*“他們”*之所以使用 OPT 方法,是為了確保“快速加密”(在通過 SSL、安全儲存等傳輸之前)。
我的反駁是它可能很快,但是因為種子是使用簡單的字節加法生成的(這導致種子在 0 到 255 之間),所以 Eve 有很好的機會快速找到使用過的種子,從而找到 PRNG偏移量…這將允許她在 256 次跟踪和錯誤方法中解密完整的加密消息。
就個人而言,我將建議他們使用公認的加密方案(如 AES)並讓他們放棄基於 OTP 的弱且不安全的加密事物。
從我記事起,我一直在閱讀並被告知 OTP 在理論上可能被認為是安全的——但為此,OTP 必須是絕對且真正隨機的。從我的角度來看,PRNG(加密安全與否)似乎不是為加密目的生成 OTP 的安全方式(使用簡單的 XOR)。
但這讓我開始思考——也許我在加密方案、函式和實現的浩瀚海洋中遺漏了一些東西。
為了避免我遺漏一些東西,我會接受關於這個問題的任何回饋:
是否存在任何(非硬體)RNG 可用於(或安全濫用)創建用於加密目的的 OTP?
您描述的系統不是一次性密碼,它是一種流密碼,而且是一個糟糕的密碼。
一次性填充在 XOR 填充中具有真實的(真正的)隨機位,這些位永遠不會用於兩條消息。“他們的”密碼有一個偽隨機鍵盤(帶有非加密 PRNG),如果我理解正確,甚至每條消息都使用相同的密碼。
如果相同的密鑰被兩次(或更頻繁地)用於不同的消息(或相同的消息,如果您不希望攻擊者知道它是相同的消息),那麼即使是真正的隨機一次性密碼也很容易受到攻擊。
即使您使用良好的流密碼(或 PRNG),並為每條消息使用不同的“密碼”(即密鑰)(或使用帶有 IV 輸入的流密碼,並為每條消息使用不同的 IV),您也不會獲得一次性密碼本的完美安全保證——它可以被暴力破解,具體取決於密鑰大小。
對於具有 OTP 安全保證的系統,您需要至少與消息長度一樣多的密鑰熵。
如果您有這樣的密鑰材料,但不是以適合直接用作密鑰的形式(例如,不是均勻分佈的,就像一個非常長的密碼片語),您可能可以使用一些加密函式(如雜湊)對其進行預處理函式,將其轉換為可用於 OTP 密鑰的形式。儘管必須研究轉換算法以確保保持足夠的熵 - 對於您的 OTP,您需要您的 $ n $ -bit 輸出有 $ n $ 熵位,使用具有內部狀態大小的雜湊函式並不容易 $ < n $ .
實際上,大多數硬體 PRNG 都是這樣工作的——它們測量一些數據並將其用作加密 PRNG 的熵輸入。