メインコンテンツ

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

予測可能な暗号キー

暗号化または復号化のキーを脆弱な乱数発生器から生成している

説明

この欠陥は、暗号化キーまたは復号化キーに脆弱な乱数発生器を使用した場合に発生します。

リスク

暗号化または復号化のキーに脆弱な乱数発生器を使用すると、攻撃者はそのキーを簡単に手に入れることができます。

データの暗号化とその後の復号化にはキーを使用します。キーが容易に取得される場合、そのキーを使用して暗号化したデータは安全ではありません。

修正方法

キーに強力な疑似乱数発生器 (PRNG) を使用します。次に例を示します。

  • UNIX®/dev/random や Windows®CryptGenRandom() など、OS レベルの PRNG を使用

  • カウンター (CTR) モードの高度暗号化標準 (AES)、HMAC-SHA1 など、アプリケーション レベルの PRNG を使用

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

すべて展開する


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

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

この例では、openssl/rand.h で宣言されている関数 RAND_pseudo_bytes によって暗号キーを生成しています。ただし、RAND_pseudo_bytes が生成するバイト シーケンスは、必ずしも予測不可能ではありません。

修正 — 強力な乱数発生器を使用

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


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

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

結果情報

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

バージョン履歴

R2017a で導入