Dsa
我可以縮短來自 OpenSSL 的大型 ECDSA 公鑰輸出文件嗎?
我在一個頻寬非常受限的環境中工作,我不時需要分發公鑰。分發以位格式發生,因此不需要編碼,充其量我希望我的所有數據都是“原始的”。
據我了解,壓縮形式的公鑰佔用曲線大小+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 中的那個鍵。)