exponenta event banner

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

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

Описание

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

Риск

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

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

Зафиксировать

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

  • Использование PRNG уровня ОС, например /dev/random в UNIX ® илиCryptGenRandom() в ОС Windows ®

  • Используйте PRNG на уровне приложений, например Advanced Encryption Standard (AES) в режиме счетчика (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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_PREDICTABLE_KEY
Воздействие: среднее
CWE ID: 310, 326, 330, 338
Представлен в R2017a