まず、最初にデフォルトの暗号化サービスプロバイダ(CSP)をインストールする
必要があります(IE3.0以降がインストールされていればよい)。
そのほかにデフォルトのCSPとキーの組を作る必要があります。(後の章)
この章では、暗号化に必要な関数についての解説をします。
CSPの、キーコンテナのハンドルを取得します。BOOL WINAPI CryptAcquireContext( HCRYPTPROV *phProv, // out LPCTSTR pszContainer, // in LPCTSTR pszProvider, // in DWORD dwProvType, // in DWORD dwFlags // in );
phProvは、プロバイダのハンドルのアドレスです。
pszContainerは、コンテナの名前です。NULLを指定するとデフォルトの コンテナ名が使われます。
pszProviderは、プロバイダの名前です。NULLを指定するとデフォルトの プロバイダが使われます。
dwProvTypeは、プロバイダのタイプです。PROV_RSA_FULL, PROV_RSA_SIGなど を指定します。
dwFlagsは、通常は0を指定してください。
成功したらTRUE, 失敗したらFALSEを返します。
キーコンテナやCSPのハンドルを解放します。BOOL WINAPI CryptReleaseContext( HCRYPTPROV hProv, // in DWORD dwFlags // in );
hProvは、CSPのハンドルです。
dwFlagsは予約済みで0を指定してください。
ユーザーキーペアのハンドルを取得します。BOOL WINAPI CryptGetUserKey( HCRYPTPROV hProv, // in DWORD dwKeySpec, // in HCRYPTKEY *phUserKey // out );
hProvは、CSPのハンドルを指定します
dwKeySpecは、取得するキーの種類を指定します。
AT_KEYEXCHANGEは、Exchangeキーペア
AT_SIGNATUREは、署名キーペア
phUserKey取得するキーハンドルのアドレス。
キーハンドルを解放します。BOOL WINAPI CryptDestroyKey( HCRYPTKEY hKey // in );
ランダムキーを生成します。BOOL WINAPI CryptGenKey( HCRYPTPROV hProv, // in ALG_ID Algid, // in DWORD dwFlags, // in HCRYPTKEY *phKey // out );
hProvは、CSPのハンドルです。
Algidは、キーを生成するためのアルゴリズムの識別子です。
マイクロソフトのプロバイダを利用しているならCALG_RC2または、
CALG_RC4です。
dwFlagsは、キー生成のタイプの識別子です。
CRYPT_EXPORTABLEを指定するとキーはCSPからkey blobへ転送することが
できます。(通常はこれを指定する)
phKeyは、新しく生成されたキーハンドルのアドレス。
CSPからキーをエクスポートします。BOOL WINAPI CryptExportKey( HCRYPTKEY hKey, // in HCRYPTKEY hExpKey, // in DWORD dwBlobType, // in DWORD dwFlags, // in BYTE *pbData, // out DWORD *pcbDataLen // in/out );
hKeyは、エクスポートされるキーのハンドルです。
hExpKeyは、目的ユーザーが持っているキーのハンドルです。
dwBlobTypeは、エクスポートされるkey blobのタイプです。
SIMPLEBLOBはセッションキーの転送に使います。
PUBLICKEYBLOBはパブリックキーの転送に使います。
PRIVATEKEYBLOBは、パブリック、プライベートキーのペアの転送に使います。
dwFlagsは、予約されています。0を指定してください。
pbDataは、key blobを受け取るバッファへのポインタです。これをNULL にするとキーのサイズを取得できます。
pcbDataLenは、pbDataが指しているバッファのサイズ。関数が戻ってきたときはバッファに 蓄えられているサイズ。
データを暗号化します。BOOL WINAPI CryptEncrypt( HCRYPTKEY hKey, // in HCRYPTHASH hHash, // in BOOL Final, // in DWORD dwFlags, // in BYTE *pbData, // in/out DWORD *pcbData, // in/out DWORD cbBuffer // in );
hKeyは、暗号化のためのキーハンドルです。CryptGenKeyまたは、 CryptImportKeyで取得します。
hHashは、ハッシュオブジェクトのハンドルです。ハッシュを使わないときは0を指定します。
Finalは、暗号化における最後のセッションかどうかを指定します。最後のブロックであるときは TRUEを指定します。
dwFlagsは、予約済みで0を指定してください。
pbDataは、暗号化されるデータを持っているバッファです。暗号化が完了したら暗号化データが 同じバッファに蓄えられます。
pcbDataは、データの大きさへのアドレスです。この関数が呼ばれる前は呼び出し側で暗号化される データのバイト数をセットします。関数が返ってくると暗号化されたデータのサイズが含まれます。
cbBufferは、pbDataバッファのバイト数です。
これらの関数を使ってデータを暗号化します。暗号化されたデータを復号するには、あと少し関数が 必要ですが後の章で解説します。
Update 02/Apr/2000 By Y.Kumei