📖

『SSL/TLS実践入門』の気になったところ

2024/05/28に公開

初めに

SSL/TLS実践入門』で間違いや誤植と思われる箇所をいくつか見つけたので列挙しておきます。
なお、そのうち本家で正誤表が出ると思いますが、自分の備忘録のために作りました(Xで発言したのは文字数制限もあったし)。
もちろん、私自身の解釈が間違っていることもあると思いますので何かあればご指摘お願いします。

間違いと思われる部分

  • p.115 3行目 : 「d は鍵生成時に pq から計算することができます。」
    • 当然公開鍵 e も必要ですね。
  • p.120 3行目 : 「点の集合 \Set{G, 2G, 3G, \dots, O} は位数 n の有限体である」
    • この集合は加減算しかできないので有限群ですね。加法群、(加法)巡回群でもよいと思います。
    • 他にも同様に「巡回群」とすべき所が「有限体」になってるのがちらほらありました。列挙してみます。
    • p.128下からL7 「G を元とした有限体」
      • その次の文「有限体から鍵ペア、秘密鍵 d_A、公開鍵 d_A G を決めておく」も微妙に変かと。
        「有限体から秘密鍵 d_A を選び、公開鍵 d_A G を計算する」でしょうか。
    • p.130下からL6 「この曲線上に有限体の演算を定義する」
    • p.132のL8 「B は位数 l の有限体」
    • p.151の「曲線とパラメータの関係」の段落の2行目「位数 n の有限体」
  • p.107 : 「有限体は…四則演算が排他的論理和(XOR)やビットシフトで実行できる」
    • それは標数 p=2 か、その拡大体の話だと思います。コラム注の例にもでてる p>2 以上の素数については多倍長演算の実装が必要で、それはなかなか大変です(cf. 多倍長整数の実装1(C/C++))。
  • p.116一番下 「(P-2) より小さい値」
    • 間違いとはいえませんが普通は Q より小さい値から選びます。Q より大きいと Q で割った余りと同じになってしまいます。
    • 同様にp.117の表2.9の「Private-value」の値も「0 < priv_key < p-1」ではなく「0 < priv_key < q」でしょう。
    • ちなみに pq はよく間違えますね。『暗号技術のすべて』でも同様の間違いがありました。
  • p.117 表2.9の「巨大な素数 P」の範囲が512~1024ビットというのは小さ過ぎると思います.
    脚注に挙げられているRFC 7919では2048ビット以上の素数が提示されてますね。

楕円曲線の鍵長と演算コスト

  • p.120 「ECDHE」節の4行目ぐらい : 「楕円曲線暗号を使ったアルゴリズムは鍵長の増加に対して処理時間の増え方が線形」
    • 線形よりももっと増えます。たとえば256ビットと384ビットでは後者は1.5倍よりずっと重たいです。

以下、もう少し詳しく説明しましょう。
楕円曲線暗号で使われる有限体は大体256ビットから512ビットぐらいです。ビット長を l とします。
その有限体の加減算は概ね l に比例します。ただ乗算はそれよりも重たいです。l \approx 512 ぐらいまでは小学校で習う筆算の方式が一番速いです(もっと長くなるとKaratsuba法などいろいろあるのですが)。
この場合、乗算回数は l^2 に比例します(ここで単位はCPUが持つ乗算命令の呼び出し回数を1とする)。楕円曲線の点の群演算(addやdbl)は乗算回数のコストが大部分なので、それは l^2 となります(有限体の実装4(Montgomery乗算の利用))。
標準的な楕円曲線暗号で一番コストが高いのは点のスカラー倍算です。これはaddやdblの回数が l に比例します(楕円曲線暗号のための数学2(バイナリ法によるスカラー倍算))。
したがってCPUの乗算命令の呼び出し回数で数えると O(l^3) となります。更にメモリアクセスが増えたりもします。
というわけで処理時間は線形よりもずっと大きく増えるのです。

誤植と思われる部分

  • p.114 下から3行目右の n のフォントが数式フォントでない。
  • p.137 : 「一つ」
    • 他では「1つ」の表記揺れ
GitHubで編集を提案

Discussion