Elliptic-Curves

gnupg 2.x 的 pgpdump 替代品

  • May 28, 2021

我想看 gpg2 關鍵參數數據包。pgpdump v0.32 不支持 gpg2(尤其是橢圓曲線加密數據包)並且“gpg2 –list-packets”不顯示“秘密”關鍵參數。

有沒有辦法在 gpg2 導出的秘密子密鑰中查看橢圓曲線加密算法的(秘密)密鑰參數( d、q 和曲線)?

注意:我閱讀了OpenPGP 公鑰算法,但這不是我的答案。

當我--verbose --list-packets在導出密鑰時使用它時,它會顯示密鑰(子)數據包中的所有欄位。至少看起來它是完整的。

它不打開密鑰加密,所以我必須使用空密碼導出密鑰(不幸的是,不再有導出選項,所以我不得不編輯密鑰)。

在這種情況下,它使用命名曲線,曲線參數是公開的,不會導出。

> gpg.exe --verbose --list-keys
pub   brainpoolP384r1 2017-12-09 [SC]
     971D76C158AFD6D6AC53205327C195C6F0FB0EDA
uid        [ ultimativ ] Bernd Eckenfels (test) <ecki@zusammenkunft.net>
sub   brainpoolP384r1 2017-12-09 [E]

> gpg.exe --export-secret-key > secret.pgp

> gpg.exe" --verbose --list-packets secret.pgp
...
# off=0 ctb=94 tag=5 hlen=2 plen=168
:secret key packet:
       version 4, algo 19, created 1512840291, expires 0
       pkey[0]: 092B240303020801010B brainpoolP384r1 (1.3.36.3.3.2.8.1.1.11)
       pkey[1]: 042B9980A50F01AE91CA7B5A6ABDD350B3FE6BB8E7F44E561FDCB45354BA0D721DA4D9E3DB9B8CD96E248F2099E643E0073649E6D97DB9FCF67B1060F8F36EE0F12F3CEAC68F0D7DAC811DA290693F7620640F87A398901E6D2BDBEA6D4A7251E4
       skey[2]: 40223083F5447B9C109A2F063EAF45FFA7D3DDC48AF71F061B4E95CA475775CF488095D4EDE4109B9539DFD036AE4DB7
       checksum: 1872
       keyid: 27C195C6F0FB0EDA
...
# off=397 ctb=9c tag=7 hlen=2 plen=172
:secret sub key packet:
       version 4, algo 18, created 1512840291, expires 0
       pkey[0]: 092B240303020801010B brainpoolP384r1 (1.3.36.3.3.2.8.1.1.11)
       pkey[1]: 0467F588651ACAB96B80CA052030B3337E8374586C86B3D4386D5569D6C548C0D76662EB112438300B73275FB81809CE6642D3B1878292729B1F3FD1AE2C246AE7064A7B9464446E7A4E0C16B25FD933556371271862C6EEFDFE01087BEEB3CFF9
       pkey[2]: 03010909
       skey[3]: 15FCB0053B11FD8E4E907E9E7ED937F0E226AE0DF4D79D333ED18BF396191628E8A82241BF26B1C1FBD9F5984636A495
       checksum: 19cb
       keyid: 80C1909634D5FC1B

18 ECDH公鑰算法

$$ RFC6637 $$

19 ECDSA公鑰算法 $$ RFC6637 $$ pkey[0]是曲線 OID。曲線的參數是公知的,不是密鑰格式的一部分。

pkey[1]是公共點(未壓縮格式以 04 開頭,然後是兩個 384 位標量整數作為座標)。

根據 RFC 6637,ECDH 和 ECDSA 密鑰只有一個秘密算法特定參數:MPI 標量。上面的範例將它們列為skey[2]ECDSA 主鍵。在我的例子中是一個 0x017f 位長的標量(48 字節)。

順便說一句:如果使用受密碼保護的密鑰導出,它看起來像:

# off=0 ctb=94 tag=5 hlen=2 plen=214
:secret key packet:
       version 4, algo 19, created 1512840291, expires 0
       pkey[0]: 092B240303020801010B brainpoolP384r1 (1.3.36.3.3.2.8.1.1.11)
       pkey[1]: 042B9980A50F01AE91CA7B5A6ABDD350B3FE6BB8E7F44E561FDCB45354BA0D721DA4D9E3DB9B8CD96E248F2099E643E0073649E6D97DB9FCF67B1060F8F36EE0F12F3CEAC68F0D7DAC811DA290693F7620640F87A398901E6D2BDBEA6D4A7251E4
       iter+salt S2K, algo: 7, SHA1 protection, hash: 2, salt: 70B08AE0E115EFEE
       protect count: 1507328 (167)
       protect IV:  98 be 19 56 65 43 7c 32 0a ff 4f 21 5b eb 47 af
       skey[2]: [v4 protected]
       keyid: 27C195C6F0FB0EDA

這些範例是使用 win64 gpg 2.3.2 (libcrypt 1.8.1) 創建的。

這是測試密鑰:https ://gist.github.com/ecki/8adb287fa64347bfba218a6fd9e21d0f和詳細資訊。

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