2005年07月12日

暗復号ストリームライブラリ

以前作成した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 << お好きなデータ;

構成

本ライブラリは、以下のファイルから構成されています。

ライブラリユーザ向けクラスが記述されたファイル

oaes_encryptstream.h
AESによる暗号化を行った後、任意のストリームに対して出力を行うストリームクラス
iaes_decryptstream.h
任意のストリームから入力を受けてAESにより復号化を行うストリームクラス
odes_encryptstream.h
DESによる暗号化を行った後、任意のストリームに対して出力を行うストリームクラス
ides_decryptstream.h
任意のストリームから入力を受けてDESにより復号化を行うストリームクラス

サンプルコード

EncryptStream.cpp
上記クラスを使用して簡単な暗復号を行うサンプルコード

上記クラスが内部で使用するクラスが記述されたファイル

base64_encodebuf.h
BASE64によるエンコード/デコード用streambufクラス
des_encryptbuf.h
「libdesのライブラリ化」で紹介したDESライブラリを用いてDESによる暗号化/復号化を行うstreambufクラス
aes_encryptbuf.h
「aesライブラリ化」で紹介したAESライブラリを用いてAESによる暗号化/復号化を行うstreambufクラス
block_encryptbuf.h
任意のブロック暗号により暗復号を行うstreambufクラス
filterbuf.h
ストリームに対して入出力を行うstreambufクラス
ifilterstream.h
任意のストリームから入力を受けて処理を行うストリームクラス
ofilterstream.h
処理を行った後、任意のストリームに出力するストリームクラス

コンパイルするために必要なもの

  • Visual Studio.NET 2003
    他の環境でも頑張ればなんとかなるかもしれません
  • 「libdesのライブラリ化」で紹介したDESライブラリ
    インクルードパスにはdes.hが存在するパスを指定し、ライブラリパスにはlibファイルが存在するパスを指定すること。
  • 「aesライブラリ化」で紹介したAESライブラリ
    インクルードパスにはaes.hが存在するパスを指定し、ライブラリパスにはlibファイルが存在するパスを指定すること。

ライブラリを使用する際の注意点

  • このライブラリに実戦経験はあまりありません。 Heimdallrのいくつかのプラグインで数バイトのパスワードを暗号化するために使われた程度です。
  • ドキュメントは無いに等しいものです。
  • 各クラスは、template <class Elem> class basic_xxxstreambuf と、まるでElemを自由に指定できるように思われますが、 Elem=char以外はまったくテストしていないのでElem=charとしておくのが無難です。

利用条件

以下の条件を守る限り、使用、改変、転載、再配布は自由に行ってよいものとします。
  • ソースコード中の著作権表記「(C) SutoSoft」を消さないこと。
  • 本ライブラリにより何らかの損害を受けても、作者であるMASATOの責任を問わないこと。

あとこの記事にコメントも頂けたら幸いです。これは必須ではないですが。

反省

一応説明は上記でお終いですが、最後に本ライブラリを開発した上での反省点を書いておきます。

実のところ、本ライブラリは、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 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?