CryptDecrypt 関数 (wincrypt.h)

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

Secure/Multipurpose Internet Mail Extensions (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 Enhanced Cryptographic Provider でのみサポートされます。 このフラグを CRYPT_DECRYPT_RSA_NO_PADDING_CHECK フラグと組み合わせることはできません。
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
パディングを確認せずに、BLOB で復号化を実行します。 このフラグは、RSA 暗号化/暗号化解除を使用する microsoft Enhanced Cryptographic Provider でのみサポートされます。 このフラグを 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 を に設定する必要があります。これは、復号化エンジンが復号化プロセスを適切に完了できるようにするためです。 最後の が TRUE場合は、次の追加アクションが実行されます。

  • キーがブロック暗号キーの場合、データは暗号のブロック サイズの倍数に埋め込まれます。 暗号のブロック サイズを見つけるには、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 キーの剰余と同じ長さにする必要があります。 暗号テキストの最上位バイト数が 0 の場合、これらのバイトは入力データ バッファーと入力バッファーの長さに含める必要があります。 暗号テキストは、リトル エンディアン 形式 する必要があります。

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

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー wincrypt.h
ライブラリ Advapi32.lib
DLL Advapi32.dll

関連項目

CryptCreateHash

CryptEncrypt

CryptGenKey

CryptGetHashParam

CryptGetKeyParam

CryptImportKey

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

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