リモートでコンピューターにアクセスするためのプロトコルであるSSHは、コンピューターの認証を行うために公開鍵暗号を利用しています。公開鍵暗号の方式には「RSA」「DSA」「ECDSA」「EdDSA」があり、それぞれの仕組みと「SSHに適した方式」についてソフトウェア企業「Gravitational」のVirag Mody氏が解説しています。
Comparing SSH Encryption Algorithms - RSA, DSA, ECDSA, or EdDSA?
https://gravitational.com/blog/comparing-ssh-keys/ 公開鍵暗号は、暗号化と復号に別々の鍵を用いる暗号方式のこと。例えば、ボブとアリスがやり取りを行う時、アリスは秘密鍵と公開鍵を作成し、公開鍵をボブに渡しておきます。ボブはアリスの公開鍵でメッセージを暗号化してアリスに送信。暗号化済みのメッセージを受け取ったアリスは自分の秘密鍵でメッセージを復号します。公開鍵から秘密鍵を作ることはできないので、アリスの公開鍵で暗号化されたメッセージを読むことができるのは、対となる秘密鍵を持つアリスだけ。SSHはこの仕組みを利用してコンピューター間の認証を行っています。
公開鍵暗号は「RSA」「DSA」「ECDSA」「EdDSA」があり、それぞれ暗号化方式が異なります。
◆RSA
RSAは1977年に登場した歴史のある公開鍵暗号で、桁数の大きい半素数の素因数分解が非常に難しいという性質を利用しているとMody氏は説明。具体的には、桁数の大きい2つの素数「p」と「q」の積である「n」だけが与えられたとき、nをpとqに素因数分解できるのは、最初からpとqという答えを「知っていた」人以外にはあり得ないということ。pとqを秘密鍵の要素として、nを公開鍵の要素として利用することで、秘密鍵から公開鍵を導くことはできても、公開鍵からは秘密鍵を導くことはできない暗号が完成するという仕組みです。
◆DSA
DSAは離散対数問題の困難性に基づく暗号。DSAの重要なポイントは、乱数「m」を利用して、秘密鍵「k」と一緒にメッセージに署名する点であるとのこと。mは秘匿する必要があります。
◆ECDSAとEdDSA
ECDSAとEdDSAは、DSAと同じく離散対数問題の困難性を利用した暗号ですが、ECDSAとEdDSAでは楕円曲線暗号やエドワーズ曲線を用いて公開鍵のサイズを小さくしているとのこと。
Mody氏はそれぞれの暗号方式について、下記の評価軸で「SSHの公開鍵暗号に適しているかどうか」を評価しています。
・実装:技術者が扱えるライブラリが豊富かどうか
・互換性:SSHクライアントがその暗号に対応してるか
・パフォーマンス:鍵生成にどれくらい時間がかかるか
・セキュリティ:公開鍵から秘密鍵を生成可能か
RSAは長い歴史を持つため、JavaScriptやPython、Goなどの主要なプログラミング言語でライブラリが用意されています。OpenSSHにおける互換性については、ハッシュ関数にSHA-1を用いた鍵、および公開鍵の鍵長が2048bit未満の鍵が利用できませんが記事作成時点で最新のOpenSSLで生成できるデフォルトの鍵長が2048bitであることを考えると、互換性は高めと言えそう。しかし、コンピューターの計算性能向上とともにセキュリティの確保に必要な鍵長も増大しており、パフォーマンス面では評価されていません。また、二次ふるい法や数体ふるい法といった、特定の整数を素因数分解するためのアルゴリズムも存在するとのこと。
DSAは1994年に登場した暗号で、RSAと同じくライブラリは充実しているとのこと。しかし、DSAのセキュリティは完全ではありません。DSAでは乱数mを鍵生成において使い捨てで使用するナンス値として使用しますが、DSAではこのmを秘匿する必要があるため、使い捨てであるはずのナンス値が性質上は鍵と近いものになるとのこと。かつ、完全な乱数を生成することは難しく、プログラムの実装ミスで一定の法則を持った値をmとして使用してしまうこともあるため、mの解析を通して暗号を突破されてしまうこともあります。このためDSAはOpenSSH 7.0からはデフォルトで無効化されています
ECDSAはDSAよりも鍵長は小さいものの、セキュリティが向上しているわけではないとのこと。ECDSAに対し、EdDSAはナンス値を乱数生成するのではなく、衝突に対する強度を高めるためのハッシュとして生成するとのこと。EdDSAは比較的新しい暗号であるため、RSAやDSAに比べると実装や互換性の面で劣りますが、高いパフォーマンスやセキュリティを持っており、公開鍵基盤業界は徐々にEdDSAに移行しつつあるとMody氏は指摘しています。
Mody氏は最終的に、実装や互換性を重視する場合は公開鍵の鍵長が2048bitもしくは4096bitのRSAを、パフォーマンスやセキュリティを重視する場合はEdDSAを推奨。DSAやECDSAは使わないように呼びかけています。