メインコンテンツ

暗号キーがありません

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

説明

この欠陥は、NULL 暗号化キーまたは NULL 復号化キーを使用して暗号化または復号化した場合に発生します。

メモ

暗号コンテキストは NULL キーを使用して初期化できます。ただし、データを暗号化または復号化する前には、暗号コンテキストに非 NULL のキーを関連付けなければなりません。

リスク

NULL キーを使用して暗号化または復号化を行うと、ランタイム エラーが発生するか、少なくとも安全でない暗号文になる可能性があります。

修正方法

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

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

暗号コンテキストの初期化に非 NULL のキーを使用する場合もあります。

ret = EVP_EncryptInit_ex(&ctx, cipher_algo_1, NULL, key, iv)
ただし、後から暗号アルゴリズムを変更します。暗号アルゴリズムを変更するときに NULL キーを使用します。
 ret = EVP_EncryptInit_ex(&ctx, cipher_algo_2, NULL, NULL, NULL)
2 番目のステートメントは暗号コンテキストを完全に再初期化しますが、NULL キーを使用しています。このような問題を避けるには、アルゴリズムを指定して暗号コンテキストを初期化するときは、必ずコンテキストにキーを関連付けます。

すべて展開する


#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 *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, iv); 
    
    /* Update step with NULL key */
    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 *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    unsigned char key[SIZE16];
    RAND_bytes(key, 16);
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL cipher key */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

結果情報

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

バージョン履歴

R2017a で導入