web-dev-qa-db-ja.com

DER X.509証明書のsubjectPublicKeyフィールドに先頭の0x00バイトがあるのはなぜですか?

簡単な例として、512ビットのRSA証明書を使用して質問を説明します。証明書はDERとPEMの両方の形式 here で見つかります。私はこれを使用して証明書を調べてきました ASN.1デコーダー (デコーダーに提供されたリンクにはすでに問題の証明書がロードされています)。

便宜上、以下の証明書の16進バイトを再現しました。

 1  00000000: 3082 0212 3082 017b 0202 0dfa 300d 0609  0...0..{....0...
 2  00000010: 2a86 4886 f70d 0101 0505 0030 819b 310b  *.H........0..1.
 3  00000020: 3009 0603 5504 0613 024a 5031 0e30 0c06  0...U....JP1.0..
 4  00000030: 0355 0408 1305 546f 6b79 6f31 1030 0e06  .U....Tokyo1.0..
 5  00000040: 0355 0407 1307 4368 756f 2d6b 7531 1130  .U....Chuo-ku1.0
 6  00000050: 0f06 0355 040a 1308 4672 616e 6b34 4444  ...U....Frank4DD
 7  00000060: 3118 3016 0603 5504 0b13 0f57 6562 4365  1.0...U....WebCe
 8  00000070: 7274 2053 7570 706f 7274 3118 3016 0603  rt Support1.0...
 9  00000080: 5504 0313 0f46 7261 6e6b 3444 4420 5765  U....Frank4DD We
10  00000090: 6220 4341 3123 3021 0609 2a86 4886 f70d  b CA1#0!..*.H...
11  000000a0: 0109 0116 1473 7570 706f 7274 4066 7261  .....support@fra
12  000000b0: 6e6b 3464 642e 636f 6d30 1e17 0d31 3230  nk4dd.com0...120
13  000000c0: 3832 3230 3532 3635 345a 170d 3137 3038  822052654Z..1708
14  000000d0: 3231 3035 3236 3534 5a30 4a31 0b30 0906  21052654Z0J1.0..
15  000000e0: 0355 0406 1302 4a50 310e 300c 0603 5504  .U....JP1.0...U.
16  000000f0: 080c 0554 6f6b 796f 3111 300f 0603 5504  ...Tokyo1.0...U.
17  00000100: 0a0c 0846 7261 6e6b 3444 4431 1830 1606  ...Frank4DD1.0..
18  00000110: 0355 0403 0c0f 7777 772e 6578 616d 706c  .U....www.exampl
19  00000120: 652e 636f 6d30 5c30 0d06 092a 8648 86f7  e.com0\0...*.H..

20  00000130: 0d01 0101 0500 034b 0030 4802 4100 9bfc  .......K.0H.A...

21  00000140: 6690 7984 42bb ab13 fd2b 7bf8 de15 12e5  f.y.B....+{.....
22  00000150: f193 e306 8a7b b8b1 e19e 26bb 9501 bfe7  .....{....&.....
23  00000160: 30ed 6485 02dd 1569 a834 b006 ec3f 353c  0.d....i.4...?5<
24  00000170: 1e1b 2b8f fa8f 001b df07 c6ac 5307 0203  ..+.........S...
25  00000180: 0100 0130 0d06 092a 8648 86f7 0d01 0105  ...0...*.H......
26  00000190: 0500 0381 8100 14b6 4cbb 8179 33e6 71a4  ........L..y3.q.
27  000001a0: da51 6fcb 081d 8d60 ecbc 18c7 7347 59b1  .Qo....`....sGY.
28  000001b0: f220 48bb 61fa fc4d ad89 8dd1 21eb d5d8  . H.a..M....!...
29  000001c0: e5ba d6a6 36fd 7450 83b6 0fc7 1ddf 7de5  ....6.tP......}.
30  000001d0: 2e81 7f45 e09f e23e 79ee d730 31c7 2072  ...E...>y..01. r
31  000001e0: d958 2e2a fe12 5a34 45a1 1908 7c89 475f  .X.*..Z4E...|.G_
32  000001f0: 4a95 be23 214a 5372 da2a 052f 2ec9 70f6  J..#!JSr.*./..p.
33  00000200: 5bfa fddf b431 b2c1 4a9c 0625 43a1 e6b4  [....1..J..%C...
34  00000210: 1e7f 869b 1640                           .....@

20行目には、7番目のバイトから始まるシーケンス03 4B 00 30 48 02 41 00...があることに注意してください。

この最初のバイトを無視して、このビット文字列の残りの部分を見ると、DERエンコーディングルールに従って、バイトを72(0x48)バイトのシーケンスとして解析できます。これは、RSAパブリックのモジュラスと指数をエンコードします。整数としてのキー。

モジュラス自体が02 41 00 ...で始まり、

私の質問は、なぜこれらのバイトがここにあるのですか?整数として解釈される係数の場合、このnullバイトは問題になりません。ただし、シーケンスの最初では、証明書がDERエンコードされているため、意味のないEOCタグを示しているようです。

よろしくお願いします。

5
Stipe Matic

ASN.1BIT STRINGは任意の長さにすることができるので、DER/BERエンコーディングは8の倍数(オクテットの整数)とプレフィックスに切り上げます追加されたパディングビットのカウントを含む1オクテット。このBIT STRING値はそれ自体がDERエンコーディングであり、したがってすでに8ビットの倍数であるため、パディングカウントは00です。

ASN.1INTEGERは符号付きであり、DER/BERエンコーディングは2の補数ビッグエンディアンです。 N値9BFC ... 5307の大きさは、8ビットの正確な倍数です。ほとんどのRSAモジュラスは、ビットサイズを2の累乗で2より大きいように意図的に選択されているため、これは一般的です、またはあなたの場合512の小さな倍数。これを符号付き数値として表すには、0ビットをプレフィックスとして付ける必要があります。また、エンコーディングは整数オクテットでなければならないため、実際には完全な00オクテットをプレフィックスとします。

RSADSIが一連の公開鍵暗号規格(PKCS)を大量のASN.1を使用して確立した1990年代に、バートカリスキは、ASN.1に関する多くの有用な詳細をすばやくカバーする「Layman's Guide」を書きました。特に これは明らかに決定的な参照 または これはより便利ですが不確実な永続的な参照 の5.4および5.7を参照してください。

6