とある処理を作っているのですが、そのために今度はハッシュの処理を追加する必要に迫られたわけですが・・・。
問題だったのはSHA384とSHA224というハッシュアルゴリズムです。
といっても、SHA384はSHA512の、SHA224はSHA256の縮退系のハッシュアルゴリズム
ちなみにSHA224は、私が確認している限りFIPS180-2にはそのアルゴリズムに関する記述がありませんでした。
新しくなったFIPS180-3にはアルゴリズムが記述してありますので調べてみたい人は新しい方で確認するといいと思います。
テストデータはFIPS180-2側にしかないのがちょっと残念だな~と思っていますが。
が、どちらにしてもSHA512とSHA256がちゃんと組まれているならほとんど調べる必要はありません。
というのも、両方ともそれぞれを最終結果を縮退して(+初期ハッシュ値が別のものになって)いるだけなので、同じルーチンをそのまま使えます。
C++のクラスで考えるなら、SHA384の処理はSHA512の処理を継承して初期化および最後のハッシュ取得の部分をちょっと書き換えるだけで実装が終わります。簡単ですね。
SHA224も同様にSHA256の処理を継承して初期化+最後のハッシュ取得を書き換えるだけで終了です。クラスでなくてもかなりの部分で処理が共通になるのでついでに組んでおくのもありだと思います。
ちなみに、なぜわざとハッシュ長が短いハッシュアルゴリズムが必要か?という理由を考察すると、
「デジタル署名処理で、あまりに長い署名(ハッシュ値)だと、公開鍵暗号のビット数を上回ることがあり、それを防ぐ必要がある」
というものではないか?と思います。それは、この状態はすでに最低ビット数が1024bit必要なRSA暗号(RSA署名)では発生しませが、これが楕円曲線暗号を使うことになるとだいたい強度的に192bitあれば足りるのにハッシュ側が256bitだと結局ハッシュ側を切り捨てるなりする必要が出てきてしまうので、それをハッシュアルゴリズム側でどうにかするために作られたのでは?と思っています。
私が何を組んでいるかたぶん何となくわかる人はわかると思われる
「楕円曲線暗号」「ハッシュアルゴリズム」とくれば・・・。ちなみに過去記事からもわかると思いますが、すでにライブラリにはAESとCamelliaが組み込まれています。
一応公開鍵暗号系では、楕円曲線暗号以外でもRSA暗号ができるように組んであったりします。ここまで暗号系処理のオンパレードも珍しいものだと思いますが・・・。