Diffie-Hellman素数を生成した場合openssl dhparam 512 -text
(ペーストサイズを小さくするために意図的に小さいサイズです。最小値は2048以上であることを知っています)、出力のさまざまな部分は次のとおりです。
PKCS#3 DH Parameters: (512 bit)
prime:
00:84:f7:d4:6a:96:54:da:8e:b0:68:4d:8f:42:fe:
52:a1:4f:dc:05:f7:0b:f1:4a:fd:dd:0a:27:b7:b4:
c4:09:db:4d:80:c2:b0:46:e0:f6:dc:fe:e2:9a:d2:
5c:e8:7c:6e:9f:81:aa:bc:4b:8c:6e:67:b5:e5:b2:
03:b6:56:d3:c3
generator: 2 (0x2)
-----BEGIN DH PARAMETERS-----
MEYCQQCE99RqllTajrBoTY9C/lKhT9wF9wvxSv3dCie3tMQJ202AwrBG4Pbc/uKa
0lzofG6fgaq8S4xuZ7XlsgO2VtPDAgEC
-----END DH PARAMETERS-----
ジェネレーターは、通常2または5の基本数であることを理解しています。問題は素数とDHパラメーターです。
- 表現されている素数は何ですか?
実際の数値のプレーン16エンコード。
- どうすれば実際の素数に変換できますか?
ベース16から変換するだけです。
$ echo "ibase=16;0084F7D46A9654DA8EB0684D8F42FE52A14FDC05F70BF14AFDD\
D0A27B7B4C409DB4D80C2B046E0F6DCFEE29AD25CE87C6E9F81AABC4B8C6E67B5E5B\
203B656D3C3" | bc
69641036876619088755613794741049804861416084108574896892562277663292\
07662129683124275184714669456043499786144904245391117269209586570225\
834561454877365187
そして、はい、それは実際には素数です。
$ openssl prime -hex 0084F7D46A9654DA8EB0684D8F42FE52A14FDC05F70BF14AFDDD0A27B7B4C409DB4D80C2B046E0F6DCFEE29AD25CE87C6E9F81AABC4B8C6E67B5E5B203B656D3C3
84F7D46A9654DA8EB0684D8F42FE52A14FDC05F70BF14AFDDD0A27B7B4C409DB4D80C2B046E0F6DCFEE29AD25CE87C6E9F81AABC4B8C6E67B5E5B203B656D3C3 is prime
- DHパラメータセクションでエンコードされるのは何ですか(なぜですか?)
プレーンテキストの説明と同じです。
PEMバージョン:
$ cat dh.pem
-----BEGIN DH PARAMETERS-----
MEYCQQCE99RqllTajrBoTY9C/lKhT9wF9wvxSv3dCie3tMQJ202AwrBG4Pbc/uKa
0lzofG6fgaq8S4xuZ7XlsgO2VtPDAgEC
-----END DH PARAMETERS-----
人間が使用するためにopensslでそのファイルを解析します。
$ cat dh.pem | openssl dhparam -noout -text
DH Parameters: (512 bit)
prime:
00:84:f7:d4:6a:96:54:da:8e:b0:68:4d:8f:42:fe:
52:a1:4f:dc:05:f7:0b:f1:4a:fd:dd:0a:27:b7:b4:
c4:09:db:4d:80:c2:b0:46:e0:f6:dc:fe:e2:9a:d2:
5c:e8:7c:6e:9f:81:aa:bc:4b:8c:6e:67:b5:e5:b2:
03:b6:56:d3:c3
generator: 2 (0x2)
そして、実際のASN1エンコーディングを解析します。
$ cat dh.pem | openssl asn1parse -i
0:d=0 hl=2 l= 70 cons: SEQUENCE
2:d=1 hl=2 l= 65 prim: INTEGER :84F7D46A9654DA8EB0684D8F42FE52A14FDC05F70BF14AFDDD0A27B7B4C409DB4D80C2B046E0F6DCFEE29AD25CE87C6E9F81AABC4B8C6E67B5E5B203B656D3C3
69:d=1 hl=2 l= 1 prim: INTEGER :02
- さまざまなアプリケーション(httpdなど)がこの出力をどのように使用しますか?
OpenSSLライブラリにリンクし、関連ファイルを渡すだけだと思います。そして、OpenSSLがそれを処理できるようにします。