Edited at

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

More than 1 year has passed since last update.


前提

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

第二に、楕円関数 (Elliptic Curve, EC) Diffie-Hellman ではない方の、普通のDiffie-Hellman法のことを冪剰余(べきじょうよ、Modular Exponentiation, MODP)Diffie-Hellmanと呼びます。RFC7919 (Google翻訳) では有限体 (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)のハンドシェイクを復習するで述べたとおり、こんな感じで行われます。

クライアント

サーバ

共通値(g, p)の作成

サーバ秘密鍵と公開鍵の作成


共通値(g, p)、サーバ公開鍵の送信

共通値(g, p)を基にクライアント秘密鍵、公開鍵の作成

クライアント公開鍵の送信

共有秘密値の算出

共有秘密値の算出

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

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

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

sshの場合、IANAの番号表に載っているうち、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 (Google翻訳) で、グループパラメータをRFCに書く流儀がTLSにも導入されました。IANAの番号表に載っているうち、FFDHE対応なのは256, 257, 258, 259, 260の5種類です。


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

従来elliptic_curves拡張 (RFC4492, Google翻訳) と呼ばれていたTLSの拡張が、RFC7919でsupported_groups拡張と名前が変わり、そこにDiffie-Hellmanグループパラメータを書き込むことになりました。

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


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

2015年のLogjam (Google翻訳) の指摘によると、研究機関なら768bit、国家機関なら1024bitでも破れる可能性があるとのことです。それから2年経っているので、今はもう少し多めに見積もる必要があるかもしれませんが、RFC8270 (Google翻訳) は1024bitを危険、2048bitを安全としているので、本稿もそれに倣って1024bitは危険(×)、1536bitはギリギリ安全(△)、2048bit以上は安全(〇)と見ることにします。


TLS

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

番号
名称
RFC
安全性

256
ffdhe2048
RFC7919 Appendix A.1

257
ffdhe3072
RFC7919 Appendix A.2

258
ffdhe4096
RFC7919 Appendix A.3

259
ffdhe6144
RFC7919 Appendix A.4

260
ffdhe8192
RFC7919 Appendix A.5


IPSec

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

番号
名称
RFC
安全性

1
default 768-bit MODP group
RFC2409 Section 6.1
×

2
alternate 1024-bit MODP group
RFC2409 Section 6.2
×

5
1536-bit MODP group
RFC3526 Section 2

14
2048-bit MODP group
RFC3526 Section 3

15
3072-bit MODP group
RFC3526 Section 4

16
4096-bit MODP group
RFC3526 Section 5

17
6144-bit MODP group
RFC3526 Section 6

18
8192-bit MODP group
RFC3526 Section 7

22
1024-bit MODP Group with 160-bit Prime Order Subgroup
RFC5114 Section 2.1
×

23
2048-bit MODP Group with 224-bit Prime Order Subgroup
RFC5114 Section 2.2

24
2048-bit MODP Group with 256-bit Prime Order Subgroup
RFC5114 Section 2.3


ssh

sshのdiffie-hellman-group1-sha1, diffie-hellman-group14-sha1は、IPSecのOakley Group 2と14と全く同じです。sha1の4字が気になるところですが、今のところ私の知る限り、SHA1アルゴリズムの脆弱性を理由に、この方式の利用を止める必要性まではないようです。ただし、前者 (diffie-hellman-group1-sha1) はビット数が1024でLogjamに弱いという別の脆弱性があります。また、後者 (diffie-hellman-group14-sha1) もインターネットドラフト draft-ietf-curdle-ssh-kex-sha2-10 (Google翻訳) ではMUSTからSHOULDに降格されていますので、将来的には非推奨になるかもしれません。

名称
RFC
ビット数
安全性

diffie-hellman-group1-sha1

RFC4253 Section 8.1, RFC2409 Section 6.2

1024
×

diffie-hellman-group14-sha1

RFC4253 Section 8.2, RFC3526 Section 3

2048

diffie-hellman-group14-sha256

RFC8268, RFC3526 Section 3

2048

diffie-hellman-group15-sha512

RFC8268, RFC3526 Section 4

3072

diffie-hellman-group16-sha512

RFC8268, RFC3526 Section 5

4096

diffie-hellman-group17-sha512

RFC8268, RFC3526 Section 6

6144

diffie-hellman-group18-sha512

RFC8268, RFC3526 Section 7

8192


考察

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

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

2015年のLogjam (Google翻訳) を受けて、2017年12月にRFC8270 (Google翻訳) というのが出ました。これは何かというと、sshの第一の流派であるdiffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256のビット数の下限を1024bitから2048bitに増やすというものです。では第二の流派であるdiffie-hellman-group1-sha1 (1024bit) は放っておいていいのかというと、もちろんそんなことはなくて、インターネットドラフト draft-ietf-curdle-ssh-kex-sha2-10 (Google翻訳) で、非推奨(SHOULD NOT)にすることが提案されています。

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

以上!幸運を祈る。


参考文献


RFC


TLS

Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)

https://tools.ietf.org/html/rfc4492 (Google翻訳)

Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS)

https://tools.ietf.org/html/rfc7919 (Google翻訳)


IPSec

The Internet Key Exchange (IKE)

https://tools.ietf.org/html/rfc2409 (Google翻訳)

More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)

https://tools.ietf.org/html/rfc3526 (Google翻訳)

Additional Diffie-Hellman Groups for Use with IETF Standards

https://tools.ietf.org/html/rfc5114 (Google翻訳)


ssh

The Secure Shell (SSH) Transport Layer Protocol

https://tools.ietf.org/html/rfc4253 (Google翻訳)

Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol

https://tools.ietf.org/html/rfc4419 (Google翻訳)

More Modular Exponentiation (MODP) Diffie-Hellman (DH) Key Exchange (KEX) Groups for Secure Shell (SSH)

https://tools.ietf.org/html/rfc8268 (Google翻訳)

Increase the Secure Shell Minimum Recommended Diffie-Hellman Modulus Size to 2048 Bits

https://tools.ietf.org/html/rfc8270 (Google翻訳)


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