Как сделать расшифровку AES с помощью OpenSSL - PullRequest
15 голосов
/ 27 февраля 2011

Я бы хотел использовать библиотеку OpenSSL для расшифровки некоторых данных AES.Код имеет доступ к ключу.Этот проект уже использует libopenssl для чего-то другого, поэтому я хотел бы придерживаться этой библиотеки.

Я обратился непосредственно к /usr/include/openssl/aes.h, так как на сайте OpenSSL мало документации.Единственная функция дешифрования - эта:

void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);

К сожалению, здесь нет способа указать длину указателя in, поэтому я не уверен, как это будет работать.

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

void AES_ecb_encrypt(*in, *out, *key, enc);
void AES_cbc_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_cfb128_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb1_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb8_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfbr_encrypt_block(*in, *out, nbits, *key, *ivec, enc);
void AES_ofb128_encrypt(*in, *out, length, *key, *ivec, *num);
void AES_ctr128_encrypt(*in, *out, length, *key, ivec[], ecount_buf[], *num);
void AES_ige_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_bi_ige_encrypt(*in, *out, length, *key, *key2, *ivec, enc);

Насколько я понимаю, с помощью Google парм enc имеет значение AES_ENCRYPT или AES_DECRYPT, чтобы указать, какое действие необходимо выполнить.

Какойприводит меня к моим 2 вопросам:

  1. Что означают эти имена?Что такое ecb, cbc, cfb128 и т. Д. И как я могу решить, какой из них мне следует использовать?
  2. Что такое unsigned char *ivec parm, необходимый для большинства из них, и где я могу его получитьс?

1 Ответ

18 голосов
/ 27 февраля 2011

Размер не указан, потому что размеры блоков для AES фиксированы в зависимости от размера ключа ; Вы нашли реализацию режима ECB , которая не подходит для непосредственного использования (кроме как в качестве учебного пособия).

ECB, CBC, CFB128 и т. Д., Все это короткие имена для режимов работы , которые широко используются. Они имеют разные свойства, но если вы никогда не касаетесь режима ECB, с вами все будет в порядке.

Я предлагаю держаться подальше от низкоуровневого кода; вместо этого используйте интерфейсы EVP_*, если можете, и вы можете перенести некоторые из этих решений в текстовый файл конфигурации, чтобы ваши пользователи могли легко выбирать между различными шифрами, размерами блоков и режимами работы если когда-либо должна быть веская причина для отказа от настроек по умолчанию.

Мои симпатии, документация OpenSSL чувствует себя хуже, чем она есть, и это не так здорово. Сетевая безопасность с OpenSSL может оказаться полезной книгой. Хотелось бы, чтобы я нашел его раньше, когда в последний раз мне нужно было использовать OpenSSL. (Не позволяйте глупому названию обмануть вас - это должно быть названо просто "OpenSSL". Ну, хорошо.)

Редактировать Я забыл упомянуть векторы инициализации . Они используются для обеспечения того, чтобы при шифровании одних и тех же данных одним и тем же ключом зашифрованный текст не был идентичным. Вам нужен IV для расшифровки данных, но вам не нужно хранить IV в секрете. Вы должны либо сгенерировать один случайным образом для каждого сеанса (и отправить его вместе с ключом сеанса RSA или Эль-Гамаля, либо с DH-шифрованием), либо сгенерировать его идентично на обеих конечных точках, либо сохранить его локально с файлом, что-то вроде этого.

...