openssl: ディフィー・ヘルマン鍵共有


前提


ドキュメント


鍵の共有(交換)

盗聴がある通信経路でも、公開鍵暗号の仕組みにより、送受信者間で共通の鍵(共通鍵暗号)を(共有)交換できる。


DH(ディフィー・ヘルマン)鍵共有

  1. 共通のパラメータを決める(公開OK)
  2. 各自がプライベート鍵と公開鍵を作成
  3. 相手の公開鍵、自分のプライベート鍵、パラメータから、共通鍵を作成

鍵共有の流れ

# Python例

# 共通のパラメータ(公開)
p = 65537 # 大きな素数
g = 2 # 生成元(generator)

# プライベート鍵
Alice = 123
Bob = 9999

# 公開鍵
a = g**Alice % p
b = g**Bob % p


# 共通鍵 65505
# alice側
A = b**Alice % p
# bob側
B = a**Bob % p

A == B # True

離散対数問題

公開鍵とパラメータから、プライベート鍵を求めるのは計算量的に困難。


パラメータの同意(作成): openssl genpkey

作成

# パラメータ番号2: 2048-bit MODP Group with 224-bit Prime Order Subgroup
openssl genpkey -genparam -algorithm DH -out dh-param.pem \
  -pkeyopt dh_rfc5114:2

# 独自パラメータなら片方で決めて他方に送信
# 2048ビットで作成
openssl genpkey -genparam -algorithm DH -out dh-param.pem \
  -pkeyopt dh_paramgen_prime_len:2048

パラメータの内容: openssl pkeyparam

openssl pkeyparam -text -noout -in dh-param.pem
DH Parameters: (2048 bit)
    prime:
        00:ad:10:7e:1e:91:23:a9:d0:d6:60:fa:a7:95:59:
(略)

プライベート鍵の作成: openssl genpkey

# アリス側
openssl genpkey -paramfile dh-param.pem -out alice-pri-key.pem

# プライベート鍵の内容(公開鍵・パラメータ含む)
openssl pkey -text -noout -in alice-pri-key.pem
# ボブ側
openssl genpkey -paramfile dh-param.pem -out bob-pri-key.pem

公開鍵の抽出: openssl pkey

# アリス側
openssl pkey -pubout -in alice-pri-key.pem -out alice-pub-key.pem

# 公開鍵の内容(パラメータ含む)
openssl pkey -text -noout -pubin -in alice-pub-key.pem
# ボブ側
openssl pkey -pubout -in bob-pri-key.pem -out bob-pub-key.pem

共通鍵の共有: openssl pkeyutl

# アリス側
openssl pkeyutl -derive -inkey alice-pri-key.pem -peerkey bob-pub-key.pem \
  -out shared-secret

# アリスもボブも同じ
md5sum shared-secret

# ボブ側
openssl pkeyutl -derive -inkey bob-pri-key.pem -peerkey alice-pub-key.pem \
  -out shared-secret