メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ブロック暗号初期化ベクトルがありません

暗号化または復号化に使用されるコンテキストが NULL 初期化ベクトルに関連付けられているか、初期化ベクトルと関連付けられていない

説明

この欠陥は、NULL 初期化ベクトル (IV) を使用してデータを暗号化または復号化した場合に発生します。

メモ

暗号コンテキストは NULL 初期化ベクトル (IV) を使用して初期化できます。ただし、アルゴリズムに IV が必要な場合、暗号化ステップまたは復号化ステップの前に、暗号コンテキストを非 NULL の IV に関連付けなければなりません。

リスク

多くのブロック暗号モードは、辞書攻撃を防ぐために初期化ベクトル (IV) を使用します。NULL の IV を使用すると、暗号化したデータはこのような攻撃に対して脆弱になります。

ブロック暗号は、データを固定サイズのブロックに分割します。CBC (Cipher Block Chaining) などのブロック暗号モードは、辞書攻撃から保護するために、各ブロックと前のブロックからの暗号化出力とを XOR 演算します。最初のブロックを保護するため、このようなモードではランダムな初期化ベクトル (IV) を使用します。NULL の IV を使用する場合、同じプレーンテキストを暗号化すると、同じ暗号文になります。こうしたデータは、辞書攻撃に対して脆弱になります。

修正方法

暗号化または復号化のステップの前

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
暗号コンテキスト ctx を非 NULL の初期化ベクトルに関連付けます。
ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)

すべて展開する


#include <openssl/evp.h>
#include <stdlib.h>
#define fatal_error() abort()

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, NULL); 
    
    /* Update step with NULL initialization vector */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

この例では、暗号コンテキスト ctx に関連付けられている初期化ベクトルは NULL です。このコンテキストを使用してデータを暗号化すると、そのデータは辞書攻撃に対して脆弱になります。

修正 — ランダムな初期化ベクトルを使用

強力な乱数発生器を使用して初期化ベクトルを作成します。修正した次のコードでは、openssl/rand.h で宣言されている関数 RAND_bytes を使用します。


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define fatal_error() abort()
#define SIZE16 16

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    unsigned char iv[SIZE16];
    RAND_bytes(iv, 16);
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL initialization vector */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

結果情報

グループ: 暗号化
言語: C | C++
既定値: オフ
コマンド ライン構文: CRYPTO_CIPHER_NO_IV
影響度: Medium

バージョン履歴

R2017a で導入