今度は国産ブロック暗号のアルゴリズムであるCamelliaを実装してみました。
実装元はRFC3713ですので、ほかのプログラムのソースコードは何一つ見ていません。
今回の実装で自分がびっくりしたのが
20kBのソースコードを書いてデバッグしてみるとバグが一つもなかった・・・
ということでした。
いつもなら例と異なる結果がどこかで出て、組み間違いを探すところなのですが、今回はそれが一つもなかったという現象が。
といっても、今回のコードは基本式はRFCからきれいにコードに変換しただけで、最適化も何にもやっていない(せいぜい、F関数のXOR処理を32bit単位でできるようにした程度)です。
どうせx86だけではなくx64でも使うコードなので、無理矢理x86に最適化する必要もないので、64bit変数を普通に使っています。あとはコンパイラの最適化次第でしょうか。
ちなみに注意点としては
- RFC内の記述はすべてBigEndianとして扱われる(128bitだけではなく256bitも)ので一部に変換処理を入れる必要があり
- 128bit変数の回転処理はごまかす(必要な部分だけの計算だけで終わらせる)かちゃんと組む(128bitを完全に回転させる)かを決めましょう
- SBoxのXOR演算は32bit単位で処理できるのでそれを使って高速化するといい(よく式を見てみましょう)
ですか。
もちろん実装しても使い道なんてほとんどないですよ。まさかゲームのアーカイブの暗号にこんなものを使うわけにも行かないでしょうし。
一応使い道はいろいろと考えています。通信系の暗号処理で使う予定です。