メインコンテンツ

脆弱な暗号モード

暗号コンテキストに関連付けられた暗号化モードが脆弱

説明

この欠陥は、暗号コンテキストに脆弱なブロック暗号モードを関連付けた場合に発生します。

この欠陥によって特にフラグが付けられる暗号モードは、Electronic Code Book (ECB) モードです。

リスク

ECB モードは、辞書攻撃に対する保護をサポートしません。

攻撃者は、総当たり攻撃を使用しても、データを復号化することができます。

修正方法

ECB よりも安全な暗号モードを使用します。

たとえば、Cipher Block Chaining (CBC) モードは、次の方法で辞書攻撃から保護します。

  • データの各ブロックと前のブロックの暗号化後の出力を XOR 演算する。

  • データの最初のブロックとランダムな初期化ベクトル (IV) を XOR 演算する。

すべて展開する


#include <openssl/evp.h>
#include <stdlib.h>

void func(unsigned char *key, unsigned char *iv) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);
    const EVP_CIPHER * ciph = EVP_aes_128_ecb();        
    EVP_EncryptInit_ex(ctx, ciph, NULL, key, iv);   
}

この例では、ルーチン EVP_aes_128_ecb() が Electronic Code Book (ECB) モードで高度暗号化標準 (AES) アルゴリズムを呼び出します。ECB モードは、辞書攻撃に対する保護をサポートしません。

修正 — CBC モードを使用

1 つの修正方法として、Cipher Block Chaining (CBC) モードを代わりに使用します。


#include <openssl/evp.h>
#include <stdlib.h>

void func(unsigned char *key, unsigned char *iv) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);
    const EVP_CIPHER * ciph = EVP_aes_128_cbc();        
    EVP_EncryptInit_ex(ctx, ciph, NULL, key, iv);   
}

結果情報

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

バージョン履歴

R2017a で導入