Keys

One Time Pad 字母大小

  • March 17, 2017

我正在建構一個簡單的一次性墊系統,使用低功耗微控制器對儲存的密鑰與輸入字元串進行異或,反之亦然。由於幾個內部因素,系統最好只使用 95 個“可列印的 ascii”字元而不是完整的 256 值字節來表示填充鍵。由於輸入也僅限於簡單的純 ascii,如果我正確理解 OTP 過程,那應該是足夠的覆蓋範圍。

我的墊子製作問題是關於將隨機 0-255 值轉換為純 ascii 字元,代表 0-94 左右。使用以下方法轉換每個 0-255 值 (x) 是否更安全:

  1. x % 95(x mod 95) 獲取所有可能的字元,但 65-94 值的可能性比 0-64 值高 50%。
  2. int(x / 3), 以獲得 0-84 值的鍵字元的統一發行版,其中每個值的使用機率為 3/255 (~1/85)。

雖然 #1 有 10 個以上的關鍵可能性,但 #2 具有均勻分佈,如果需要,我可以從 85 個“字母”字母表中輸入(而不是 95 個)。

給定一個隨機的 0-255 輸入,哪種下轉換可能會帶來更好的安全性?

編輯:修復了不清楚的範圍“0-85”和“0-95”以反映85和95的可能性。

這兩個選項都不好。你的隨機數方案都是有偏見的。

如果您使用模組化加法,這對於您的一次性鍵盤來說似乎是一個好主意,那麼對於您使用 [0-85) 分佈的方案,您的較低字元將永遠不會被加密為可能的最高字元。這真是太可惡了,這樣的計劃會立即被視為破壞。

對於另一種解決方案,僅除以 3,您面臨的問題是統計數據。假設您期望某個位置的某個低值,那麼您基本上可以檢查您的值是否偏愛低值 + 有偏差的輸出(即沒有足夠頻繁地達到更高的值)。在這種情況下,您可以合理地確定該值是正確的。它沒有0..85那麼糟糕,但仍然很糟糕。


您可以做的是生成一些位 $ x $ 比大 $ 2^x \gt 95 $ 以便 $ 2^x \bmod 95 $ 結果是少數。然後計算 $ y $ 以便 $ y = \lfloor 2^x / 95 \rfloor $ . 最後,計算一個最大值 $ m $ 以便 $ m = y \cdot 95 $ .

現在,當生成 [0-95) 範圍內的數字時,您可以:

  1. 產生一個值 $ c $ 在 [0- $ 2^x $ ) 通過簡單地生成 $ x $ 位並將其轉換為數字;
  2. 檢查是否 $ c \geq m $ ,如果是這種情況,請重新啟動;
  3. 返回 $ c / y $ .

在這種情況下,你會有 $ 2^{12} $ :除法後剩下 11 出 4096。因此,如果您生成 12 位,則必須重新生成的機會很小。您當然仍然會溢出位,每個字元大約 5 位,但是您的輸出是無偏的,並且您的執行時間非常接近確定性(即,您需要重複該過程並為字元生成另一個數字的機會非常低的)。


請注意,此答案基於範圍必須為[0-95) 的前提條件。如果您可以使用 [0-128) 那麼您可以直接使用這些位並將密鑰流與明文進行異或。

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