Предсказуемый ключ шифра

Ключ шифрования или ключ расшифровки сгенерированы от слабого генератора случайных чисел

Описание

Предсказуемый ключ шифра происходит, когда вы используете слабый генератор случайных чисел для ключа шифрования или ключа расшифровки.

Риск

Если вы используете слабый генератор случайных чисел для ключа шифрования или ключа расшифровки, атакующий может получить ваш ключ легко.

Вы используете ключ, чтобы зашифровать и позже дешифровать ваши данные. Если ключ легко получен, данные зашифровали использование, что ключ не безопасен.

Фиксация

Используйте сильный генератор псевдослучайного числа (PRNG) для ключа. Например:

  • Используйте OS-level PRNG, такой как /dev/random на UNIX® или CryptGenRandom() на Windows®

  • Используйте уровень приложения PRNG, такой как Усовершенствованный стандарт шифрования (AES) в режиме Counter (CTR), HMAC-SHA1, и т.д.

Для списка генераторов случайных чисел, которые криптографически слабы, смотрите 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); 
}

В этом примере функциональный RAND_pseudo_bytes, объявленный в openssl/rand.h, производит ключ шифра. Однако последовательности байта, которые генерирует RAND_pseudo_bytes, не обязательно непредсказуемы.

Исправление — использует сильный генератор случайных чисел

Одно возможное исправление должно использовать сильный генератор случайных чисел, чтобы произвести ключ шифра. Исправленный код здесь использует функциональный RAND_bytes, объявленный в openssl/rand.h.


#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++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_CIPHER_PREDICTABLE_KEY
Влияние: носитель
ID CWE: 310, 326, 330, 338

Введенный в R2017a