Dot-Net
給定一個私鑰,是否可以導出它的公鑰?
從我通過閱讀各種材料了解到的任何一點點來看,公鑰-私鑰對是非對稱加密的基礎,也是選擇 2 個素數(大致是您的私鑰)並將它們相乘(大致是您的公鑰)的基礎。在我看來,如果您知道私鑰,則可以生成公鑰。這是正確的還是我弄錯了什麼?
讓我更困惑的是,僅使用私鑰(使用 .NET 類 RSACryptoServiceProvider)無法將 RSA 密鑰序列化為 XML 。不知道這個限制是不是故意的!
這取決於加密系統。
在RSA中,我們有(引用維基百科):
公鑰由模數 n 和公開(或加密)指數 e 組成。私鑰由模數 n 和必須保密的私鑰(或解密)指數 d 組成。
現在,如果我們有 n 和 d(私鑰),我們只缺少 e 作為公鑰。但 e 通常相當小(小於三位數),甚至是固定的(常見值為 65537)。在這些情況下,獲取公鑰是微不足道的。
對於Elliptic Curve Diffie-Hellman,私鑰是 d,公鑰是 dG(G 也是公開的),所以它也很簡單。
在大多數非對稱密碼系統實現中,唯一可以確保的事實是您無法從公鑰中找到私鑰。反過來,在大多數情況下,從私鑰中找到公鑰是微不足道的。
例如,在 RSA 中,您可以使用以下方法從私鑰創建公鑰:
openssl rsa -in private.pem -pubout -out public.pem具有誤導性的是術語:“私鑰”指的是兩個不同的概念,無論您是在談論理論,還是在談論實際實施:
- 理論上的私鑰是與 (e, n) 共享完美對稱(數學)關係的一對*(d,* n )。如果您正在比較這些,則無法從另一個計算得出。
- 實用的私鑰(例如在 openssl 實現中)指的是一個包含*(d, n)的文件,但也包含幾個用於解碼速度目的的重要中間值。除此之外,公鑰e的理論上“未知”部分通常按照慣例固定為常用值(
0x10001預設情況下在 openssl 中,儘管可以更改,但強烈建議僅使用非常具體的值) . 因此,從私鑰推導出公鑰(e, n)*是微不足道的,原因不止一個。