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 追記

標準で登録されてるかどうかについて。

んー条件がよくわからないですが,

という結果でした。

どうも,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 (脆弱性対策済)でした。