Crypto++:如何在 Crypto++ 中重新生成偽隨機整數
我正在使用 Crypto++ 來實現我的協議來屏蔽一個值 $ y_i $ 通過偽隨機值 $ r_i $ 這樣 $ m_i=y_i \cdot r_i $ . 由於有很多 $ r_i $ 我想使用 PRNG 生成它們,然後只儲存 PRNG 的種子。有了種子,我可以再生 $ r_i $ ,然後計算 $ r^{-1}_i $ 去除 $ r_i $ 的。但是在 crypto++ 中,種子(密鑰)無法訪問。
**所以我的問題是:**如何使用 crypto++ 的 PRNG 來適應上述技術?
讓 $ r_i \stackrel{R} \leftarrow \mathbb{Z}_p $ 和 $ y_i \in \mathbb{Z}_p $ ,其中 p 是質數。
形式上,您真正需要的是密鑰派生函式(KDF)。
Crypto++ API包含一個PasswordBasedKeyDerivationFunction類,但這對於您的目的似乎並不是最佳的;因為你已經有了一個高熵隨機種子,你真正想要的是一個簡單的基於密鑰的KDF,而不是一個用於密碼的花哨的密鑰拉伸 KDF。
幸運的是,自己實現一個並不難。一個非常簡單的方法是使用您的“種子”作為流密碼的密鑰(或者說,CTR 模式下的 AES),並使用密鑰流(您可以通過加密一堆空字節來獲得)作為您的隨機字節的來源。
(然後,您可以將這些隨機字節轉換為所需範圍內的統一隨機整數,例如通過拒絕採樣:在 $ 0 $ 和 $ m $ 包容,先找 $ k = \lceil\log_2m\rceil $ ,即長度 $ m $ 以位為單位,然後生成隨機 $ k $ 位字元串。如果此位串(解釋為二進制數)小於或等於 $ m $ , 你完成了; 否則,將其扔掉並重複。不難證明,平均而言,您最終會拒絕不到一半的位串(因為 $ m \ge \frac12 2^k $ )。但是請注意,這確實可能會洩漏一些關於最重要位的統計時序資訊 $ m $ ,如果您想保密,這可能很重要。)
或者,只需稍加工作,您就可以實現標準結構,如 HKDF ( RFC 5869 ),或NIST SP 800-90A中的一種DRBG算法(注意:不要實現 Dual_EC_DRBG!)。特別是 CTR_DRBG,與上面簡單的“使用種子作為 AES-CTR 的密鑰,採用密鑰流”的建議非常相似。