Dsa

我可以縮短來自 OpenSSL 的大型 ECDSA 公鑰輸出文件嗎?

  • January 12, 2016

我在一個頻寬非常受限的環境中工作,我不時需要分發公鑰。分發以位格式發生,因此不需要編碼,充其量我希望我的所有數據都是“原始的”。

據我了解,壓縮形式的公鑰佔用曲線大小+1的空間,例如160位曲線給出161位公鑰。然而,OpenSSL 的輸出給了我一個更大的密鑰大小,例如 secp160r1 曲線的 904 位。我認為必須涉及很多元數據。

編輯:我刪除了“—公鑰從這裡開始—”等,這幾乎把文件切成了兩。但是仍然有 60 字節/480 位,比我認為的需要的要多得多。

我可以以某種方式減小這個大小,擺脫元數據嗎?例如提取簽名的關鍵組件並在接收方以兼容的格式重新組裝它?我認為 DER 編碼也會增加成本,但幾乎沒有這麼多?

以下是我在 Cygwin 中使用的命令:

$ openssl ecparam -out private.pem -name secp160k1 -genkey
$ openssl ec -in private.pem -pubout -conv_form compressed -out public.pem

Asn1parse 來救援。

大部分成本來自 base64 編碼和 PEM 頁眉和頁腳。

對於我的虛擬密鑰,壓縮形式的 ASN1 編碼的原始大小僅為 44 個字節。

其中 22 個字節用於實際公鑰的 161 位。

$ openssl asn1parse -in compressed_public.pem -i -dump
   0:d=0  hl=2 l=  42 cons: SEQUENCE
   2:d=1  hl=2 l=  16 cons:  SEQUENCE
   4:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
  13:d=2  hl=2 l=   5 prim:   OBJECT            :secp160k1
  20:d=1  hl=2 l=  22 prim:  BIT STRING
     0000 - 00 03 ca f2 7b b8 4c 3c-99 b2 7a 6f fb f3 cf 8f   ....{.L<..zo....
     0010 - 95 b8 77 61 76 dc                                 ..wav.

如果你像這樣將 PEM 編碼轉換為原始 DER 編碼……

$ openssl ec -pubin -in compressed_public.pem -outform der -out compressed_public.der
read EC key
writing EC key

…然後 44 字節是您的文件的大小。

$ stat compressed_public.pem | grep Size
 Size: 113             Blocks: 1          IO Block: 65536  regular file

$ stat compressed_public.der | grep Size
 Size: 44              Blocks: 1          IO Block: 65536  regular file

再看看這個:使用“dumpas1n”,您可以準確地看到那些 22 個非 pubkey 字節的去向:(

注意:dumpasn1 跳過了 22 字節“BIT STRING”對像開頭的“00”字節並且確實不顯示它。而 openssl asn1parse 不顯示。)

$ dumpasn1  | head -n2
DumpASN1 - ASN.1 object dump/syntax check program.
Copyright Peter Gutmann 1997, 1998.  Last updated 27 July 1998.

$ dumpasn1 compressed_public.der
  0 30   42: SEQUENCE {
  2 30   16:   SEQUENCE {
  4 06    7:     OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
 13 06    5:     OBJECT IDENTIFIER '1 3 132 0 9'
           :     }
 20 03   22:   BIT STRING 0 unused bits
           :     03 CA F2 7B B8 4C 3C 99 B2 7A 6F FB F3 CF 8F 95
           :     B8 77 61 76 DC
           :   }

0 warnings, 0 errors.

所以回答你的問題:

我可以以某種方式減小這個大小,擺脫元數據嗎?

是的。您可以將大小減少到僅 22 個字節(如果排除任何前導 00 字節,則為 21 個字節)。

(如果您想要另一個工具來查看 ASN1:這是asn1js online 中的那個鍵。)

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