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




はじめに
PGP という暗号化ソフトウェア/インフラストラクチャがありますが、それを簡単に使うためのラッパー DLL/COM コンポーネントです。

stPGP.dll が、MS-VC++ で利用できる DLL で sComPGP.dll が COM となっています。
sComPGP.dll は COM なので、VisualBASIC や COM 対応のスクリプト言語(VBScript や JScript)で利用できます。

PGP SDK を用いて、PGP にアクセスしています。
用いている PGP SDK は、PGP 6.5.1 用 PGP SDK version 1.7.1 for 32bit Windows
なので、PGP 6.5.x なら動作するでしょう。

私の PGP についてのメモは、ここかな
盗聴法、反対!...PGP を使おうのページ


この機能を用いて、IP Messenger に PGP 暗号化機能を入れたクリップボード・エディター「ClipRes6」はここ

私の PGP メモはここ


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



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


免責など
著作権はとりあえず保持します。
このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。
ソースコードについても、各自の責任において、
自由にいじってくれてもいいです。

DownLoad(stPGP.lzh as 276,035byte) (stPGP.lzh.base64)
sComPGP.dll is 61,440byte(ver1.0.1.2)
stPGP.dll is 65,536byte(ver1.0.1.2)


変更履歴



更新予定
とりあえずの「ClipRes」で最低限必要な機能だけを盛り込んだので、徐々にサポートするメソッドを増やしていく予定です。
乱数とか、ハッシュ関数とか、rawレベルの API もあるけど....
もう、いいかな....


COM メソッド一覧


CreateObject に渡す文字列は「sComPGP.Encrypt」です。

PasswordCheck()
内容 秘密鍵のパスワードを確認する
引数 第一引数 : 秘密鍵を特定するメールアドレス(文字列)
第二引数 : パスワード(文字列)
戻り値 0: 正しい
1: 間違っている
IsError 値
成功 0
失敗 負数


ConventionalEncrypt()
内容 文字列を共通鍵で暗号化/復号化する
引数 第一引数 : 暗号化/復号化したい文字列
第二引数 : パスワード(文字列)
第三引数 : モード (0:暗号化,1:復号化)
第四引数 : アルゴリズムの番号
アルゴリズム番号 1: IDEA
2: 3DES
3: CAST5
戻り値 暗号化/復号化された文字列
IsError 値
成功 0
失敗 負数


EncryptNoUI()
内容 メールアドレスで指定した鍵を元に暗号化/署名を行う
引数 第一引数 : 暗号化/署名したい文字列
第二引数 : 暗号化する公開鍵を特定するメールアドレス(CSV形式)(文字列)
第三引数 : 署名する秘密鍵を特定するメールアドレス(文字列)
第四引数 : 署名する秘密鍵のパスワード(文字列)
戻り値 暗号化/署名された文字列
IsError 値
成功 0
失敗 負数


DecryptNoUI()
内容 メールアドレスで指定した鍵を元に復号化/署名確認を行う
引数 第一引数 : 復号化/署名確認したい文字列
第二引数 : 復号する秘密鍵を特定するメールアドレス(文字列)
第三引数 : 復号する秘密鍵のパスワード(文字列)
戻り値 復号化された文字列
IsError 値
成功 0
失敗 負数


SignUI(文字列)
内容 ユーザに署名する秘密鍵を指定させるダイアログを表示して、文字列の入力データに署名を行なう。

引数 文字列 : 署名したい文字列
戻り値 署名
文字列自体は戻らないので、適切に先頭に文字列を付加すればいい
IsError 値
成功 0
失敗 負数


EncryptUI(文字列,モード)
内容 ユーザに暗号化する公開鍵と署名する秘密鍵を指定させるダイアログを表示して、文字列の入力データを暗号化/署名を行なう。

引数 文字列 : 暗号化したい文字列
モード : 0 が署名処理も行なう
1 が署名処理を行なわない
戻り値 暗号化/暗号化&署名された文字列
IsError 値
成功 0
失敗 負数


EncryptUI2(文字列,モード,初期選択状態にしたい鍵のメールアドレス[CSV])
内容 ユーザに暗号化する公開鍵と署名する秘密鍵を指定させるダイアログを表示して、文字列の入力データを暗号化/署名を行なう。

引数 文字列 : 暗号化したい文字列
モード : 0 が署名処理も行なう
1 が署名処理を行なわない
メールアドレス(CSV) : 初期状態で選択状態にしたい鍵のメールアドレス
戻り値 暗号化/暗号化&署名された文字列
IsError 値
成功 0
失敗 負数


DecryptUI(文字列)
内容 ユーザに復号化する秘密鍵を指定させるダイアログを表示して、文字列の入力データを復号化化/署名チェックを行なう。

引数 文字列 : 復号化したい文字列
戻り値 復号化された文字列
IsError 値
成功 0
失敗 負数


IsSign()
内容 直前に実行した DecyptUI() 関数の署名チェックの結果を返す
引数 なし
戻り値 0 : 署名チェックエラー
1 : 署名がなかった
2 : 正しい署名でした
3 : 署名が正しくありません

詳細は、stPGP.h を参照
IsError 値
変化なし


GetVerifyResultString()
内容 直前に実行した DecyptUI() 関数の署名チェックの結果を文章(文字列データ)として返す
引数 なし
戻り値 署名の結果を文字列で返す 詳細は、stPGP.h を参照
IsError 値
変化なし....のはず


RefreshBaseKetSet()
内容 鍵の集合体を保存場所から再読み込みする
引数 なし
戻り値 なし
IsError 値
変化なし....のはず


IsError()
内容 直前のメソッドが成功したかどうか。
引数 なし
戻り値 直前のメソッドが成功したかどうか
下記のエラー一覧を参照



DLL stPGP.dll について


この DLL を利用してプログラムをするには添付されている、 を用意してあるので、それを使ってください。

使い方は、MS-VC++ のプロジェクトのあるディレクトリにこの二つのファイルをコピーして、
メニュー「プロジェクト」-「プロジェクトの追加」-「ファイル」よりプロジェクトに追加すればいい。
後は、使いたいソースに
#include "stPGP.h"
とすれば、CStPGP クラスが使用できる。


PGP SDK のヘッダ/ライブラリ・ファイルについて


PGP SDK に含まれている
pgpBase.h pgpConfig.h pgpEncode.h pgpErrors.h
pgpGroups.h pgpHash.h pgpKeys.h pgpMemoryMgr.h
pgpOptionList.h pgpPFLConfig.h pgpPFLErrors.h pgpPubTypes.h
pgpTLS.h pgpUserInterface.h pgpUtilities.h PGP_SDK.lib
PGPsdkUI.lib - - -
は含まれていません。
別途、PGP SDK をダウンロードして入手してください。


DLL stPGP.dll の公開メソッドについて


公開されているクラスは一つ。公開されているメソッドは以下の通り
メソッド一覧
signed long RefreshBaseKeySet(void)
ベースとなる様々な鍵の集合を作り保持する
戻り値
0 : 成功
負数 : 何がしかのエラー
signed long EncryptUI(unsigned char *,unsigned long,unsigned char **,bool)
signed long EncryptUI2(unsigned char *,unsigned long,unsigned char **,bool,true)
のことです
signed long EncryptUI2(unsigned char *,unsigned long,unsigned char **,bool,bool)
第一引数の指定するポインタから、第二引数分のデータを取得して、暗号化/暗号化&署名/署名する
結果は、第三引数に適切なサイズを取得して格納される。
第四引数は、署名処理もする場合は、true, そうでない場合は、false
第五引数は、暗号化処理もする場合は、true, そうでない場合は、false

暗号化/署名する鍵は、ユーザにダイアログを表示させて選択させる。

入力データ(第一引数)がテキストの場合は、第二引数に「0」を指定する事。
そうすると、出力結果もテキスト形式にして返す
戻り値
0 以上 : 処理した結果のサイズ(第三引数のサイズ)
負数 : 何がしかのエラー
signed long EncryptUI3(unsigned char *,unsigned long,unsigned char **,bool,bool,unsigned char*,unsigned long)
第一引数の指定するポインタから、第二引数分のデータを取得して、暗号化/暗号化&署名/署名する
結果は、第三引数に適切なサイズを取得して格納される。
第四引数は、署名処理もする場合は、true, そうでない場合は、false
第五引数は、暗号化処理もする場合は、true, そうでない場合は、false
第六引数は、ユーザダイアログ表示の初期状態で選択状態にしたい鍵のメールアドレス(CSV形式)
第七引数は、第六引数の Byte サイズ(0 の場合は、関数内部で第六引数に対して strlen() して取得する)

暗号化/署名する鍵は、ユーザにダイアログを表示させて選択させる。

入力データ(第一引数)がテキストの場合は、第二引数に「0」を指定する事。
そうすると、出力結果もテキスト形式にして返す
戻り値
0 以上 : 処理した結果のサイズ(第三引数のサイズ)
負数 : 何がしかのエラー
signed long Encrypt(unsigned char *,unsigned long,unsigned char **,bool,PGPKeySetRef,PGPKeyRef,unsigned char *)
signed long Encrypt2(unsigned char *,unsigned long,unsigned char **,bool,true,PGPKeySetRef,PGPKeyRef,unsigned char *,0,false)
の事です
signed long Encrypt2(unsigned char *,unsigned long,unsigned char **,bool,bool,PGPKeySetRef,PGPKeyRef,unsigned char *,unsigned long,bool)
第一引数の指定するポインタから、第二引数分のデータを取得して、暗号化/暗号化&署名/署名する
結果は、第三引数に適切なサイズを取得して格納される。
第四引数は、署名処理もする場合は、true, そうでない場合は、false
第五引数は、暗号化処理もする場合は、true, そうでない場合は、false

暗号化に用いる公開鍵は、第六引数に与えられる。
署名に用いる秘密鍵は、第七引数に与えられ、そのパスフレーズは、第八引数に与えられる。
パスフレーズの長さは、第九引数に指定する。「0」を指定した場合、パスワードを文字列として扱い strlen() で内部的に長さを計算します。

第十引数は、入力データがテキストで署名のみの場合、データと署名を分離するかどうか

入力データ(第一引数)がテキストの場合は、第二引数に「0」を指定する事。
そうすると、出力結果もテキスト形式にして返す
戻り値
0 以上 : 処理した結果のサイズ(第三引数のサイズ)
負数 : 何がしかのエラー
signed long DecryptUI(unsigned char *,unsigned long,unsigned char **,bool,int *)
第一引数の指定するポインタから、第二引数分のデータを取得して、復号化/署名チェックする
結果は、第三引数に適切なサイズを取得して格納される。
第四引数は、署名チェックの結果を取得したい場合は true をセットして、受け取る変数(int 型)のポインタを第五引数に指定する
そうでない場合は、第四引数に「false」、第六引数に「NULL」をセットする
復号化する鍵は、ユーザにダイアログを表示させて選択させる。

入力データ(第一引数)がテキストの場合は、第二引数に「0」を指定する事。
そうすると、出力結果もテキスト形式にして返す
戻り値
0 以上 : 処理した結果のサイズ(第三引数のサイズ)
負数 : 何がしかのエラー


第六引数の値
0 : 署名チェックエラー
1 : 署名がなかった
2 : 正しい署名でした
3 : 署名が正しくありません

詳細は、stPGP.h を参照
signed long Decrypt(unsigned char *,unsigned long,unsigned char **,PGPKeyRef,unsigned char *,bool,int *)
signed long Decrypt2(unsigned char *,unsigned long,unsigned char **,PGPKeyRef,unsigned char *,0,bool,true,int *) の事です
signed long Decrypt2(unsigned char *,unsigned long,unsigned char **,PGPKeyRef,unsigned char *,unsigned long,bool,bool,int *)
第一引数の指定するポインタから、第二引数分のデータを取得して、復号化/署名チェックする
結果は、第三引数に適切なサイズを取得して格納される。
第七引数は、署名チェックの結果を取得したい場合は true をセットして、受け取る変数(int 型)のポインタを第九引数に指定する
そうでない場合は、第七引数に「false」、第九引数に「NULL」をセットする
第八引数は、復号化処理をしたい場合は、「true」を指定する

復号化する秘密鍵は、第四引数にセットして、第五引数にそのパスフレーズをセットする。
パスフレーズの長さは、第六引数に指定する。「0」を指定した場合、パスワードを文字列として扱い strlen() で内部的に長さを計算します。

入力データ(第一引数)がテキストの場合は、第二引数に「0」を指定する事。
そうすると、出力結果もテキスト形式にして返す
戻り値
0 以上 : 処理した結果のサイズ(第三引数のサイズ)
負数 : 何がしかのエラー


第八引数の値
0 : 署名チェックエラー
1 : 署名がなかった
2 : 正しい署名でした
3 : 署名が正しくありません

詳細は、stPGP.h を参照
unsigned char* GetVerifyResultString(void)
直前の Decrypt2() の署名確認結果を文章(文字列データ)として取得する。

戻り値
文字列のポインタ


signed long ConventionalEncrypt(unsigned char *inStr,unsigned long inLen,unsigned char **outStr,unsigned char *passphrase,unsigned long passLen,unsigned int algID,unsigned int mode)
共通鍵方式で暗号化/復号化する。
入力データのポインタを第一引数として、その長さを第二引数(「0」に指定した場合は文字列と仮定する)
出力結果を受け取るポインタのアドレスを第三引数(ヌルに初期化しているポインタを与えてください)
パスワードのポインタが第四引数
パスワードのデータ長さが第五引数(「0」を指定すれば、strlen() で長さを調べます)
アルゴリズムIDを第六引数。
モードを第七引数に指定します。

アルゴリズムID
1 : IDEA
2 : 3DES
3 : CAST5

モード
1 : 暗号化
2 : 復号化


戻り値
成功 : 0以上(出力ポインタのデータサイズ)
失敗 : 負数


signed long EncryptNoUI(unsigned char*,unsigned long,unsigned char**,bool,bool,unsigned char*,unsigned long,bool,unsigned char*,unsigned long,unsigned char*,unsigned long)
公開鍵、秘密鍵をメールアドレスで特定して、暗号化/署名を行う

第九引数は、公開鍵を特定するメールアドレス(CSV 形式)の文字列のポインタ
第十引数は、第九引数の長さ(0の場合は、第九引数を文字列として考える)
第十一引数は、秘密鍵を特定するメールアドレスの文字列のポインタ
第十二引数は、第九引数の長さ(0の場合は、第九引数を文字列として考える)
戻り値
成功 : 0以上(出力ポインタのデータサイズ)
失敗 : 負数


signed long DecryptNoUI(unsigned char*,unsigned long,unsigned char**,unsigned char*,unsigned long,unsigned char*,unsigned long,bool,bool,int*)
公開鍵、秘密鍵をメールアドレスで特定して、暗号化/署名を行う

第四引数は、秘密鍵を特定するメールアドレスの文字列のポインタ
第五引数は、第四引数の長さ(0の場合は、第四引数を文字列として考える)
第六引数は、復号に使う秘密鍵のパスフレーズの文字列のポインタ
第七引数は、復号に使う秘密鍵のパスフレーズの文字列のポインタの長さ(0の場合は、第六引数を文字列として考える)
第八引数以降は、Decrypt() 関数と同じなので省略

戻り値
成功 : 0以上(出力ポインタのデータサイズ)
失敗 : 負数


bool PasswordCheck(unsigned char*,unsigned char*,unsigned long)
指定したパスフレーズが指定したメールアドレスで特定される秘密鍵のパスフレーズとして妥当かどうかの確認をする関数

第一引数は、秘密鍵を特定するメール・アドレスを示す文字列のポインタ
第二引数は、パスフレーズのポインタ
第三引数は、パスフレーズの長さ。0 の場合第二引数を文字列と考え、内部では strlen() 関数を使って長さを計算する
戻り値
true: 正しい
false: 間違っている





エラー一覧
sError.h を参照してくれ。


その他の PGP SDK へのリンク


その他の暗号へのリンク


mail to active@window.goukaku.com