これは、ASP(Active Server Pages) & WSH などで利用できる COM コンポーネントです



山崎 和夫 氏による ActiveX コントロール(OCX)もあるらしい

CAST-128 ブロック暗号(RFC2144)については、Cast 128 ActiveX componentに ActiveX DLL となっていますね。

DES の COM を作った。

Perl の Crypt::Blowfish のインストール・メモ

Twofish Source Code にある Jesper Soederberg 氏作成の VisualBASIC のソースコード(ActiveX DLL) をコンパイルしただけの wnCrypt.dll を同梱した。
VIsualBASIC 6.0 SP6 でコンパイルしただけ
CreateObject に渡す文字列は「wnCrypt.clsTwofish」
レジストリに登録するには wnCrypt_regsvr32.bat を実行すると、便利かもね
メソッドなどは、ソースコードを参照
こちらも参照


はじめに
Bruce Schneier氏 が考案した Blowfish と呼ばれる 448bit可変長キーのフリーの暗号アルゴリズムがあります。
本家は、ここです。

ダウンロードサイトにあるJim Congerd 氏が C++ に実装化したコード を元に COM コンポーネント化しました。


仕組み
単純です。
暗号化して、文字化けちゃうので、Base64 符号化しているだけです。
暗号化には、Jim Congerd 氏が C++ に実装化した Blowfish アルゴリズムを使っています。
BASE64 符号化は、ここを使っています。

ファイル暗号化は、ファイルサイズを記録してその後ろに暗号化したデータを書き出しています。

ファイル復号化は、ファイルサイズを先頭の数byte(unsigned long 型)から決定して、残りのデータを復号化する。後、決定したファイルサイズ分だけファイルに書き出す。


使用方法
  1. sCOMmon.dll が必要ですので、ダウンロードして、sCOMmon.dll をシステム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピーしてください。
  2. sBase64.dll が必要ですので、ダウンロードして、sBase64.dll をシステム・ディレクトリ(%SystemRoot%\System32 {Win64 → %SystemRoot%\SysWOW64})にコピーしてください。
  3. ファイルをダウンロードします。
  4. ダウンロードしたファイルを解凍しします。
    (LHA は、吉崎栄泰氏が、著作権を所有)
  5. ComBlowfish.dll を任意のディレクトリにコピー。
  6. コピーされたディレクトリで、regsvr32.exe を実行して ComBlowfish.dll をレジストリに登録。
  7. (同梱されている regsvr32.bat を ComBlowfish.dll と同一ディレクトリにコピーして実行することでも可能。
  8. 以上で、
    VBScript,JScript,VisualBASIC にて、この COM コンポーネントを利用可能。



使い方(VBScript を例にして...)
基本的には
  1. オブジェクトを生成{CreateObject()}
  2. キー文字列の設定{SetKey() メソッド}
  3. 暗号化、または復号化メソッドの実行{enCrypt() または deCrypt() メソッド}
  4. オブジェクトを解放{Nothing キーワード}

ってな感じです。

ダウンロードしたファイルを解凍すると、sample.vbs というファイルがあると思います。
WSH & VBScript でのサンプルです。


アンインストール方法
RegSvr32 コマンドの /u オプションを用いて、ComBlowfish.dll をレジストリから削除するだけです。
必要がないようでしたら、sBase64.dll,sCOMmon.dll も削除してください。

免責など
著作権は保持します。(ソースコード中の blowfish.cpp,blowfish.h,blowfish.h2 を除く)
しかし、このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについては、各自の責任において、自由にいじってくれてもいいです。

なお、ソースコードに含まれている blowfish.cpp,blowfish.h,blowfish.h2 については、Jim Congerd 氏が C++ に実装化したコード なので、その限りではありません。

Jim Congerd 氏が C++ に実装化したコード(blowfish.cpp,blowfish.h,blowfish.h2) は収録しないようにしましたので別途 DL してください。
修正についての提案や、バグレポートなどは、メールにて受け付けています。


DownLoad(sBlowFish.lzh as 117,170byte) (sBlowFish.lzh.base64)
ComBlowfish.dll is 69,632byte(ver1.0.1.6)


変更履歴



COM メソッド一覧


SetKey(文字列)
内容 暗号化/復号化を行うためのキー文字列(パスワード)をセットする
引数 キー文字列
まぁ、パスワードみたいなもんや
戻り値 なし
IsError 値
成功 0
失敗 負数 : 何がしかのエラーです


enCrypt(文字列)
内容 暗号化をしてから、Base64 エンコードを行う。
引数 暗号化したい文字列
戻り値 暗号化され BASE64 エンコードされた文字列
IsError 値
成功 0
失敗 負数 : 何がしかのエラーです
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBlowfish.Crypt.1")
Obj.SetKey("キー文字列");
ret = Obj.enCrypt("文字列")
Set Obj = Nothing


deCrypt(文字列)
内容 暗号化され BASE64 化されている文字列を、元に戻します。
引数 復号化したい BASE64 エンコードされた文字列
戻り値 復号化された文字列
IsError 値
成功 0
失敗 負数 : 何がしかのエラーです
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBlowfish.Crypt.1")
Obj.SetKey("キー文字列");
ret = Obj.deCrypt("文字列")
Set Obj = Nothing


FileEnCrypt(文字列)
内容 文字列で指定(絶対パス)したファイルを暗号化する。
出力ファイルは、指定したファイルのファイル名 + ".bf" というファイルである。
引数 暗号化したいファイル名(絶対パス指定)
戻り値 なし
IsError 値
成功 0
失敗 負数 : 何がしかのエラーです
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBlowfish.Crypt.1")
Obj.SetKey("キー文字列");
ret = Obj.FileEnCrypt("ファイル名")
Set Obj = Nothing


FileDeCrypt(文字列)
内容 文字列で指定(絶対パス)したファイルを復号化する。
出力ファイルは、指定したファイルのファイル名 + ".bf" というファイルである。
引数 復号化したいファイル名(絶対パス指定)
戻り値 なし
IsError 値
成功 0
失敗 負数 : 何がしかのエラーです
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBlowfish.Crypt.1")
Obj.SetKey("キー文字列");
ret = Obj.FileDeCrypt("ファイル名")
Set Obj = Nothing


IsError()
内容 直前のメソッドが成功したかどうか。
引数 なし
戻り値 直前のメソッドが成功したかどうか
0以上 : 成功した
負数 : 何がしかのエラーです
サンプルコード(WSH & VBScript)
Set Obj = WScript.CreateObject("ComBlowfish.Crypt.1")
Obj.SetKey("キー文字列")
ret = Obj.deBase64("文字列")
chk = Obj.IsError()
If chk = 0 Then
WScript.Echo デコードは成功しました
Else
WScript.Echo デコードは失敗しました
End If
Set Obj = Nothing



エラー一覧
sError.h を参照
0 以上 成功 - 取得したデータのサイズの場合が多い
0 成功
-1 予期しないエラーです
-2 メモリが確保できませんでした
-3 ファイルがオープンできません
(ファイル読み込みエラー)
-4 ファイル内容が読み込めませんでした
(ファイル読み込みエラー)
-5 ファイルがオープンできません
(ファイル書き込みエラー)
-6 ファイルが書き込めませんでした
(ファイル書き込みエラー)
-7 引数の指定が間違っています
-100 デコードすべき文字列が 4 の倍数ではない
(BASE64 化された文字列の長さは、4 の倍数です)
-101 BASE64 デコードでは正しくない文字列である
-200 キーがセットされていない
セットするキーが空文字はダメです
-201 引数で指定された先にデータがありませんでした
-202 BlowFish 解読時のエラーです
-300 データサイズが 0 である



ファイルの暗号化について
FileEnCrypt(),FileDeCrypt() メソッドによって、ファイルの暗号/復号化が可能。
暗号化されたファイルの書式は以下である。
数byte 暗号前のデータ・サイズ
unsigned long 型のサイズ(WIN32 の場合 4byte)
- 暗号化されたデータ


出力ファイルに付加される拡張子は、ソースコード中の Crypt.h 内の文字配列 extension に格納してある。

仕様として、出力ファイルを新規作成するために、既に存在してはいけない。


セキュリティについて
まず、暗号化/復号化するキー文字列(SetKey() メソッドで設定する文字列)は、COM 内の PasswordB という _bstr_t クラス型として確保している。
ちなみに、その変数内では特に暗号化などの処理をしていない。(つまり、クリアテキストという事)
なので、メモリダンプなどを行う事で、キー文字列が流出する危険性がある。

(ASP などで)利用後は、直ちに、
Set オブジェクト = Nothing
として解放した方が、よりセキュアになるでしょう。


セキュリティについて
ASP の場合
ASP の場合でのセキュアにする一つの例として、

  1. キー文字列をレジストリに格納(ここでは、HKLM\Software\Web\Password とする)
  2. そのレジストリには監査設定をしておく
  3. アクセス権の設定もしておこう
  4. Global.asa の Application_OnStart() 関数からのみアクセスし、Application 変数に格納する
  5. 各 ASP ファイル(拡張子 .asp)からは、その Application 変数から読み出す



レジストリエディタ(regedt32.exe)を開いて、


アクセス権を設定しておく。匿名 Web なら匿名権限(デフォルトでは、IUSER_コンピュータ名)の読み取りを設定しておくだけでいい。


監査も設定しておく。全部チェックして問題はないはず....多分


監査を有効にするには、ユーザマネージャの...


監査を有効にして、「ファイルとオブジェクトへのアクセス」を有効にする必要がある


するとイベントログにアクセス記録が残る


思想としては、
  1. IIS に対してメモリダンプされるようなら、キー文字列の機密性を保持することはできないので、メモリダンプされない。と仮定する。
  2. その代わり、IIS をセキュアにする。(セキュアな IIS の情報は、port139 などを参考にするといいと思います)
  3. ASP の場合、ソースコード流出バグが各種あるので、ASP ファイルには直接キー文字列を書き込まない。
  4. レジストリからは、Global.asa からの一度の呼び出しのみとする。
  5. Global.asa の流出によって、キー文字列のレジストリパスは流出するかもしれない。(...キー文字列そのものよりいいでしょう。という後ろ向きのような言い訳...)
  6. だからこそ、レジストリの監査が必要。
  7. ついでに、レジストリにアクセス権も設定しておく事でセキュアか...(でも、system 権限では...)
  8. IIS の再起動後(global.asa の Application_OnStart 関数が呼ばれる状況)以外にレジストリにアクセスがあった場合、キー文字列が流出した可能性がある。
  9. Application_OnStart 関数は、最初の訪問者がアクセスした時であり、IIS 起動時でない事に注意しましょう。


という感じです。

Application_OnStart 関数のソースコードとしては、
(WSH のオブジェクトを利用してレジストリにアクセス...が一番簡単かな)
Application("KeyValue") 変数に HKLM\Software\Web\Password からキー文字列を取得する。
Sub Application_OnStart
Dim WSHObj
Set WSHObj = Server.CreateObject("Wscript.Shell")
Application("KeyValue") = WSHObj.RegRead("HKLM\Software\Web\Password")
Set WSHObj = Nothing
End Sub


これで、ちょっとだけは、キー文字列の保護対策になっていると思います。
(セキュリティとは、過信しないこと...)



ソースコードの利用







Twofish
解凍後の Towfish ディレクトリ下のファイルの説明
wnCrypt.dll


wnCryptWrapper.dll









その他



その他に、株式会社 フォーカスシステムズ のカオス理論に基づいた暗号エンジン「C4S」の COM ラッパー「ComC4S」もあるよ。

PGP の COM ラッパーもあるよ。
PGP COM ラッパー「NSDPGP.DLL」試用レポート


mail to active@window.goukaku.com