Standards
EC SubjectPublicKeyInfo 格式
我無法在 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 的倍數。因此它們以應該在末尾跳過的位數開始。在您的情況下,它告訴使用者最後一個字節的所有位
58
(01011000
以位為單位)都是值的一部分。大多數時候 BIT STRING 無論如何都會對字節數組進行編碼,因此通常會將其設置為
00
而不是其他 7 種可能性之一。第一位是最左邊的位,最後一位是最右邊的位。但這只有在位的順序很重要時才重要。在這種情況下,BIT STRING 包含未壓縮的 EC 點 $ W $ 所以這並不重要。
您可以在Burton S. Kaliski Jr. 的 ASN.1 外行指南第 5.4 節“BIT STRING”中找到這一點以及更多內容,當然還有標准文件 ITU-T X.680 和 X.690(都是付費軟體,所以我不會連結)。