以前作成したC++の暗復号ストリームライブラリを公開します。
以下、このライブラリの概要と、構成、コンパイルするために必要なものと、注意点について説明します。
本ライブラリは、「libdesのライブラリ化」で紹介したDESライブラリや、 「aesライブラリ化」で紹介したAESライブラリを用いて暗号化及び復号化を行うことができるC++のストリームクラスを提供します。
本ライブラリにより、以下のようなコードで暗号化が実現できます。
unsigned char Key[16] = {16バイトの適当なデータ}; unsigned char Iv[16] = {16バイトの適当なデータ}; oaes_encryptstream stmEncrypt(&std::cout, false, block_encryptbuf::cbc_mode | block_encryptbuf::iv_mode | block_encryptbuf::cts_mode, Key, Iv); stmEncrypt << お好きなデータ;
本ライブラリは、以下のファイルから構成されています。
ライブラリユーザ向けクラスが記述されたファイル
サンプルコード
上記クラスが内部で使用するクラスが記述されたファイル
あとこの記事にコメントも頂けたら幸いです。これは必須ではないですが。
一応説明は上記でお終いですが、最後に本ライブラリを開発した上での反省点を書いておきます。
実のところ、本ライブラリは、2点、大きな設計ミスがあったと思います。
1点目は、各クラスに多くの継承関係を持たせてしまったことです。
例えば、basic_des_encryptbufクラスは、basic_block_encryptbufクラスから派生し、
basic_block_encryptbufクラスは、basic_filterbufクラスから派生し、
basic_filterbufクラスは、std::basic_streambufクラスから派生しています。
こうして継承で繋げるのではなく、templateにより繋げるべきでした。
そうしていれば、拡張性、パフォーマンスにより優れたものになったと思います。(複雑にもなりますが)
こういったクラス群をtemplateで繋げて拡張性やパフォーマンスを確保できるのは
C++の大きな利点です。生かさないと損ですね。
2点目は、出力先/入力先をストリームにしてしまったことです。 出力先/入力先はiteratorにするべきでした。 ストリームよりもiteratorの方が汎用的ですね。反省です。
このライブラリは、Javaのjava.ioパッケージを真似て設計したのですが、
それがあまり良くなかったのではないかと思います。
C++を使うんですからC++らしく設計するべきでした。
そのうち、時間が取れたらこれらの欠点を取り除いたライブラリを
作ってみようと思います。
しかし、設計ミスといっても、暗号化機能や復号化機能そのものに問題があるわけではありません。 様々な拡張を施そうと考えたり、パフォーマンスを追及しようとしたりしなければ、 このライブラリは立派に活躍できると思います。適当にご活用下さい。
投稿者 MASATO : 2005年07月12日 23:30 | トラックバック