処理する暗号データがありません
前に更新ステップを行わずに、暗号化または復号化の最終ステップを実行している
説明
この欠陥は、ブロック暗号の暗号化または復号化の最終ステップを不適切に実行した場合に発生します。
たとえば、次のいずれかを行います。
最終ステップを実行する前に、データの暗号化または復号化の更新ステップを実行していない。
/* Initialization of cipher context */ ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); ... /* Missing update step */ ... /* Final step */ ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
初期化と更新のステップを挟まずに、連続して最終ステップを実行している。
/* Initialization of cipher context */ ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); ... /* Update step(s) */ ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len); ... /* Final step */ ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len); ... /* Missing initialization and update */ ... /* Second final step */ ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
暗号コンテキストのクリーンアップを実行してから、最終ステップを実行している。
/* Initialization of cipher context */ ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); ... /* Update step(s) */ ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len); ... /* Cleanup of cipher context */ EVP_CIPHER_CTX_cleanup(ctx); ... /* Second final step */ ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
リスク
ブロック暗号は、データを固定サイズのブロックに分割します。暗号化または復号化時は、更新ステップでブロック内のデータの暗号化または復号化が行われます。最終ステップでは、残りのデータがある場合にそのデータの暗号化または復号化が行われます。最終ステップでは、1 ブロックが埋まるように残りのデータにパディングが追加され、パディング後のデータの暗号化または復号化が行われます。
最終ステップを更新ステップの前に実行したり、処理するデータが存在しないときに最終ステップを実行する場合、未定義の動作になります。また、ランタイム エラーが発生する可能性もあります。
修正方法
次の順序で暗号化または復号化を実行します。
暗号コンテキストの初期化
更新ステップ
最終ステップ
コンテキストのクリーンアップ
例
結果情報
グループ: 暗号化 |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: CRYPTO_CIPHER_NO_DATA |
影響度: Medium |
バージョン履歴
R2017a で導入