CryptDecrypt 関数 (wincrypt.h)

大事な この API は非推奨です。 新規および既存のソフトウェアでは 、Cryptography Next Generation API の 使用を開始する必要があります。Microsoft は、今後のリリースでこの API を削除する可能性があります。
 
CryptDecrypt 関数は、CryptEncrypt 関数を使用して以前に暗号化されたデータを復号化します。

Secure/多目的インターネット メール拡張機能 (S/MIME) メールの相互運用性をサポートするための重要な変更が CryptoAPI に対して行われ、エンベロープされたメッセージの処理に影響が及びます。 詳細については、 CryptMsgOpenToEncode の「解説」セクションを参照してください。

構文

BOOL CryptDecrypt(
  [in]      HCRYPTKEY  hKey,
  [in]      HCRYPTHASH hHash,
  [in]      BOOL       Final,
  [in]      DWORD      dwFlags,
  [in, out] BYTE       *pbData,
  [in, out] DWORD      *pdwDataLen
);

パラメーター

[in] hKey

暗号化解除に使用するキーのハンドル。 アプリケーションは、 CryptGenKey 関数または CryptImportKey 関数を使用して、このハンドル 取得します。

このキーは、使用する復号化アルゴリズムを指定します。

[in] hHash

ハッシュ オブジェクトへのハンドル。 データを暗号化解除して同時にハッシュする場合は、このパラメーターにハッシュ オブジェクトへのハンドルが渡されます。 ハッシュ値は、暗号化解除された プレーンテキストで更新されます。 このオプションは、署名の暗号化解除と検証を同時に行う場合に便利です。

CryptDecrypt を呼び出す前に、アプリケーションは CryptCreateHash 関数を呼び出してハッシュ オブジェクトへのハンドルを取得する必要があります。 暗号化解除が完了したら、CryptGetHashParam 関数を使用してハッシュ値を取得できます。また、CryptSignHash 関数を使用して署名することも、CryptVerifySignature 関数を使用してデジタル署名を検証するために使用することもできます。

ハッシュを実行しない場合、このパラメーターは 0 である必要があります。

[in] Final

これが復号化される系列の最後のセクションであるかどうかを示すブール値。 これが最後のブロックまたは唯一のブロックである場合、この値は TRUE です。 これが最後のブロックでない場合、この値は FALSE です。 詳細については、「解説」を参照してください。

[in] dwFlags

次のフラグ値が定義されています。

説明
CRYPT_OAEP
0x00000040
最適な非対称暗号化パディング (OAEP) (PKCS #1 バージョン 2) を使用します。 このフラグは、RSA 暗号化/暗号化解除を使用 する Microsoft 拡張暗号化プロバイダー でのみサポートされています。 このフラグを CRYPT_DECRYPT_RSA_NO_PADDING_CHECK フラグと組み合わせることはできません。
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
埋め込みを確認せずに 、BLOB で復号化を実行します。 このフラグは、RSA 暗号化/暗号化解除を使用 する Microsoft 拡張暗号化プロバイダー でのみサポートされています。 このフラグを CRYPT_OAEP フラグと組み合わせることはできません。

[in, out] pbData

復号化するデータを含むバッファーへのポインター。 暗号化解除が実行されると、プレーンテキストはこの同じバッファーに戻されます。

このバッファー内の暗号化されたバイト数は、 pdwDataLen によって指定されます。

[in, out] pdwDataLen

pbData バッファーの長さを示す DWORD 値へのポインター。 この関数を呼び出す前に、呼び出し元のアプリケーションは 、DWORD 値を復号化するバイト数に設定します。 返されると、 DWORD 値には、復号化されたプレーンテキストのバイト数が含まれます。

ブロック暗号を使用する場合、暗号化を解除するデータの最後のセクションであり、Final パラメーターが TRUE でない限り、このデータ長はブロック サイズの倍数である必要があります。

戻り値

関数が成功した場合、関数は 0 以外 (TRUE) を返します。

関数が失敗した場合は、0 (FALSE) を返します。 拡張エラー情報については、 GetLastError を呼び出します。

NTE の前のエラー コードは、使用されている特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。

説明
ERROR_INVALID_HANDLE
パラメーターの 1 つは、無効なハンドルを指定します。
ERROR_INVALID_PARAMETER
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。
NTE_BAD_ALGID
hKeyセッション キーは、この CSP がサポートしていないアルゴリズムを指定します。
NTE_BAD_DATA
暗号化を解除するデータが無効です。 たとえば、ブロック暗号が使用され、 Final フラグが FALSE の場合、 pdwDataLen で指定される値はブロック サイズの倍数である必要があります。 このエラーは、 埋め込みが 無効であることが判明した場合にも返されます。
NTE_BAD_FLAGS
dwFlags パラメーターは 0 以外です。
NTE_BAD_HASH
hHash パラメーターには、無効なハンドルが含まれています。
NTE_BAD_KEY
hKey パラメーターには、キーへの有効なハンドルが含まれていません。
NTE_BAD_LEN
出力バッファーのサイズが小さすぎて、生成されたプレーンテキストを保持できません。
NTE_BAD_UID
キーの作成時に指定された CSP コンテキストが見つかりません。
NTE_DOUBLE_ENCRYPT
アプリケーションが同じデータを 2 回復号化しようとしました。
NTE_FAIL
関数が予期しない方法で失敗しました。

解説

大量のデータを復号化する場合は、 セクションで CryptDecrypt を繰り返し呼び出すことで行うことができます。 Final パラメーターは、暗号化解除エンジンが暗号化解除プロセスを適切に完了できるように、CryptDecrypt の最後の呼び出しでのみ TRUE に設定する必要があります。 FinalTRUE の場合は、次の追加アクションが実行されます。

  • キーがブロック暗号キーの場合、データは暗号のブロック サイズの倍数に埋め込まれます。 暗号のブロック サイズを見つけるには、 CryptGetKeyParam を使用してキーのKP_BLOCKLEN値を取得します。
  • 暗号が チェーン モードで動作している場合、次の CryptDecrypt 操作により、暗号のフィードバック レジスタがキーのKP_IV値にリセットされます。
  • 暗号が ストリーム暗号の場合、次の CryptDecrypt 呼び出しによって暗号が 初期状態にリセットされます。

Final パラメーターを TRUE に設定せずに、暗号のフィードバック レジスタをキーのKP_IV値に設定する方法はありません。 必要に応じて、追加のパディング ブロックを追加したり、各ブロックのサイズを変更したりしない場合のように、 CryptDuplicateKey 関数を使用して元のキーの複製を作成し、重複するキーを CryptDecrypt 関数に渡すことで、これをシミュレートできます。 これにより、元のキーのKP_IVが重複するキーに配置されます。 元のキーを作成またはインポートすると、キーのフィードバック レジスタが変更されるため、元のキーを暗号化に使用することはできません。 次の擬似コードは、これを行う方法を示しています。

// Set the IV for the original key. Do not use the original key for 
// encryption or decryption after doing this because the key's 
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)

while(block = NextBlock())
{
    // Create a duplicate of the original key. This causes the 
    // original key's IV to be copied into the duplicate key's 
    // feedback register.
    hDuplicateKey = CryptDuplicateKey(hOriginalKey)

    // Decrypt the block with the duplicate key.
    CryptDecrypt(hDuplicateKey, block)

    // Destroy the duplicate key. Its feedback register has been 
    // modified by the CryptEncrypt function, so it cannot be used
    // again. It will be re-duplicated in the next iteration of the 
    // loop.
    CryptDestroyKey(hDuplicateKey)
}

Microsoft Enhanced Cryptographic Provider では、RSA公開キーを使用した直接暗号化と RSA 秘密キーによる暗号化解除がサポートされています。 暗号化では PKCS #1 パディングが使用されます。 復号化時に、このパディングが検証されます。 暗号化を解除する 暗号テキスト データの長さは、データの復号化に使用される RSA キーの剰余と同じ長さにする必要があります。 暗号テキストの最上位バイトにゼロがある場合、これらのバイトは入力データ バッファーと入力バッファー長に含める必要があります。 暗号テキストは リトル エンディアン 形式である必要があります。

この関数を使用する例については、「 サンプル C プログラム: ファイルの復号化」を参照してください。

要件

   
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー wincrypt.h
Library Advapi32.lib
[DLL] Advapi32.dll

関連項目

CryptCreateHash

CryptEncrypt

CryptGenKey

CryptGetHashParam

CryptGetKeyParam

CryptImportKey

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

データ暗号化/復号化関数