TLSとDiffie-Hellmanグループパラメータ

# 前提

まず第一に、TLSのDiffie-Hellman鍵交換にはEphemeralとStaticとAnonymousがありますが、後二者はひとまず忘れてください。本稿で扱うのはEphemeral Diffie-Hellman (DHE) です。

第二に、楕円関数 (Elliptic Curve, EC) Diffie-Hellman ではない方の、普通のDiffie-Hellman法のことを冪剰余（べきじょうよ、Modular Exponentiation, MODP）Diffie-Hellmanと呼びます。[RFC7919](https://tools.ietf.org/html/rfc7919) ([Google翻訳](https://rfcs.web.fc2.com/rfc7919.html)) では有限体 (Finite Field, FF) Diffie-Hellmanという用語が出てきますが、FF Diffie-HellmanとMODP Diffie-Hellmanは同じもの、という解釈で良いようです。

というわけで本稿の対象はTLSにおけるFinite Field Ephemeral Diffie-Hellman (FFDHE) のグループパラメータというニッチな話題です。

# Diffie-Hellman鍵交換と二つの流派

Diffie-Hellman鍵交換は、TLSの場合、不肖拙稿[SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する](https://qiita.com/n-i-e/items/41673fd16d7bd1189a29)で述べたとおり、こんな感じで行われます。

|クライアント| |サーバ|
|--:|:-:|:--|
|||共通値(g, p)の作成|
|||サーバ秘密鍵と公開鍵の作成|
||←|共通値(g, p)、サーバ公開鍵の送信|
|共通値(g, p)を基にクライアント秘密鍵、公開鍵の作成|||
|クライアント公開鍵の送信|→||
|共有秘密値の算出||共有秘密値の算出|

最初に算出する共通値 (g, p) はグループパラメータと呼ばれます。秘密である必要はなく、無暗号でそのまま送ります。

このグループパラメータ、従来のTLSではサーバ側でランダムに生成するものとされてきました。これが第一の流派です。

第二の流派は、 (g, p) の一覧表をあらかじめ仕様書に書いておき、使うときはその中から選んで使うというものです。この流派の代表的な存在はIPSecです。例えばIKEv1の場合、[IANAの番号表](https://www.iana.org/assignments/ipsec-registry/ipsec-registry.xhtml#ipsec-registry-10)に載っているうち、1, 2, 5, 14, 15, 16, 17, 18, 22, 23, 24の11種類がMODP DHのグループパラメータです。

sshの場合、[IANAの番号表](https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml#ssh-parameters-16)に載っているうち、MODP DH対応なのはdiffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group15-sha512, diffie-hellman-group16-sha512, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512の9種類です。前2者はサーバがグループパラメータをランダムに選ぶ方式（第一の流派）、後7者は固定値の割り当て（第二の流派）です。

そしてついに[RFC7919](https://tools.ietf.org/html/rfc7919) ([Google翻訳](https://rfcs.web.fc2.com/rfc7919.html)) で、グループパラメータをRFCに書く流儀がTLSにも導入されました。[IANAの番号表](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8)に載っているうち、FFDHE対応なのは256, 257, 258, 259, 260の5種類です。

# TLSプロトコルの仕様はRFC7919でどう変わったのか？

従来elliptic_curves拡張 ([RFC4492](https://tools.ietf.org/html/rfc4492), [Google翻訳](https://rfcs.web.fc2.com/rfc4492.html)) と呼ばれていたTLSの拡張が、RFC7919で __supported_groups拡張__ と名前が変わり、そこにDiffie-Hellmanグループパラメータを書き込むことになりました。

ちょっとムリヤリな気がしますが、後付けなのでここは仕方ないところです。

# どのパラメータが安全なのか？

2015年の[Logjam](https://weakdh.org/) ([Google翻訳](https://translate.google.com/translate?sl=en&tl=ja&u=https%3A%2F%2Fweakdh.org%2F)) の指摘によると、研究機関なら768bit、国家機関なら1024bitでも破れる可能性があるとのことです。それから2年経っているので、今はもう少し多めに見積もる必要があるかもしれませんが、[RFC8270](https://tools.ietf.org/html/rfc8270) ([Google翻訳](https://rfcs.web.fc2.com/rfc8270.html)) は1024bitを危険、2048bitを安全としており、2022年1月に出た[RFC9142](https://tools.ietf.org/html/rfc9142) ([Google翻訳](https://rfcs.web.fc2.com/rfc9142.html)) は2048bit未満を危険としているので、本稿もそれに倣って1024bit、1536bitは危険（×）、2048bit以上は安全（〇）と見ることにします。

## TLS
TLSは、5種類全部安全です。

|番号|名称|RFC|安全性|
|--:|:--|:--|:--|
|256|ffdhe2048|[RFC7919 Appendix A.1](https://tools.ietf.org/html/rfc7919#appendix-A.1)|〇|
|257|ffdhe3072|[RFC7919 Appendix A.2](https://tools.ietf.org/html/rfc7919#appendix-A.2)|〇|
|258|ffdhe4096|[RFC7919 Appendix A.3](https://tools.ietf.org/html/rfc7919#appendix-A.3)|〇|
|259|ffdhe6144|[RFC7919 Appendix A.4](https://tools.ietf.org/html/rfc7919#appendix-A.4)|〇|
|260|ffdhe8192|[RFC7919 Appendix A.5](https://tools.ietf.org/html/rfc7919#appendix-A.5)|〇|


## IPSec
IPSecで安全なのは11種類中7種類です。

|番号|名称|RFC|安全性|
|--:|:--|:--|:--|
|1|default 768-bit MODP group|[RFC2409 Section 6.1](https://tools.ietf.org/html/rfc2409#section-6.1)|×|
|2|alternate 1024-bit MODP group|[RFC2409 Section 6.2](https://tools.ietf.org/html/rfc2409#section-6.2)|×|
|5|1536-bit MODP group|[RFC3526 Section 2](https://tools.ietf.org/html/rfc3526#section-2)|×|
|14|2048-bit MODP group|[RFC3526 Section 3](https://tools.ietf.org/html/rfc3526#section-3)|〇|
|15|3072-bit MODP group|[RFC3526 Section 4](https://tools.ietf.org/html/rfc3526#section-4)|〇|
|16|4096-bit MODP group|[RFC3526 Section 5](https://tools.ietf.org/html/rfc3526#section-5)|〇|
|17|6144-bit MODP group|[RFC3526 Section 6](https://tools.ietf.org/html/rfc3526#section-6)|〇|
|18|8192-bit MODP group|[RFC3526 Section 7](https://tools.ietf.org/html/rfc3526#section-7)|〇|
|22|1024-bit MODP Group with 160-bit Prime Order Subgroup|[RFC5114 Section 2.1](https://tools.ietf.org/html/rfc5114#section-2.1)|×|
|23|2048-bit MODP Group with 224-bit Prime Order Subgroup|[RFC5114 Section 2.2](https://tools.ietf.org/html/rfc5114#section-2.2)|〇|
|24|2048-bit MODP Group with 256-bit Prime Order Subgroup|[RFC5114 Section 2.3](https://tools.ietf.org/html/rfc5114#section-2.3)|〇|

## ssh
sshのdiffie-hellman-group1-sha1, diffie-hellman-group14-sha1は、IPSecのOakley Group 2と14と全く同じです。前者 (diffie-hellman-group1-sha1) はビット数が1024でLogjamに弱いので使うのは止めましょう (SHOULD NOT) という話なのですが、後者は微妙です。 __sha1__ の4字が気になるじゃないですか。とはいえ、2022年1月の[RFC9142](https://tools.ietf.org/html/rfc9142) ([Google翻訳](https://rfcs.web.fc2.com/rfc9142.html)) 時点では、今すぐ直ちに使うのを止めなさいという話にはなっていません。その代わり、MUSTからMAYに降格されました。将来的には非推奨になるでしょう。

|名称|RFC|ビット数|安全性|
|:--|:--|--:|:--|
|diffie-hellman-group1-sha1|[RFC4253 Section 8.1](https://tools.ietf.org/html/rfc4253#section-8.1), [RFC2409 Section 6.2](https://tools.ietf.org/html/rfc2409#section-6.2)|1024|×|
|diffie-hellman-group14-sha1|[RFC4253 Section 8.2](https://tools.ietf.org/html/rfc4253#section-8.2), [RFC3526 Section 3](https://tools.ietf.org/html/rfc3526#section-3)|2048|〇|
|diffie-hellman-group14-sha256|[RFC8268](https://tools.ietf.org/html/rfc8268), [RFC3526 Section 3](https://tools.ietf.org/html/rfc3526#section-3)|2048|〇|
|diffie-hellman-group15-sha512|[RFC8268](https://tools.ietf.org/html/rfc8268), [RFC3526 Section 4](https://tools.ietf.org/html/rfc3526#section-4)|3072|〇|
|diffie-hellman-group16-sha512|[RFC8268](https://tools.ietf.org/html/rfc8268), [RFC3526 Section 5](https://tools.ietf.org/html/rfc3526#section-5)|4096|〇|
|diffie-hellman-group17-sha512|[RFC8268](https://tools.ietf.org/html/rfc8268), [RFC3526 Section 6](https://tools.ietf.org/html/rfc3526#section-6)|6144|〇|
|diffie-hellman-group18-sha512|[RFC8268](https://tools.ietf.org/html/rfc8268), [RFC3526 Section 7](https://tools.ietf.org/html/rfc3526#section-7)|8192|〇|

# 考察

IPSecのグループパラメータとTLSのグループパラメータは、ビット数は同じでも中身が違います。こんなところで独自色を出す意味があるんでしょうか。謎です。まあ実用上は困らないのでしょう。

sshのグループパラメータは、以前は種類が少なかったのですが、2017年12月の[RFC8268](https://tools.ietf.org/html/rfc8268) ([Google翻訳](https://rfcs.web.fc2.com/rfc8268.html)) で5種類が追加され、十分な数となりました。今後ssh対応のクライアント・サーバを使う場合は、RFC8268対応の製品を使うのがお勧めです。

2015年の[Logjam](https://weakdh.org/) ([Google翻訳](https://translate.google.com/translate?sl=en&tl=ja&u=https%3A%2F%2Fweakdh.org%2F)) を受けて、2017年12月に[RFC8270](https://tools.ietf.org/html/rfc8270) ([Google翻訳](https://rfcs.web.fc2.com/rfc8270.html)) というのが出ました。これは何かというと、sshの第一の流派であるdiffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256のビット数の下限を1024bitから2048bitに増やすというものです。さらに追加措置として、2022年1月の[RFC9142](https://tools.ietf.org/html/rfc9142) ([Google翻訳](https://rfcs.web.fc2.com/rfc9142.html)) ではdiffie-hellman-group-exchange-sha1が非推奨 (SHOULD NOT) になりました。

第二の流派であるdiffie-hellman-group1-sha1 (1024bit) は放っておいていいのかというと、もちろんそんなことはなくて、やはり[RFC9142](https://tools.ietf.org/html/rfc9142) ([Google翻訳](https://rfcs.web.fc2.com/rfc9142.html)) で非推奨 (SHOULD NOT) になりました。将来的には禁止 (MUST NOT) になるでしょう。

いずれにしても、今後時代を経るに従って、古くなったグループパラメータは使わないことを推奨みたいなお達しが順次出て来ると思いますので、開発者、運用者の皆様におかれては、CSIRTその他諸機関が発するニュースを注意してウォッチするようにして下さい。

以上！幸運を祈る。

# 参考文献

## RFC
### TLS

Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)
https://tools.ietf.org/html/rfc4492 ([Google翻訳](https://rfcs.web.fc2.com/rfc4492.html))

Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS)
https://tools.ietf.org/html/rfc7919 ([Google翻訳](https://rfcs.web.fc2.com/rfc7919.html))

### IPSec

The Internet Key Exchange (IKE)
https://tools.ietf.org/html/rfc2409 ([Google翻訳](https://rfcs.web.fc2.com/rfc2409.html))

More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)
https://tools.ietf.org/html/rfc3526 ([Google翻訳](https://rfcs.web.fc2.com/rfc3526.html))

Additional Diffie-Hellman Groups for Use with IETF Standards
https://tools.ietf.org/html/rfc5114 ([Google翻訳](https://rfcs.web.fc2.com/rfc5114.html))

### ssh

The Secure Shell (SSH) Transport Layer Protocol
https://tools.ietf.org/html/rfc4253 ([Google翻訳](https://rfcs.web.fc2.com/rfc4253.html))

Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol
https://tools.ietf.org/html/rfc4419 ([Google翻訳](https://rfcs.web.fc2.com/rfc4419.html))

More Modular Exponentiation (MODP) Diffie-Hellman (DH) Key Exchange (KEX) Groups for Secure Shell (SSH)
https://tools.ietf.org/html/rfc8268 ([Google翻訳](https://rfcs.web.fc2.com/rfc8268.html))

Increase the Secure Shell Minimum Recommended Diffie-Hellman Modulus Size to 2048 Bits
https://tools.ietf.org/html/rfc8270 ([Google翻訳](https://rfcs.web.fc2.com/rfc8270.html))

## IANA番号表

Transport Layer Security (TLS) Parameters
https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml

Internet Key Exchange (IKE) Attributes
https://www.iana.org/assignments/ipsec-registry/ipsec-registry.xhtml

Internet Key Exchange Version 2 (IKEv2) Parameters
https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml

Secure Shell (SSH) Protocol Parameters
https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml

## 不肖私

SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する
https://qiita.com/n-i-e/items/41673fd16d7bd1189a29