前回は,オブジェクト指向の中心概念であるクラスを紹介しました。クラスを使用すれば,自分たちが現在考えている内容を,効率的かつ分かりやすく表現できます。今回は,データのセキュリティを確保する際に重要な意味を持っている暗号化機能とクラスの関係を取り上げます。暗号化という用語を見ただけで気が重くなってしまう人も結構いると思いますが,Microsoftの担当開発チームは暗号化技術をクラス化して提供しています。暗号化クラスの定義が分かりやすければ,私たちWindowsユーザーは「難しい」と考えられている暗号化技術を簡単に使えるはずです。それでは早速,提供される暗号化クラスがどのようなものであるのか調べてみましょう。

暗号化クラスとは何か?

図1●暗号化クラスのインタフェース
 私たちはほぼ毎日データを操作しています。データ操作の過程では,おそらく,直接あるいは間接的に,一部のデータを暗号化していると思います。そして時には「このデータだけはプロジェクトに関係のない人には見られたくない」と思うこともあるはずです。さて「データを暗号化する」とは具体的にどういうことだと思いますか。この質問は一見単純そうですが,返答に窮する人の数は結構多いのではないでしょうか。理由は簡単です。「暗号化技術は難しい」からです。それではここで,図1[拡大表示]の画面情報を見ていただきましょう。

 プログラミング学習を始めたばかりの人や,オブジェクト指向プログラミングをこれから本格的に学習しようとしている人にとっては,おそらく,この画面情報は相当難度の高いものでしょう。ここでは,筆者が追加した3つの赤い文字列だけに目を通してください。

 最初の文字列は,EncryptedDataという名前の暗号化クラスが定義されていることを示しています。第2文字列は,暗号化クラスが公開するインタフェース名(この場合,IEncryptedData)を示しています。そして,最後の文字列は,暗号化クラスのインタフェースIEncryptedDataの詳しい内容を示しています。プログラミング初心者の方にはちょっとショックかもしれませんが,オブジェクト指向プログラミングに精通している開発者は,このインタフェースIEncryptedData情報を見るだけで,暗号化クラスEncryptedDataを利用できてしまうものなのです。

 暗号化クラスEncryptedDataは,そもそも「データの暗号化」の意味を具体的に説明しているクラスです。画面内の「暗号化クラスのインタフェース詳細」部は,「データの暗号化」の意味を次のように説明しています。

  • 暗号化処理には暗号化されるデータが必要である(Contentメソッド)
  • データを暗号化するには秘密のデータが必要である(SetSecretメソッド)
  • 実際の暗号化の技術詳細は隠ぺされている(Algorithmメソッド)
  • 暗号化処理は英語のメソッド名が読めれば簡単に開始できる(Encryptメソッド)

 プログラミングに慣れていない方は現時点では「難しい」と感じていると思いますが,辛抱強く学習を継続していけば,インタフェース情報を必ず解釈できるようになります。筆者はインタフェース情報を解釈し,具体的なサンプル・プログラムを作成してみました。では,そのプログラムを紹介いたします。

今回のサンプル・プログラム

 作成したサンプル・プログラムはNo23_1.vbsという名称を持ち,次のようなソースコードで構成されています。

Dim myOriginalData,myEncryptedData
Dim oAngo

myOriginalData = "Takashi Toyota"
 
Set oAngo = CreateObject("CAPICOM.EncryptedData")

MsgBox myOriginalData,0,"Before Encrypted!"

oAngo.Content = myOriginalData
oAngo.SetSecret "Toyota"
myEncryptedData = oAngo.Encrypt
MsgBox myEncryptedData,0,"After Encrypted!"

Set oAngo = Nothing

図2●サンプル・プログラムの実行結果(暗号化前)
図3●サンプル・プログラムの実行結果(暗号化後)
 このNo23_1.vbsは,「Takashi Toyota」 という文字列を受け取り,「Toyota」という秘密のデータ(パスワード)を使って暗号化処理を行っています。暗号処理にはいろいろなアルゴリズム(方法)があるのですが,このコードから分かるように,アルゴリズムの詳細は私たちの目からは隠ぺいされています。使用されているアルゴリズムの調べ方や使用するアルゴリズムの設定方法は説明しませんが,いずれも,少し学習すれば,誰でも習得できるほど単純化されています。参考のために,実行結果を紹介しておきます(図2図3[拡大表示])。

 2つの画面を比較してみれば分かるように,文字列「Takashi Toyota」は見事に暗号化されています。これまでの説明と実行結果から,暗号化クラスの役割と便利さをなんとなくお分かりいただけたと思います。それでは次に,暗号化クラスEncryptedDataを使用するための技術的な背景を少し説明しておきます。

暗号化クラスの技術的な背景

 サンプル・プログラムNo23_1.vbsでは次のようなコードが記述されています。

Set oAngo = CreateObject("CAPICOM.EncryptedData")

 CAPICOMとは,Crypt API COMを意味し,ネイティブ暗号化API(Application Programming Interface)をCOMインタフェース化し,使いやすさを向上させたテクノロジです。COMインタフェース実体は,CAPICOM.DLLに実装されています。Windowsプログラミングに慣れている方はこのコードを見ただけで,使用されている技術的な背景を理解できると思います。このコード内のCreateObject命令は,CAPICOM.EncryptedDataという引数を受け取っていますが,この引数はProgID(プログラム内で使用できる一意のID)と呼ばれています。ProgIDはWindowsシステムレジストリに登録されていなければなりません。

 この登録処理は私たちWindowsユーザーが行わなければなりません。具体的な登録処理については,こちらからダウンロードできる情報をご覧ください。ダウンロードできる自己解凍バイナリ・コードには,ReadMe.txtが含まれています。そのファイルに一通り目を通し,指示に従って登録操作を実行してください。

 なお,ダウンロードしたバイナリファイルを解凍すると,多数のサンプル・プログラムも利用できるようになります。筆者はそれらのサンプル・プログラムに目を通しましたが,大変面白く,また,高い教育効果の期待できるサンプルばかりです。HTML,C#,CPP,VB/VBS,ASPなどの各種の技術サンプルが含まれています。目的に応じたサンプルコードを参考にするとよいでしょう。

 最後にCreateObject命令が受け取っている引数CAPICOM.EncryptedDataについて一言追加しておきます。すでに触れたように,この引数はProgIDと呼ばれるものですが,筆者は.NETへの対応を考慮し,次のように考えてしまうと便利ではないか思います。

引数CAPICOM.EncryptedDataは,名前空間とクラスを表現している

 名前空間とクラスという考え方はC#の基になっているC++から拝借された概念であることもあり,技術的な汎用性があると考えてよいでしょう。このため,名前空間とクラスの2つの概念を知ってしまえば,.NET世界へそれほどの抵抗もなく入っていけると思います。名前空間とクラスをより実践的に学びたい方は,すでに紹介した自己解凍コードに含まれているC#サンプルを多少時間をかけて研究してみるとよいでしょう。筆者が今説明した名前空間とクラスの関係がはっきり分かります。

今回のまとめ

  • 暗号化クラスは暗号化技術の詳細を隠ぺいしてくれる
  • 暗号化クラスのインタフェースは比較的分かりやすい
  • CAPICOMを学ぶと名前空間とクラスの関係が分かる

 今回は以上で終了です。次回またお会いいたしましょう。ごきげんよう!