メインコンテンツ

暗号アルゴリズムがありません

暗号化または復号化のアルゴリズムが暗号コンテキストに関連付けられていない

説明

この欠陥は、暗号コンテキストの設定時に暗号アルゴリズムを割り当てなかった場合に発生します。

暗号コンテキストは、アルゴリズムを指定しないで初期化することができます。ただし、データを暗号化または復号化する前には、暗号コンテキストに暗号アルゴリズムを関連付けなければなりません。

リスク

暗号アルゴリズムがないと、ランタイム エラーが発生するか、少なくとも安全ではない暗号文になる可能性があります。

暗号化または復号化の前には、暗号アルゴリズムとモード、暗号化または復号化のキー、初期化ベクトル (初期化ベクトルが必要なモードの場合) など、暗号化に必要な情報をもつ暗号コンテキストを設定します。

ret = EVP_EncryptInit(&ctx, EVP_aes_128_cbc(), key, iv)
関数 EVP_aes_128_cbc() は、暗号化に高度暗号化標準 (AES) アルゴリズムを使用しなければならないことを指定します。また、128 ビットのブロック サイズと、Cipher Block Chaining (CBC) モードも指定しています。

アルゴリズムを指定する代わりに、初期化ステップで NULL を使用することができます。ただし、暗号化または復号化に暗号コンテキストを使用する前に、アルゴリズムを暗号コンテキストに関連付ける追加の初期化を実行しなければなりません。そうでない場合、暗号化または復号化の更新ステップでランタイム エラーが発生する可能性があります。

修正方法

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

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
暗号コンテキスト ctx にアルゴリズムを関連付けます。
ret = EVP_EncryptInit(ctx, EVP_aes_128_cbc(), key, iv)

すべて展開する


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

unsigned char key[SIZE16];
unsigned char iv[SIZE16];
void func(void) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();       
    EVP_CIPHER_CTX_init(ctx);
    EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv); 
}

この例では、暗号コンテキスト ctx を初期化するときにアルゴリズムを指定していません。

データを暗号化または復号化する前に、暗号アルゴリズムを指定しなければなりません。2 回目の初期化を実行してアルゴリズムを指定する場合、この暗号コンテキストは完全に再初期化されます。そのため、EVP_EncryptInit_ex を使用する現在の初期化ステートメントは冗長になります。

修正 — 初期化中のアルゴリズムの指定

1 つの修正方法として、暗号コンテキストの初期化時にアルゴリズムを指定します。修正した次のコードでは、ルーチン EVP_aes_128_cbc が高度暗号化標準 (AES) アルゴリズムを呼び出します。このルーチンでは、暗号化に 128 ビットのブロック サイズと、Cipher Block Chaining (CBC) モードも指定しています。


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

unsigned char key[SIZE16];
unsigned char iv[SIZE16];
void func(unsigned char *src, int len, unsigned char *out_buf, int out_len) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();       
    EVP_CIPHER_CTX_init(ctx);
    
    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update steps for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

結果情報

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

バージョン履歴

R2017a で導入