Delphi で暗号化するなら CAPICOM を使うと楽
Delphi に限った話でもないですが。
win32 で DES 等の暗号化をしようと思った場合,Windows に標準で付属している Crypto API を使うと,外部ライブラリ等を自力でコンパイルする必要がありません。この Crypto API の使い方はトラスト・ソフトウェア・システムさんの文書(簡単な暗号化 - 共通鍵暗号化)に詳しく書いてあります。
ですが,Wincrypt.h というの,Delphi 6(等)には標準で付属していないんですよね。FreePascal の h2pas を使って必要な部分だけコピペしてあれこれやろうとしていたんですが,この API を使うこと自体も面倒くさい。
と思って Windows SDK の文書を眺めていたら,Crypto API だけでなく,CAPICOM というものがあるそうな。C(rypto)API COM interface ……つまり Crypto API が COM オブジェクト化されてるらしいです。おお,これなら Delphi とかから使うの楽そうだ。
ということで,使ってみました。といっても CAPICOM の使い方はとっても簡単。VBScript の例ですが,Windowsユーザーのためのワンポイント・レッスン 第23回 | 日経 xTECH(クロステック) のような記事もあります。
Delphi で CAPICOM を使うには,
- 「タイプライブラリの取り込み」で「CAPICOM v2.1 Type Library」を取り込む
- 「コンポーネントラッパーの作成」はどちらでもよい。ですが,私は Delphi チックに TEncryptedData 等々使いたかったのでチェックしておきました。
- ビジュアルコンポーネントがあるわけではないので,プロジェクトのフォルダにもってきて取り込んでよい(念のため Register プロシージャを削除)
- ユニットの
initialization
節にCoInitialize(nil);
を,finalization
節にCoUninitialize();
を追加
な手順を踏めば OK。
実際使用するコードの例ですが,拙いものを下記においときます。
uses CAPICOM_TLB; var enc: TEncryptedData; tut: TUtilities; begin enc := TEncryptedData.Create(Self); try enc.Algorithm.Name := CAPICOM_ENCRYPTION_ALGORITHM_DES; enc.Algorithm.KeyLength := CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS; enc.SetSecret('secret', CAPICOM_SECRET_PASSWORD); enc.Content := MemoDecrypted.Text; tut := TUtilities.Create(Self); try MemoEncrypted.Text := tut.BinaryToHex(enc.Encrypt(CAPICOM_ENCODE_BINARY)); finally tut.Free(); end; finally enc.Free(); end; end;
Algorithm
プロパティをあれこれ操作していますが,特に設定しなくてもデフォルト設定のまま動きます。
また,デフォルトで CAPICOM.EncryptedData::Encrypt()
メソッドは Base64 なデータを返すので,サンプルの意味もこめて,CAPICOM.Utilities
オブジェクトの BinaryToHex
を使用して hex で取得しています((無論 VCL 標準の BinToHex
関数を使ってもいいんですが,サンプルとしての意味合いとして))。
Crypto API のように細かい調整はかけにくいですが,お手軽に使うのなら CAPICOM でいいんではないでしょうか。
問題は CAPICOM オブジェクトがどの Windows において標準で登録されているか,ですが,わかりません。一応 Redistributable なコンポーネントではあります。
2007/11/02 追記
標準で登録されてるかどうかについて。
んー条件がよくわからないですが,
- Windows XP SP 2: OK (開発機)
- Windows XP SP 2: NG (他の機)
- Windows Vista: OK
- Windows 2000 SP 4: OK
という結果でした。
どうも,http://www.microsoft.com/japan/technet/security/bulletin/ms07-028.mspx ことにより,Microsoft Update した機種だとインストールされるっぽい(⇒CAPICOM が突如搭載されることになった)です。
なお(少なくとも)上記のパッチを手動でインストールすると,システムフォルダではなくて Program Files のあるフォルダにインストールされます。その理由についてはこちらのブログ参照ってことで。
で,SDK Redistributable ですが,
ここからダウンロードできるのですが,表記は 2.1.0.1 になってますが,中身は 2.1.0.2 (脆弱性対策済)でした。