同時使用 RSA 私鑰作為 AES 加密密鑰來生成隨機數?
目前我正在為嵌入式系統實現 PRNG。使用RFC 4086,我決定使用 X9.17——更具體地說,是繼任者 X9.31——標準來實現我的 PRNG。X9.17 使用 DES,但 X9.31 使用 AES!
現在我需要為 X9.31 指定 AES 密鑰的值。我知道至少我的 AES 密鑰對於對手來說必須是不可預測的。因此,我想使用屬於我的嵌入式設備的證書的 RSA 私鑰。(從我的角度來看,這個值目前是唯一一個不可預測的值。)
我的想法如何從 RSA 私鑰生成 AES 密鑰:
AES_key= SHA1(RSA private key || date)
但是(ab)使用 RSA 簽名密鑰作為對稱 AES 密鑰來加密種子並最終生成隨機值是否可以?是否存在嚴重的安全漏洞?
在一般和管理的基礎上,為不同的用途重複使用相同的私鑰是不好的。
對於這種特定情況,這應該沒問題(儘管您應該使用 SHA-256 而不是 SHA-1,如果只是出於公共關係的原因:SHA-1 的新聞很糟糕,並且將 SHA-1 用於新設計將是質疑),但須遵守以下重要警告。
目前日期是一個單調的刻度。但是,您的設備無法直接訪問該物理值;它只有一個時鐘,它提供一個離散的(它以小增量工作,例如每個 1 秒)近似值目前日期的。如果您嘗試在同一秒內生成兩次 AES 密鑰,並且“目前日期”每秒僅更改一次,那麼您將獲得相同的種子,因此輸出相同,這可能很糟糕。此外,更重要的是,如果使用者(或攻擊者)可以設置時鐘,那麼他可能會強制執行種子重用,從而導致 PRNG 序列重複。“設置時鐘”必須從廣義上考慮:手中有設備的攻擊者可能會嘗試冷凍或烹飪它,因為石英對溫度敏感。他還可以玩弄電源輸入,例如向其中添加高頻信號,希望它會與石英相互作用並改變其振盪頻率。可能性是無窮無盡的。底線是嵌入式設備很難有一個準確的,目前時間的概念。即使獲得一個攻擊者無法強制重複的值也可能是一個相當大的挑戰。
更強大的版本將使用計數器,每次需要新的 AES 密鑰時都會增加該計數器。確保計數器足夠大,不會溢出(例如,使用 64 位計數器)。計數器必須具有永久儲存,並且在設備的整個生命週期內不得重置;您還必須在 PRNG 中使用計數器值之前更新計數器儲存。
順便說一句,在實際生成RSA 私鑰本身時,使用 RSA 私鑰作為 PRNG 種子對您沒有幫助。因此,要麼您在外部生成 RSA 私鑰並將其導入設備(例如,作為工廠初始化的一部分),要麼您有問題。這可能會導致另一個問題,具體取決於您的具體情況:如果使用者可以強制 RSA 私鑰的值,那麼他可以預測 PRNG 輸出。您不提供有關您的安全模型的資訊以了解這是否對您來說是個問題。
作為一般規則:在嵌入式設備中,通過將秘密注入算法,您打開了通道洩漏攻擊進入算法實現的大門(例如差分功率分析)。
在這裡,您計劃將 RSA 私鑰注入散列。如果對手可以觸發幾百次,這將是發起 DPA 攻擊的合理設置(特別是,“日期”欄位提供此類攻擊所需的可變性),並且可能比 DPA 攻擊更容易RSA 實現本身。這說明了重用秘密是不好的已經提出的觀點。
一種解決方法可能是只在受信任的位置生成一次 AES_key;然後將其儲存在內部以供以後使用。
注意:如果你想使用 PRNG 生成 RSA 私鑰,你有一個先有雞還是先有蛋的問題,這也是 X9.31 中 PRNG 的初衷
注意:X9.31 比 AES 早了十多年,因此不使用AES。對您計劃的正確參考可能是NIST 推薦的對 ANSI X9.31-1988 的補充中的第 3 節。