デジタル署名でハッシュを使う理由

公開鍵暗号の一種デジタル署名では、必ずハッシュを一緒に使うようになっていますが、その理由について、記事にするほどでもない考察をつらつら並べたもの。
42
angel (as ㌵㌤の猫) @angel_p_57

デジタル署名の中でハッシュを使う理由、あんまり名言されていない ( というより、使うのが当然すぎて誰も説明しない ) んだけど、考察するとそれなりに面白い話ではあると思う。

2021-07-04 20:33:26
angel (as ㌵㌤の猫) @angel_p_57

尤も、話としては重要ではあるものの細かいところではあり、別に触れなくても良い話ではあるんだけど。 ※なので記事でも特に書いたことはない。

2021-07-04 20:33:34
angel (as ㌵㌤の猫) @angel_p_57

さて、まず情処の試験的には「署名対象のデータのハッシュ値を秘密鍵で変換することで署名になる」というような説明が出る。

2021-07-04 20:33:49
angel (as ㌵㌤の猫) @angel_p_57

これが参考書や解説サイトだと、ご存知の通り「ハッシュ値を秘密鍵で『暗号化』する」に劣化コピーされる。解説しようとしてるのにデマ書いてどうするんだ、というのはあるけどそれはさておき。

2021-07-04 20:34:41
angel (as ㌵㌤の猫) @angel_p_57

このデマは、署名の中でもRSAの特徴しか見えてない人から生まれたと考えられる。RSAでは「ハッシュ値を秘密鍵で『復号』することで署名を生成」するから。 ※逆に検証時には「署名を公開鍵で『暗号化』」する

2021-07-04 20:35:02
angel (as ㌵㌤の猫) @angel_p_57

もちろん、一般のデジタル署名はそもそも暗号化・復号と言った処理とは無関係なので、RSAのこの性質に拘るのは後回しにした方が良い。RSAのことを掘り下げて理解するには必要かも知れないけど。

2021-07-04 20:35:21
angel (as ㌵㌤の猫) @angel_p_57

ただ、デジタル署名の中でハッシュが出てくる理由としては分かり易いところではある。つまり、暗号化機能・署名機能の両用という特異性を持つRSAにとって、「ハッシュ」というのは両機能をつなぐ架け橋の意味があるから。

2021-07-04 20:35:47
angel (as ㌵㌤の猫) @angel_p_57

歴史的に言うと、公開鍵暗号が発案されたとき、そもそも(暗号学的な)ハッシュはまだ存在してなかったので。RSA署名も発表されただけで、実用にたえるものではなかったはずなんだよね。

2021-07-04 20:36:04
angel (as ㌵㌤の猫) @angel_p_57

何故かと言うと、RSAは処理対象のデータ容量が小さい。だから暗号化と言っても、共通鍵暗号で使う共通鍵の元になるようなちょっとした秘密情報しか暗号化できないし、ハッシュ無しの署名なんか、全然実データを扱えるものではない。

2021-07-04 20:36:26
angel (as ㌵㌤の猫) @angel_p_57

それが、ハッシュによって元のデータを小さい固定容量データに圧縮した上で処理にかけることで、事実上容量の制限がなくなった。…というか、そのためにハッシュが開発されたんではないかとも思うけど。なので、RSA署名の実用化という意味でハッシュは外せない。

2021-07-04 20:36:54
angel (as ㌵㌤の猫) @angel_p_57

でもそれは、「ハッシュを秘密鍵で復号」という特性を持つRSAの話であって、一般の署名でもハッシュが欠かせない理由には結びつかないんだよね。 まあ、ノリ的に近いところはあるから、分かる人には分かる話ではあるんだけど。

2021-07-04 20:37:15
angel (as ㌵㌤の猫) @angel_p_57

で、じゃあ、「なぜハッシュを使うのか」これは、ちょっとした思考実験をすれば分かる。

2021-07-04 20:37:28
angel (as ㌵㌤の猫) @angel_p_57

仮定の話として、ハッシュを使わないけれど十分大きな容量のデータに対応できる署名技術があったとする。 それに対して、「データのハッシュ値に対する署名」というのはどのような意味を持つかを考えてみる。

2021-07-04 20:37:45
angel (as ㌵㌤の猫) @angel_p_57

ここで、署名・ハッシュの両技術の特性を振り返って把握し直しておこう。

2021-07-04 20:37:58
angel (as ㌵㌤の猫) @angel_p_57

署名というのは、(自筆署名や印鑑のように)対象のデータに対する署名者の「保証」を示すデータで、秘密鍵の持ち主しか作れない(公開鍵があれば誰でも本物と確認できる)ことでその性質を担保している。

2021-07-04 20:38:21
angel (as ㌵㌤の猫) @angel_p_57

一方でハッシュというのは、固定長の小容量データに圧縮するという特徴もあるけど、「同じハッシュ値となるデータを割り出す(衝突を発生させる)ことが困難な一方向の変換」という技術だ。

2021-07-04 20:38:40
angel (as ㌵㌤の猫) @angel_p_57

これら特性を踏まえて、「データのハッシュ値に対する署名」はどのような意味を持つか。

2021-07-04 20:38:53
angel (as ㌵㌤の猫) @angel_p_57

まず、署名は「保証」の意味があれば十分なので、元データの素性が分からなくなっても問題ない。元データから作ったハッシュを「保証」するのも、元データを保証するのと対して変わらない。

2021-07-04 20:39:17
angel (as ㌵㌤の猫) @angel_p_57

話はそれるけど、特定の人にだけは元データが復元できないと意味のない「暗号化」とはそこが大きく違う。それもあって、暗号化ばっかり考えていると、マトモに理解が広がらないので注意。

2021-07-04 20:39:41
angel (as ㌵㌤の猫) @angel_p_57

話を戻して、ただ、同じハッシュ値を容易に作れてしまうと問題がある。このことも考慮しないといけない。あるデータに対する保証が、同じハッシュ値を作れる別データの保証にすり替わってしまうからだ。

2021-07-04 20:40:02
angel (as ㌵㌤の猫) @angel_p_57

なので、ここで「同じハッシュ値となるデータを作り出すことが困難」という特性が活きてくる。この特性のため、前述の「保証のすり替わり」の懸念も問題ないと言うことになる。

2021-07-04 20:40:23
angel (as ㌵㌤の猫) @angel_p_57

ここまでの話で、ある署名技術に対して、「元データの署名」を「元データのハッシュ値の署名」で代替しても問題ないことが分かった。

2021-07-04 20:40:39
angel (as ㌵㌤の猫) @angel_p_57

では、ハッシュを使うと逆に良いことがあるだろうか?

2021-07-04 20:41:02
angel (as ㌵㌤の猫) @angel_p_57

これについては大いにメリットがある。なぜなら、取り扱うデータの範囲を極々狭く抑えることができるからだ。

2021-07-04 20:41:16
angel (as ㌵㌤の猫) @angel_p_57

このメリットは何となく分かると思う。「256バイト以下のデータだけ対処できれば良いです」と言われるのと「何MB, GBのデータを扱うか分かりません」と言われるの、前者の方が圧倒的にラクできること。

2021-07-04 20:41:34