戻る


 Blowfishの実装方法(for Borland C++Builder)

意外にも、Blowfishを扱った日本語ページが少ないので、簡単な実装の仕方を公開します。作成中のアプリケーションに暗号/復号化機能を組み込みたい方は、参考にしてみてください。

1. クラスライブラリのダウンロード

おそらくBlowfishクラスライブラリを使うのが一番簡単な方法かと思います。
以下で、一式をダウンロードできます。

http://www.counterpane.com/blowfish-download.html

>>> C++ by Jim Conger

ここでは「C++のクラスライブラリ」を使うことを前提にお話します。
開発環境は、C++Builder6 Proffesional です。VB, VCは知りません(^^;

ダウンロードしたソースの中には、Blowfishアルゴリズムも含まれますので、別途それらをダウンロードする必要はありません。クラスライブラリだけでO.K.です。


2. プロジェクトへの追加、ヘッダのインクルード

プロジェクトに、「blowfish.cpp」を追加します。
あとは、必要なヘッダに、

 #include "blowfish.h"
 #include "blowfish.h2"


の二つをインクルードするだけです。
まあ、あまりにも基本的ですけど一応。


3. コード

記述はとってもシンプルです。
  1. オブジェクトを生成し
  2. 任意のパスワードをセットして初期化
  3. 暗号 もしくは復号化を行う
  4. 最後にオブジェクトを破棄
これだけです。具体的なコードにすると以下のような感じ。


CBlowFish *bf = new CBlowFish;
bf->Initialize( KeyStr, KeyStr.Length());
bf->Encode( buffer, newbuffer, BUF_SIZE);
//暗号化
//bf->Decode( buffer, newbuffer, BUF_SIZE); //復号

delete bf;


KeyStr に、パスワードを格納します。
bufferに処理したいデータをセットして、Encode/Decodeすると、暗号化および復号化されたデータが、newbufferへ入ります。あとはそれを、FileWriteかなにかで必要な場所へ書き込んでください。


4. 注意点

  1. ブロック暗号なので入力サイズ=出力サイズです。当然、ファイルサイズも同じになります(これが扱いやすい一つの利点です)。
  2. 処理単位は、Blowfishの仕様上"8バイト"単位となります。これを間違えるとうまく暗号/復号化処理できません。
  3. これもBlowfishの仕様ですが、偶数で繰り返しパスワードの場合、その単位でまとめられてしまいます。たとえば、"abcabc"→"abc"というふうに。繰り返しパスワードの場合は、プログラム側で組み替えたり、
    ex.("abcabc"→"acbabc")
    入力されたパスワードに固定のパスワードを付加するとか、
    ex("abcabc"→"abcabc_blowfish" ※これも繰り返しになる可能性有)
    などの工夫が必要でしょう。



 サンプルコード

//----------------------------------------------------------

bool __fastcall TForm1::FileEncode(AnsiString FilePath, AnsiString KeyStr)
{

// FilePath 処理するファイルパス
// KeyStr 任意のパスワード


#define BUF_SIZE 256
//8の倍数で(Blowfishの仕様)

i
nt fh;

char buffer[BUF_SIZE];
char newbuffer[BUF_SIZE];

CBlowFish *bf = new CBlowFish;

//Blowfish初期化(パスワードセット)
bf->Initialize( KeyStr, KeyStr.Length());

//ファイルオープン
if ( (fh = FileOpen(FilePath, fmOpenWrite)) == -1 )
return(false);

while ( FileRead( fh, buffer, BUF_SIZE ) != NULL){

bf->Encode( buffer, newbuffer, BUF_SIZE);
//Blowfish - Encode
//bf->Decode( buffer, newbuffer, BUF_SIZE); //Blowfish - Decode


FileSeek( fh, 1, -BUF_SIZE );
FileWrite( fh, newbuffer, BUF_SIZE);

}
//while;

delete bf;

FileClose(fh);


} //end FileEncode;
//----------------------------------------------------------



 解説

ごくごく単純なサンプルです。基本的に暗号化機能だけですので、このままではほとんど使えません(笑)。実用に耐えうるものにするには、もう少しやることがありそうです。

まずファイルが8の倍数でないサイズであると、復号できません。
もしもやるなら、暗号化したファイルにファイルサイズを含めて、復号する際に必要なサイズ分だけ抜き出す必要があります。

また、このままではパスワードがあっているかどうかは復号化してみるまで分かりません。まちがったパスワードで復号化すると、元に戻すどころか、データがさらにまちがった形で並べ替えられてしまいます(^^;

なので、復号化に成功したかどうか判定できるように、ファイルの中に何かトークンのようなものを埋め込む必要があるかもしれません。それが読めたら、復号化成功!みたいな。

ファイル名も変わりません。".txt"を暗号化しても、データ中身が暗号化されるだけですので、めちゃくちゃな中身のテキストファイルになります。

".bf"とか独自拡張子にするにしても、元の拡張子がわからなくなってしまいますので、もしそのような仕様にする場合は、元の拡張子を暗号化ファイルの中に記録・格納しておくことも必要でしょう。

その辺を実装したサンプルにしてもよかったのですが、暗号/復号化だけが分かった方がいいかなと思って、思いきりシンプルなものにしてみました。

これから肉付けしていくのは、あなた次第です。
他のサイトにあるTipsなどを参考にしていろいろやってみてください。


なお、これらのサンプルコードに関する質問には一切お答えできません。その件で質問メールをいただいても返信はしません。あらかじめご了承ください。僕がそうしたようにネットで調べるなり、プログラマが集う質問掲示板などでお聞きください。たいていはそれで解決できるはず。
ただし間違いなどのご指摘メールは大歓迎です。
他のソースへの組み込み、改変、転載は自由ですが(作者への連絡も不要です)、すべて自己責任でお願いします。


 参考文献

なかなか国内の書籍で、「暗号」を扱った参考書は少ないのですが、僕が購入して参考になったものをいくつか以下に。いずれも最近出版され、一般の書店で入手可能です。


『暗号技術大全』
ブルース・シュナイアー(Bruce Schneier) 著
山形 浩生 監訳、 ソフトバンクパブリッシング刊
7770円(税込) 2003/06/02
ISBN:4-7973-1911-9

http://www.sbpnet.jp/books/products/detail.asp?sku=4797319119
Blowfishの生みの親でもあるブルース・シュナイアー氏の書籍が、和訳され発売されています。あらゆる暗号についての情報が詰め込まれています。サンプルコードなども豊富に掲載されており(関連サイトからダウンロードできます)、非常に参考になります。暗号に関する書籍が少ない中、貴重な参考文献でしょう。ただ、ちょっと高くて分厚いですけど、暗号に興味ある方は必携。

『暗号技術入門 秘密の国のアリス
結城 浩 著、 ソフトバンクパブリッシング刊
3150円(税込)  2003/09/22
ISBN:4-7973-2297-7

http://www.sbpnet.jp/books/review/art.asp?newsid=658
非常にわかりやすく、現在の暗号技術全般をかいつまんで書かれています。ただ、具体的なソースコードもなく、けっこう『暗号技術大全』ともかぶる部分もあるのですが、読みやすいですので、一般教養、入門書として最適です。

『RSA 暗号技術の基礎からC++による実装まで』
橋本 晋之介 著、 ソフトバンクパブリッシング刊
2730円(税込)  2001/12/19
ISBN:4-7973-1702-7

http://www.sbpnet.jp/books/products/detail.asp?sku=4797317027

このサイトで紹介している「Blowfish」は秘密鍵暗号ですので直接は関係ありませんが、「RSA」という公開暗号鍵について書かれています。鍵(パスワードなど)を相手方へ渡せない場合によく使われる手法です。具体的な実装を示したソースコードやCD-ROMが付属しています。時間があれば、RSAもじっくり格闘してみたいなあ・・・。


※ちなみに、ここではソフトバンクパブリッシングの本ばかりを紹介しておりますが、回し者ではありません(笑)。なぜか良い暗号関連の書籍を拾っていくと、この出版社が多い・・・

 連絡先

このページに関するお問い合わせ、サンプルコードに間違いを見つけた等ありましたら、以下のメールアドレスまでご連絡をください。


ひばら みつひろ


※スパムメール対策のため、アドレスは画像になっています。 コピペできずご不便おかけしますが、転記願います。



戻る
Copyright© 2000-2008  M.Hibara, All rights reserved.