私有 RSA 文件的哪些元素真正構成了私鑰?
我曾經
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
您將看到該私鑰文件包含素數和所有其他資訊,而公共文件僅包含模數和公共指數。