Standards

EC SubjectPublicKeyInfo 格式

  • October 20, 2018

我無法在 EC SubjectPublicKeyInfo 結構中考慮額外的 0x00 字節。

> openssl asn1parse -i -in ecpub.pem -dump
0:d=0  hl=2 l=  89 cons: SEQUENCE          
2:d=1  hl=2 l=  19 cons:  SEQUENCE          
4:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
13:d=2  hl=2 l=   8 prim:   OBJECT            :prime256v1
23:d=1  hl=2 l=  66 prim:  BIT STRING        
 0000 - 00 04 d0 ee 64 61 7b 90-48 a2 a9 5f b5 a3 da 67   ....da{.H.._...g
 0010 - 53 56 91 e0 cf 5b b8 85-3e 05 0c b9 e6 95 c3 8d   SV...[..>.......
 0020 - 26 ab d7 ee 47 94 38 61-1e cd 07 e6 90 0b 3d 4a   &...G.8a......=J
 0030 - 6a df c5 d5 9f f3 11 91-53 00 ff 0e 91 93 49 44   j.......S.....ID
 0040 - 4c 58                                             LX

在以八位字節形式表示公鑰的 BIT STRING 中,在 0x04 字節(我期望它是第一個字節)之前的 0x00 字節是什麼?沒有神秘的 0x00 字節,公鑰就變成了 65 個字節,整個結構符合 SEC1 規範。

BIT STRING 值以單個字節開始,指示未使用的位數。位串可以是任意大小,因此它們可能不是 8 的倍數。因此它們以應該在末尾跳過的位數開始。在您的情況下,它告訴使用者最後一個字節的所有位5801011000以位為單位)都是值的一部分。

大多數時候 BIT STRING 無論如何都會對字節數組進行編碼,因此通常會將其設置為00而不是其他 7 種可能性之一。

第一位是最左邊的位,最後一位是最右邊的位。但這只有在位的順序很重要時才重要。在這種情況下,BIT STRING 包含未壓縮的 EC 點 $ W $ 所以這並不重要。

您可以在Burton S. Kaliski Jr. 的 ASN.1 外行指南第 5.4 節“BIT STRING”中找到這一點以及更多內容,當然還有標准文件 ITU-T X.680 和 X.690(都是付費軟體,所以我不會連結)。

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