One-Time-Pad

如何在不削弱熵的情況下將隨機字節轉換為數字塊?

  • June 21, 2020

假設您有一個或多個隨機字節 0-255,並希望為其中的一次性密碼 (OTP) 導出數字 0-9。

在不削弱底層安全性的情況下,將 256 個可能值表示為 10 個可能值的非天真的方法是什麼?我不確定我是否可以簡單地丟棄 256 個值中的 6 個狀態以實現除以 10 而沒有分數,同時不會削弱安全性。

有沒有一種簡單但令人信服的數學方法,我可以將自己移植到程式語言中,將字節安全地映射到 0-9 範圍內的數字塊?

是的,它被稱為簡單丟棄方法或拒絕抽樣。基本上你生成一個隨機字節,然後檢查該值是否等於或高於 250(10 的最高倍數)。如果是這樣,則丟棄該值並重新生成字節。如果您的值在 [0, 250) 範圍內,那麼您只需使用模 10(除法後的餘數)。你就在那裡,一個分佈良好且安全的價值。

當然,這種方法在一次性使用時效率不高。通常一次性填充用於位。但是如果你有它超過位數,那麼使用 10 到你需要的位數的冪會更容易,然後使用簡單的丟棄方法來生成更大的值,然後執行(可選)模歸約。如果您只取足夠的位,則不需要模組化減少。生成二進制值後,您可以執行基本轉換以將二進制值轉換為數字。

如果你覺得第二種方法仍然不夠高效,那麼你可以使用我是作者的優化的簡單丟棄方法。


請注意,許多庫既有在一個範圍內創建大隨機數的方法,也有獲取十進製字元串的方法,因此在這種情況下,您只需兩次呼叫即可檢索所有必需的隨機數字(儘管您可能必須將字元串轉換為表示每個數字的整數內的值)。

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