如何創建一個沒有人知道因素的 RSA 模數?
創建一個幾乎沒有人知道因素的 RSA 模數很容易:例如,我可以生成兩個 1024 位素數 $ p $ 和 $ q $ 並設置 $ n=pq $ . 如果我發布 $ n $ , 我將是世界上唯一知道或能夠知道的人, $ p $ 和 $ q $ .
(現已失效的)RSA Factoring Challenge 數字是這樣生成的:
- 首先,使用連接到筆記型電腦並行埠的 ComScire QNG 硬體隨機數生成器生成 30,000 個隨機字節。
- 在 RSA BSAFE 庫的 4.0 版中,隨機字節被用作 B_GenerateKeyPair 函式的種子值。生成的密鑰對的私有部分被丟棄。公共部分以 DER 格式導出到磁碟文件。
- 從 DER 文件中提取模數並轉換為十進制以發佈在網頁上。
- 筆記型電腦的硬碟被破壞了。
但所有這一切都讓我感到不滿意,因為——儘管聲稱筆記型電腦的硬碟被毀——我仍然擔心知道這些因素的內部人士。
有沒有一種方法可以生成 RSA 模數,這樣沒人知道這些因素?這似乎是一個荒謬的問題,但我們確實知道未知因式分解的**複合物。**例如,許多最大的 Mersenne 複合材料具有未知的因式分解(維基百科)。
我會接受多方算法和玩家不合作的假設。
一種實用的方法:使用Java Card Smart Card。載入一個簡單的 Java 小程序,使用免費的Java Card Classic Development Kit製作,生成一個 RSA 密鑰,並輸出公共模數。然後要麼銷毀智能卡,要麼將其歸零。
小程序將非常簡單,可以令人信服地對其進行審計,無論是從原始碼還是從記錄良好的微小 Java Card 字節碼(RSA 密鑰生成本身就是其中的幾個字節,呼叫內置於 Java Card 執行時的方法,由卡/微模組製造商,可能呼叫晶片製造商提供的庫)。一些 Java Card 模型經過安全認證,考慮到類似的使用和安全展示(儘管可能很難少量購買這些認證模型,並且幾乎不可能獲得它們的完整文件)。
一個難題:說服自己/觀眾相信載入在 Java Card 中的確實是經過審計的小程序,更一般地說是處理 Java Card 的設備的完整性及其產生的結果。在智能卡的關鍵儀式中,設備的完整性至關重要,通常會將裸作業系統安裝到原始 PC 上,而無需從客戶面前的原始光學介質進行網路訪問,但智能卡讀卡器可能不會受到審查,即使這同樣重要。
此外,卡開發人員在編寫 RSA 密鑰生成器時仍然存在失誤的風險。有先例:
- Petr Švenda、Matúš Nemec、Peter Sekan、Rudolf Kvašňovský、David Formánek、David Komárek、Vashek Matyáš 中的第 6.1.1節:百萬密鑰問題 — 調查 RSA 公鑰的起源, 2016 年 Usenix 安全論壇的最佳論文。這是一張 Java Card(但不是經過審核的,我可以從它的可追溯性數據中辨識出來,這是我從主要作者那裡獲得的)。
- Daniel J. Bernstein、Yun-An Chang、Chen-Mou Cheng、Li-Ping Chou、Nadia Heninger、Tanja Lange、Nicko van Someren:從認證智能卡中分解 RSA 密鑰:Coppersmith in the wild,在AsiaCrypt 2014的會議記錄中。它的某些部分似乎通過了 FIPS 140-2 認證,但很可能該認證被濫用得如此嚴重以至於變得毫無意義。
啊,當然,你展示的數字是這樣產生的,很難讓別人相信。不是很好的答案。。
這可能……很難。
為此制定一個算法:
以偽隨機數生成器為例。
要求電腦獲取 $ 2^n $ 這樣的數字, $ a_1,a_2,…,a_{2^n} $ 在哪裡 $ n $ 也是一個隨機數,有 $ 2\leq n \leq10 $ 和 $ \log{a_i}=\log{a_j} $ .
將這些數字分成兩半,每半都有 $ 2^{n-1} $ 元素。
將每一半的所有數字相加。
將兩個數相乘得到 $ n $ .
這非常笨重,但很安全。我認為。