メインコンテンツ

定数のブロック暗号初期化ベクトル

ランダム化されていない定数の初期化ベクトル

説明

この欠陥は、暗号化中の初期化ベクトル (IV) に定数が使用された場合に発生します。

リスク

定数 IV の使用は、IV を使用しないのと同じです。このような暗号化データは、辞書攻撃に対して脆弱です。

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

修正方法

強力な乱数発生器を使用してランダムな IV を作成します。

暗号法的に脆弱な疑似乱数発生器の一覧については、Vulnerable pseudo-random number generator を参照してください。

すべて展開する


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

/* Using the cryptographic routines */

int func(EVP_CIPHER_CTX *ctx, unsigned char *key){
    unsigned char iv[SIZE16] = {'1', '2', '3', '4','5','6','b','8','9',
                                 '1','2','3','4','5','6','7'};
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

この例では、初期化ベクトル iv は定数のみを保持します。この定数初期化ベクトルにより、暗号は辞書攻撃に対して脆弱になります。

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

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


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define SIZE16 16

/* Using the cryptographic routines */

int func(EVP_CIPHER_CTX *ctx, unsigned char *key){
    unsigned char iv[SIZE16];
    RAND_bytes(iv, 16);
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

結果情報

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

バージョン履歴

R2017a で導入