GPG:和和E子密鑰的公鑰和主密鑰的公鑰一樣嗎?
我進口
$$ E $$子密鑰從 ~/.gnupg 到不同的文件夾,並使用選項導出子密鑰的公鑰
--homedir
。 我可以看到子密鑰的公鑰的行數少於主公鑰的行數,使用差異結果表明它們的一些起始行相同,但是底部的行不同,所以最後它仍然是不同的公鑰。我的問題:它們是不同的公鑰嗎?(我仍然需要在這裡雙重確認)。如果它們不同,那麼使用子密鑰的加密/解密是獨立的,並且與主密鑰和其他子密鑰無關?
在非對稱密碼學中,您總是處理密鑰對。每個密鑰都有一個對應的公鑰。所以回答你的第一個問題:是的,主密鑰對的公鑰與其從屬密鑰對的公鑰不同。
我試圖重現您的實驗並創建了一個帶有主鍵(ID 0xA6271DD4)和從屬鍵(ID 0x5336E1DC)的 GnuPG 測試鍵。然後我將從屬密鑰導出到一個文件並檢查它包含哪些數據包。
$ gpg --export-secret-subkey 5336E1DC! > subkey.gpg $ gpg --list-packets subkey.gpg | grep "\(packet\|keyid\)" :secret key packet: keyid: 877AA505A6271DD4 :user ID packet: "testtest <test@test>" :signature packet: algo 1, keyid 877AA505A6271DD4 :secret sub key packet: keyid: B0389BEB5336E1DC :signature packet: algo 1, keyid 877AA505A6271DD4 $
請注意,使用者 ID 和秘密從屬密鑰都由主密鑰簽名。乍一看,似乎主密鑰和從屬密鑰都被導出了。顯示有關第一個秘密數據包的更多資訊。
$ gpg --list-packets subkey.gpg | head # off=0 ctb=95 tag=5 hlen=3 plen=277 :secret key packet: version 4, algo 1, created 1546169910, expires 0 pkey[0]: [2048 bits] pkey[1]: [17 bits] gnu-dummy S2K, algo: 0, simple checksum, hash: 0 protect IV: keyid: 877AA505A6271DD4 # off=280 ctb=b4 tag=13 hlen=2 plen=20 :user ID packet: "testtest <test@test>" $
在 GnuPG 中導出密鑰時,始終會導出相應的公鑰。所以這個密鑰包包含一個 2048 位的公鑰加上可能的 17 位散列。但是密鑰本身失去了,只導出了一個存根:
gnu-dummy S2K, algo: 0, simple checksum, hash: 0
. 總結一下:當導出一個秘密子密鑰時,你總是用它導出公共子密鑰和公共主密鑰(驗證簽名所必需的)。您寫道,您的公共子密鑰的行數少於公共主密鑰。我無法重現。使用 GnuPG,您可以導出沒有任何子密鑰的公鑰,在上面的範例中通過命令
gpg --export A6271DD4! > pubkey.gpg
(請注意驚嘆號)。另一方面,不能只導出一個公共子密鑰。但是如果將主密鑰與主密鑰加上它的子密鑰進行比較,後者自然會有更多的行。因此,為了更好地理解您的觀察,最好知道您使用的確切命令。