Openssl

使用私鑰和公鑰進行遊戲和學習的“嚴格”軟體

  • May 9, 2015

我的問題僅用於教學/學習實踐,我認為這對現實世界沒有意義。

我玩過 openssl 很多,但據我了解,它在輸入格式方面並不嚴格,因為它能夠理解不同的格式或執行一些對使用者不透明的操作。

解決問題:有沒有辦法通過使用 openssl 從密鑰對中獲取私鑰並從該私鑰中獲取公鑰來計算公鑰?一個例子:

當我執行openssl rsa -in private.key -pubout 時,我知道 openssl 不會從私鑰計算公鑰,但它只是提取已經儲存在密鑰對中的資訊(private.key 確實是該對的儲存) .

openssl pkey -in private.key -text聲稱要提取私鑰,但我如何確定它不是另一個密鑰對儲存?理想情況下,我會使用比 openssl 更嚴格的軟體,它接收的輸入更嚴格,並用私鑰提供它,如果作為輸入,它會抱怨密鑰對。

可能是我試圖清除的混亂來自這樣一個事實,即我可能遺漏了密碼學的一些細節,但我想通過使用不同的軟體來檢查這一點(即用一個軟體加密數據並解密它另一個),又是一個對輸入內容非常嚴格的軟體,換句話說,它對使用者不友好但對學習者友好:-)

對於軟體,我更喜歡手頭有東西而不是編譯任何東西。

感謝您閱讀到這裡:-)

亞歷克斯

OpenSSL 支持幾種不同格式的 RSA 私鑰,但實際的密鑰值是相同的。都使用ASN.1,區別是

  • 格式是否僅處理 RSA(稱為“遺留”或“原始”PKCS#1)或可以處理更普遍可用的其他算法(PKCS#8)(仍然不是非常)
  • 密鑰值是否加密
  • 文件是否包含 ASN.1 數據的直接編碼(稱為 DER 或有時二進制)或對人類更方便的文本編碼,以及設計用於與電子郵件和 WWW 等主要文本進行人類互動的應用程序(稱為 PEM,有時稱為 base64;PEM實際上由base64組成,加上“BEGIN”和“END”行,所以base64是人們通常感興趣的部分)

正如@poncho 的評論所建議的那樣,ASN.1 RSAPrivateKey 是優化的 CRT 形式,並且已經包含了公鑰所需的兩個值(n 和 e);該-pubout選項包括以(任何)私鑰格式讀取私鑰並使用這兩個欄位編寫公鑰格式;不需要計算。(正式公鑰也有多種格式,但在實踐中只使用了兩種:DER 或 PEM 中的 X.509 SPKI。)

除了加密之外,其他兩個選項(legacy vs PKCS#8 和 binary vs PEM)之間的轉換非常簡單且獨立(或非常接近)實際密鑰。由於所有未加密的表單都是 ASN.1,因此您可以應用任何 ASN.1 轉儲或解析程序(有很多,包括 OpenSSL 中的一個,但您顯然不信任 OpenSSL)並將結果與已發布的 PKCS#1 和 PKCS#8 進行比較標準,或其重新發佈為 RFC 3447 和 5208。如果您不信任 ASN.1 程序,您可以使用任何十六進制轉儲或十六進制編輯器程序查看二進制編碼(或轉換為二進制的 base64)並解碼 ASN。手動 1 個 DER,如果有點乏味,這很簡單,結果如上 PKCS#1 或 PKCS#8。

您使用的任何其他對其輸入“更嚴格”的程序仍然可以使用**“另一個儲存”**;這些概念是完全獨立的。您只能完全自己編寫程式碼(即使這樣您也可能會擔心編譯器會欺騙您!),自己檢查程式碼(OpenSSL 是 FOSS,但相當大且複雜,而且大部分都是舊的,很少或沒有註釋),或者相信某人。

最後,為了上下文,還有一個後來更流行的標準 PKCS#12(基於 Microsoft PFX)處理私鑰(PKCS#8 多算法格式)加上相關證書(X.509 格式,這也是多算法)。OpenSSL 支持將私鑰PKCS#12 相互轉換,但不將其用作“本機”格式。

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