Rsa

私有 RSA 文件的哪些元素真正構成了私鑰?

  • August 21, 2021

我曾經openssl rsa生成一個 2048 位的 RSA 密鑰,並且正如預期的那樣,輸出屬於以BEGIN RSA PRIVATE KEY模式開頭的文件。但是,此文件大小遠大於 2048 位。為了提取密鑰,我使用了以下 openssl 命令:

openssl rsa -in key.txt -text

它返回以下項目的數據:

  • 模量
  • 公共指數
  • privateExponent(大小為 2048 位)
  • 素數1
  • 素數2
  • 指數1
  • 指數2

那麼這個文件的哪些部分是私鑰的組成部分呢?密碼系統僅能理解哪些部分?我可以只剝離所有數據privateExponent,除了它是否仍會被解釋為私鑰?

編輯

我似乎這對夫婦(modulus, publicExponent)是公鑰。但是,正如您在回答中提到的,puboicExponent 始終是 65537?還是我誤解了?

看起來我只需要執行私鑰操作d=privateExponent。但是,諸如openssl需要包含所有資訊的格式化文件之類的工具,是否有一種簡單的方法可以使其理解d(並n從證書中檢索)是我所擁有的並且足以進行加密操作?

這是一個比看起來更難的問題。

要執行“普通”RSA模冪運算,您可以簡單地使用私有指數和模數。但是,對於使用中國剩餘定理 (CRT) 的更快 RSA 計算,您需要素數、指數和模數。對於 RSA CRT,您不需要私有指數。


原則上,您可以從素數計算所有私有值:畢竟這只是 RSA 密鑰對生成:您找到素數,然後對它們執行計算。因此,僅儲存素數是一種節省空間的選擇。但是,這確實意味著您必須在每次 RSA 計算之前重新創建模數和私有指數或 CRT 參數,這需要時間。

還有一個更節省空間的選擇:儲存素數搜尋從其開始的隨機種子,但它帶來了大量問題(例如必須為每次計算找到素數,這是一個非常低效的操作)。但是,這確實意味著您只能儲存 128 位。


僅從私有指數和模數中取回 CRT 參數是可能的,但這需要時間,因此首先否定了使用 CRT 的任何優勢。所以這種計算應該只執行一次,如果有的話。如果您首先確實選擇了普通 RSA,然後決定進行 CRT 計算,這可能是有道理的。這很難做到——工具通常不會包含這個選項——所以我會盡量避免使用它。


私鑰操作不需要的公共指數。有時,公鑰用於驗證操作是否成功結束(例如,通過在生成簽名後立即驗證簽名)。這當然是一個完全可選的操作,通常只執行以確保沒有人首先弄亂生成。

您可以說主要包括公共指數,因為它可以很容易/有效地計算/從私人指數中猜測,因此包括它對於 PKCS#1 是有意義的,其中定義了問題中的結構。

請注意,公共指數通常被簡單地設置為單個小值,65537 或 F4,即費馬的第五個素數。這是 OpenSSL(目前)預設使用的。


編輯:如果您需要處理 OpenSSL,我認為您不能遺漏太多。OpenSSL 使用 PKCS#1 或 PKCS#8 私有 RSA 密鑰。PKCS#8 僅包含 PKCS#1 私鑰,因此表示形式稍大一些。

反過來,PKCS#1 定義如下(來自定義 PKCS#1的 RFC 3447 附錄 C 中的 ASN.1 模組):

--
-- Representation of RSA private key with information for the CRT
-- algorithm.
--
RSAPrivateKey ::= SEQUENCE {
   version           Version,
   modulus           INTEGER,  -- n
   publicExponent    INTEGER,  -- e
   privateExponent   INTEGER,  -- d
   prime1            INTEGER,  -- p
   prime2            INTEGER,  -- q
   exponent1         INTEGER,  -- d mod (p-1)
   exponent2         INTEGER,  -- d mod (q-1)
   coefficient       INTEGER,  -- (inverse of q) mod p
   otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

如您所見,其中的大部分內容都是非可選的。只能otherPrimeInfos- 通常已經 - 為空,因為它用於 CRT 多素數計算。

名為“私鑰”的文件包含比單獨的私鑰更多的資訊,它包括生成私鑰/公鑰對所需的所有數據(素數、模數、指數等)。

並且很容易看到這些資訊:

openssl genrsa -out private.pem 1024   #generate private key file
openssl rsa -in private.pem -text      #view info in the private key file
openssl rsa -in private.pem -pubout -out public.pem  #extract public key to file
openssl rsa -in public.pem -pubin -text  #view info in the public key file

您將看到該私鑰文件包含素數和所有其他資訊,而公共文件僅包含模數和公共指數。

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