このステップ バイ ステップ方法について説明 Microsoft Visual Basic 6. 0 で CryptoAPI を使用して文字列を暗号化するします。 また Microsoft Visual Basic .NET でまたは Microsoft Visual Basic 2005 で
CryptoServiceProvider クラスの使用によって、文字列を解読する方法についても説明します。 ここでは、Visual Basic 6. 0 での暗号化処理のコードについて説明します。 また、Visual Basic .NET または Visual Basic 2005 では、復号化プロセスのコードについても説明します。
暗号化プロセス コードと復号化プロセス コードは、次構造を持ちます。
- EncryptGroup という 1 つのプロジェクト グループで 暗号化プロセス コード の Visual Basic 6. 0 のコードを使用して暗号化コードを開発するときに構築します。 このプロジェクト グループには、次の個々 のプロジェクトが含まれています。
- CryptWrap.vbp - CryptWrap.vbp、プロジェクトでは、clsCryptoAPI.cls という名前ある Visual Basic クラス ファイル含まれています。
- Encrypt.vbp - Encrypt.vbp、プロジェクトは frmEncFiles.frm というフォームです。
- 復号化プロセスのコード または Visual Basic 2005、コードは、Visual Basic .NET を使用して復号化コードを開発するときに DecryptInVBNET という 1 つのソリューションで構造します。 このソリューションには DecryptInVBNET.vbproj という 1 つの Windows アプリケーション プロジェクトが含まれています。 このプロジェクトに 1 つの Windows が含まれていますフォーム Form1.vb という名前です。
要件
この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています:
- 暗号化
- Visual Basic 6. 0 で API を使用してください。
- Visual Basic .NET または Visual Basic 2005 で CryptoServiceProvider クラスの使用
次のとおりの推奨されるハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および必要なサービス パックです。
- Microsoft Windows Server 2003、Windows 2000、または Microsoft Windows XP
- Microsoft Visual Basic 6. 0 および Microsoft Visual Basic .NET の Microsoft Visual Basic 2005
暗号化および復号化コードします。
この資料ではコード CryptographySample.exe パッケージに含まれるについて説明します。
下記のファイルは、Microsoft Download Center からダウンロードできます:
マイクロソフトのサポート ファイルをダウンロードする方法の追加についてはをクリックして以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
119591?
(http://support.microsoft.com/kb/119591/
)
Q119591 How to Obtain Microsoft Support Files from Online Services
マイクロソフトはこのファイルのウイルスをスキャンします。 マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用しています。 ファイルは、ファイルに不正な変更を防止するセキュリティが強化されたサーバーに格納されます。
メモ ダウンロードしたサンプル コードを使用する、「
Instructions to run the code」の手順に従ってセクション。
Visual Basic 6. 0 での暗号化
このセクションでは暗号化プロセスで重要な手順を説明します。 これは、手順に使用される Visual Basic コードについても説明します。
CryptWrap DLL
CryptWrap DLL は、コードの
Code for encryption and for
decryption のセクションでダウンロードしたを含められます。 CryptWrap DLL は、API 呼び出しをラップするラッパーです。 CryptWrap DLL は、EncryptGroup プロジェクト グループ内にある CryptWrap.vbp プロジェクトには。
暗号化プロセスでは、CryptWrap DLL が必要です。 暗号化プロジェクトによって、実際の暗号化を実行する関数を呼び出す CryptWrap DLL を使用します。
CryptoWrap DLL
CryptoWrap DLL は、ActiveX DLL プロジェクト テンプレートを使用してコーディングします。 CryptoWrap DLL が、EncryptGroup プロジェクト グループ内にある clsCryptoAPI.cls ファイルにします。
次の項目が、CryptoWrap DLL のコードには含まれます。
- 変数と、CryptoWrap の DLL を使用する定数を宣言します。
- Visual Basic 6. 0 の面で Advapi32.dll ライブラリ ファイルから 暗号化 API 関数の関数およびサブルーチンの宣言。
- プロパティの関数、およびサブルーチンの宣言。
- 呼び出し元プログラムから、モジュールレベル変数、コード内に割り当てられるパスワード。
メモ このパスワードは CryptoEncrypt 関数は、文字列の暗号化に使用するキーの派生に使用されます。
CryptoWrap DLL のハッシュは SHA1 アルゴリズムを使用し、暗号化のため、RC2 アルゴリズムを使用します。
変数の宣言
ここでは、clsCryptoAPI.cls ファイルで宣言されている重要な変数について説明します。
入力文字列と文字列の出力に使用することがあります、一般的な変数、と共にいくつか他の定数は暗号化プロセスのコードで宣言されています。 これらの他の定数は、CryptWrap.vbp プロジェクト内の API 関数を呼び出す使用されます。 Descriptions of some of these other constants appear in the following sample code:
Private Const ALG_CLASS_ANY As Long = 0
Private Const ALG_TYPE_ANY As Long = 0
Private Const ALG_CLASS_HASH As Long = 32768
Private Const ALG_TYPE_BLOCK As Long = 1536
Private Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
Private Const ALG_SID_RC2 As Long = 2
Private Const ALG_SID_SHA1 As Long = 4
' Hash algorithms
Private Const CALG_SHA1 As Long = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
' Block ciphers
Private Const CALG_RC2 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_RC2
' CryptSetProvParam
Private Const PROV_RSA_FULL As Long = 1
' used when acquiring the provider
Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
' Microsoft provider data
Private Const MS_DEFAULT_PROVIDER As String = _
"Microsoft Base Cryptographic Provider v1.0"
' used to specify not to use any salt value while deriving the key
Private Const CRYPT_NO_SALT As Long = &H10 の Wincrypt.h ヘッダー ファイル コンピューターにこれらすべて他の定数の定義が含まれます。 C または C++ プロジェクト コードで直接 Wincrypt.h ヘッダー ファイルを使用できます。 ただし、
Code for encryption and for
decryption のセクションでダウンロードした Visual Basic 6. 0 プログラムでは暗号化プロセスを使用する定数宣言されているし、は、clsCryptoAPI.cls ファイルで初期化されます。 これらの定数は、コンピューター上の Wincrypt.h ファイルで宣言されている同じ </a0>) の定数、です。
Visual Basic 6. 0 の API 宣言
次に、clsCryptoAPI.cls ファイルで宣言されている重要な API 関数を示します。
- GetLastError - GetLastError 関数は最後のエラー コードの値を呼び出し側スレッドを取得します。
次のコードは、 GetLastError 関数の例: Private Declare Function GetLastError Lib "kernel32" () As Long
- CryptAcquireContext - CryptAcquireContext 関数は、指定された暗号化サービス プロバイダー (CSP) で指定されたキー コンテナーへのハンドルを取得を使用します。 phProv パラメーターは、指定したキー コンテナーへのハンドルを受け取ります。 このハンドルを使用する他の API 関数を呼び出すできます。
次のコードは、 CryptAcquireContext 関数の例: Private Declare Function CryptAcquireContext Lib "advapi32.dll" _
Alias "CryptAcquireContextA" (ByRef phProv As Long, _
ByVal pszContainer As String, ByVal pszProvider As String, _
ByVal dwProvType As Long, ByVal dwFlags As Long) As Long - CryptCreateHash - CryptCreateHash 関数を使って、データのストリームのハッシュを開始します。 CryptCreateHash 関数は、呼び出し元に CSP ハッシュ オブジェクトにハンドルを返します。 セッション キーのハッシュをでは、このハンドルを CryptHashData 関数の呼び出し後で使用することもことができます。 phHash パラメーターは、新しいハッシュ オブジェクトのハンドルを受け取ります。
次のコードは、 CryptCreateHash 関数の例: Private Declare Function CryptCreateHash Lib "advapi32.dll" _
(ByVal hProv As Long, ByVal algid As Long, _
ByVal hkey As Long, ByVal dwFlags As Long, _
ByRef phHash As Long) As Long - CryptHashData - CryptHashData 関数を指定したハッシュ オブジェクトにデータを追加します。 pbData パラメーターがデータのハッシュを含まいます。
次のコードは、 CryptHashData 関数の例: Private Declare Function CryptHashData Lib "advapi32.dll" _
(ByVal hhash As Long, ByVal pbData As String, _
ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long - CryptDestroyHash - CryptDestroyHash 関数は、 hHash パラメーターを参照する、ハッシュ オブジェクトを破棄します。
次のコードは、 CryptDestroyHash 関数の例: Private Declare Function CryptDestroyHash Lib "advapi32.dll" _
(ByVal hhash As Long) As Long - CryptReleaseContext - CryptReleaseContext 関数は、CSP をキー コンテナーのハンドルを解放に使用されます。 hProv パラメーターは、CSP のハンドルです。 hProv パラメーターの値は CryptAcquireContext API 関数を呼び出して取得します。
次のコードは、 CryptReleaseContext 関数の例: Private Declare Function CryptReleaseContext Lib "advapi32.dll" _
(ByVal hProv As Long, ByVal dwFlags As Long) As Long - CryptDeriveKey - CryptDeriveKey 関数は基本データから派生した暗号キーを生成します。 CryptDeriveKey 関数は常を使用する場合、同一の CSP、同じアルゴリズム、同じ基本データに対して、 CryptDeriveKey 関数を呼び出すたびに、同じ基本データに対して同じキー生成します。
基本データは、パスワードにできます。 パスワードをハッシュし、キーへのハンドルを取得するには、この関数を呼び出しますできます。 phKey パラメーターは、暗号化に使用されるキーへのハンドルを受け取ります。
次のコードは、 CryptDeriveKey 関数の例: Private Declare Function CryptDeriveKey Lib "advapi32.dll" _
(ByVal hProv As Long, ByVal algid As Long, _
ByVal hBaseData As Long, ByVal dwFlags As Long, _
ByRef phKey As Long) As Long - CryptDestroyKey - CryptDestroyKey 関数は hKey パラメーターを参照するハンドルを解放します。 次のコードは、 CryptDestroyKey 関数の例:
Private Declare Function CryptDestroyKey Lib "advapi32.dll" _
(ByVal hkey As Long) As Long - CryptEncrypt - CryptEncrypt 関数はデータの暗号化を使用します。 CSP モジュールを保持するキーは、データの暗号化に使用されるアルゴリズムを指定します。 hKey パラメーターには、このキーを参照します。 次のコードは、 CryptEncrypt 関数の例:
Private Declare Function CryptEncrypt Lib "advapi32.dll" _
(ByVal hkey As Long, ByVal hhash As Long, ByVal Final As Long, _
ByVal dwFlags As Long, ByVal pbData As String, _
ByRef pdwDataLen As Long, ByVal dwBufLen As Long) As Long
CopyMemory サブルーチンは、clsCryptoAPI.cls ファイルで宣言も。
CopyMemory サブルーチンは別の場所に 1 つの場所からのメモリのブロックがコピーされます。
CopyMemory サブルーチンは、次パラメーターを受け取ります。
- dest - dest パラメーターが、宛先、コンテンツにコピーされます。
- ソース - ソース パラメーターはソースからのコンテンツはコピー先です。
- バイト - バイト パラメーターはソースから先にコピーされるコンテンツのサイズです。
次のコードは、
CopyMemory サブルーチンの例:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, source As Any, ByVal bytes As Long)重要な機能
ここでは、clsCryptoAPI.cls ファイルで宣言されている一部の重要な機能について説明します。
暗号化プログラムは、文字列を暗号化する
暗号化 を呼び出します。 次のコードは
暗号化 関数の例:
Public Function Encrypt(Optional intHashType As Integer = 1, _
Optional intCipherType As Integer = 1) As Boolean
Encrypt = CryptoEncrypt(intHashType, intCipherType)
End Function この関数は 2 つの省略可能なパラメーターです。
intHashType パラメーターには、キーの派生に使用するハッシュ アルゴリズムを指定します。
intCipherType パラメーターには、暗号化プログラムで、文字列の暗号化に使用される暗号種類を指定します。
メモ 暗号の種類は、
暗号化アルゴリズム とも呼ばれます。
これらのパラメーターは省略可能であるためはその既定値に初期化がされます。 したがって、呼び出し元プログラムでこれらのパラメーターの値が得られない場合、
暗号化 関数は、既定値を使用します。
暗号化 関数は、
CryptoEncrypt 関数を呼び出します。
CryptoEncrypt 関数は、実際の暗号化を実行する CryptoWrap DLL のプライベート関数です。 次のコードは、
CryptoEncrypt 関数の例:
Private Function CryptoEncrypt(intHashType As Integer, _
intCipherType As Integer) As Boolean、
CryptoEncrypt 関数は、CryptoWrap DLL 内のメイン関数。
CryptoEncrypt 関数は、文字列を暗号化します。
暗号化プロセス
手順の次に、暗号化処理を示します。
- CryptoEncrypt 関数は、 GetProvider 関数を呼び出して暗号化処理開始されます。
メモ GetProvider 関数は、プライベート関数です。 - GetProvider 関数は、CSP のハンドルを取得するには、 CryptAcquireContext API 関数を呼び出します。
- GetProvider 関数は、ハッシュ オブジェクトのハンドルを取得するには、 CryptCreateHash API 関数を呼び出します。
- CryptHashData API 関数は、手順 3 で、 GetProvider 関数を取得するハンドルを使用してパスワード テキストをハッシュします。
- CryptoEncrypt 関数呼び出します、 CryptDeriveKey API 関数し CryptDeriveKey API 関数を使用、ハンドル 2 〜 3 の暗号化キーの派生を GetProvider 関数は、取得の手順でされたこと。
- CryptoEncrypt 関数は、ハッシュ オブジェクトを破棄するには、 CryptDestroyHash API 関数を呼び出します。
- 変数の初期化ステートメントは、暗号化された文字列が格納されるバッファーの十分な領域を割り当てます。 次の文字列は十分な領域を割り当てるたとえば:
lngEnctBuffLen=lngEncDataLength*2
- CryptoEncrypt 関数は、 CryptEncrypt API 関数を呼び出します。 CryptEncrypt API 関数の入力は、 CryptDeriveKey API 関数は、手順 5 で派生するキーと暗号化する必要のある文字列。
- CryptEncrypt API 関数は、バッファー内の入力文字列を上書きして暗号化された文字列を格納します。
- CryptoEncrypt 関数は、キーを破棄には、 CryptDestroyKey API 関数を呼び出します。
- CryptoEncrypt 関数は、ハッシュ オブジェクトを破棄するには、 CryptDestroyHash API 関数を呼び出します。
プログラムを暗号化します。
暗号化プログラムは、
Code for encryption and for
decryption のセクションでダウンロードしたコードに含まれてます。 暗号化プログラム暗号化処理のユーザー インターフェイスを作成します。 CryptWrap DLL を使用して文字列の暗号化をします。 この暗号化プログラムは、EncryptGroup に含まれる暗号化プロジェクトにプロジェクト グループ。
ユーザー インターフェイス
暗号化プログラムのユーザー インターフェイスは、次のテキスト ボックスを含まれます。
- 暗号化するファイルの完全な path\filename を入力してください。
- 暗号化されたファイルの名前と場所
メモ このテキスト ボックスは読み取り専用です。
暗号化プログラムのユーザー インターフェイスには、次のいずれかのボタンも含まれます。
暗号化するファイルの完全な path\filename を入力してください ] ボックスに、正しい情報を入力した後、暗号化された文字列が格納されるファイルのパス
名と暗号化されたファイルの場所 ボックスで表示されます。
暗号化処理を開始するには、[
暗号化 を </a0>] をクリックします。 暗号化処理が完了したら、メッセージ ボックスを暗号化処理が成功するかどうかを示すが表示されます。
暗号化プログラムを終了するには、
終了 をクリックします。
重要な機能
次の関数は、暗号化プログラムの frmEncFiles.frm ファイルで宣言されて:
Private Sub Encrypt_File()
暗号化 ] をクリックするとこの関数が呼び出されます。 この関数呼び出しは次の操作を行います。
- clsCryptoAPI クラスのオブジェクトを CryptoWrap の DLL に作成します。
- 基本的な検証のタスクをファイルの存在を確認するような実行します。
- [パスワード] フィールドおよび clsCryptoAPI クラス オブジェクトの InputData フィールドには、初期化します。
- clsCryptoAPI クラス オブジェクトの 暗号化 関数を呼び出します。
メモ clsCryptoAPI クラス オブジェクトには、 intHashType パラメーターは、SHA1 アルゴリズム値 4 に設定され、 intCipherType パラメーターは、RC2 アルゴリズム値 2 に設定されます。 - clsCryptoAPI クラス オブジェクトの OutputData フィールドには、作成します。
プログラムは、暗号化された文字列を受け取るされ、出力ファイルに格納しておく。 暗号化処理が成功するかどうかを示すメッセージ ボックスしが表示されます。
DecryptInVBNET プログラム
DecryptInVBNET プログラムは、
Code for encryption and for
decryption のセクションでダウンロードしたコードに含まれてます。 DecryptInVBNET プログラムは、復号化のユーザー インターフェイスを作成します。 また使用して、Microsoft Visual Studio .NET または Visual Studio 2005 の CSP の Microsoft 復号化プロセスにします。
ユーザー インターフェイス
DecryptInVBNET プログラムのユーザー インターフェイスは、次のテキスト ボックスを含まれます。
- 復号化するファイルの完全な path\filename を入力してください。
- 復号化されたファイルの名前と場所
メモ このテキスト ボックスは読み取り専用です。
DecryptInVBNET プログラムのユーザー インターフェイスには、次のいずれかのボタンも含まれます。
復号化するファイルの完全な path\filename を入力してください ] ボックスに正しい情報を入力した後の復号化された文字列が格納されるファイルのパス
名と復号化されたファイルの場所 ボックスで表示されます。
復号化処理を開始するには、[
暗号化解除 ] をクリックしています。 復号化処理が完了したら、メッセージ ボックスを復号化が成功したかどうかを示すが表示されます。
DecryptInVBNET プログラムを終了するには、
終了 をクリックします。
重要な機能
次の関数は、DecryptInVBNET プログラムの Form1.vb ファイルで宣言されて:
Private Sub Decrypt_File()
復号化 をクリックしたときにこの関数が呼び出されます。 この関数呼び出しは次の操作を行います。
- CspParameter クラスのオブジェクトを作成します。 このオブジェクトは、CSP の暗号化計算を実行するにはパラメーターを渡すために使用します。
- PasswordDeriveBytes クラスのオブジェクトを作成します。 このオブジェクトは、指定されたパスワードからキーを派生させるために使用します。
メモ わかりやすくするために、パスワードは、プログラムでハードコーディングです。 - PasswordDeriveBytes クラスの CryptDeriveKey メソッドを呼び出します。 このメソッドは、出力データとして、キーを示します。 キー入力のデータをに基づいてください。
このプログラムはハッシュは SHA1 アルゴリズムを使用し、暗号化のため、RC2 アルゴリズムを使用します。 また
RC2CryptoServiceProvider クラスのオブジェクトが作成されます。 このオブジェクトは、復号化プロセスで使用されます。
コードは、キーおよび
RC2CryptoServiceProvider オブジェクトの初期化ベクター フィールドにし初期化します。
RC2CryptoServiceProvider オブジェクトは、RC2 の CSP の実装にアクセスするラッパー アルゴリズム。
コードも
CreateDecryptor メソッドを呼び出します。
CreateDecryptor メソッドは対称復号化オブジェクトを現在のキーと、現在の初期化ベクターを使用して作成します。
最後に、
ICryptoTransform クラスの
TransformFinalBlock メソッドは、
暗号化された文字列 として
入力 パラメーターの値を提供して、暗号化された文字列の長さを並行復号化します。
TransformFinalBlock メソッドが完了すると、メッセージ ボックスを復号化が成功したかどうかを示すが表示されます。 解読のプロセスが成功する場合、プログラムは復号化された文字列を出力ファイルに書き込みます。
コードを実行する手順
「
Code for encryption and
for decryption をダウンロードし、プログラム ファイルをコンピューターにを C:\ フォルダーに保存方法についてしてください。
プログラムを暗号化します。
- Visual Basic 6. 0 で EncryptGroup プロジェクト グループを開きます。 これを行うには、 EncryptGroup.vbg ファイルをダブルクリックします。 EncryptGroup.vbg ファイルが、C:\CryptographySample\EncryptInVB6 にあるフォルダー。
- メニューの 実行 Visual Basic 6. 0 で、クリックして 完全コンパイル後に開始 します。 Windows フォーム Form1 という名前が表示されます。 Form1 は、暗号化プログラムのユーザー インターフェイスです。
- 暗号化するファイルの完全な path\filename を入力してください ] ボックスに、[暗号化する必要のあるファイルのパスを入力します。 サンプル ファイルの暗号化プログラムに付属するを使用して、次の入力: します
c:\CryptographySample\input.txt
- Tab キーを押します。 暗号化された文字列が格納されるファイルの名前は、 名と暗号化されたファイルの場所 ボックスで表示されます。
メモ この例では、暗号化されたファイルのパスが C:\CryptographySample\Input.enc です。 - 暗号化 ] をクリックします。 暗号化ファイルの メッセージ ボックスが表示されます。
- [ OK] をクリックします。
- アプリケーションを終了の 終了 ] クリックします。
暗号化された文字列は、C:\CryptographySample\Input.enc ファイルに表示されます。
DecryptInVBNET プログラム
- Microsoft Visual Studio .NET 2002年で DecryptInVBNET ソリューションを開きます。 この DecryptInVBNET.sln をダブルクリック ファイル。 DecryptInVBNET.sln ファイルは、C:\CryptographySample\DecryptInVBNET フォルダーにあります。
メモ Microsoft Visual Studio .NET 2003年または Microsoft Visual Studio 2005 を使用している場合] ダイアログ ボックスをプロジェクトとソリューションを Microsoft Visual Studio .NET 2003年または Microsoft Visual Studio 2005 にアップグレードする求めるが表示されます。 [はい] をクリックします。 - メニューの [デバッグ Visual Studio .NET または Visual Studio 2005 で] をクリック 開始 します。 Windows フォーム Form1 という名前が表示されます。 Form1 は、DecryptInVBNET のユーザー インターフェイスですプログラム。
- 復号化するファイルの完全な path\filename を入力してください ] ボックスに、[暗号化を解除するファイルのパスを入力します。 DecryptInVBNET プログラムに付属するサンプル ファイル使用して、次の入力: します
c:\CryptographySample\input.enc
- Tab キーを押します。 復号化された文字列が格納されるファイルの名前は、 名前と復号化されたファイルの場所 ボックスで表示されます。
メモ この例では、復号化されたファイルのパスが C:\CryptographySample\Input.dec です。 - 復号化 ] をクリックします。 DecryptInVBNET のメッセージ ボックスが表示されます。
- [ OK] をクリックします。
- アプリケーションを終了の 終了 ] クリックします。
復号化された文字列は、C:\CryptographySample\Input.dec ファイルに表示されます。