Я реализовал функции шифрования и дешифрования AES 128, проверил их на примере данных, и он отлично проверил. Я использовал следующую ссылку:
https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf
Далее я реализовал фиктивный клиент SSL и сервер SSL, который использует openssl для отправки и получения данных. Он работает без каких-либо ошибок, и сообщения обмениваются без проблем.
Моя главная цель здесь - использовать openssl для начальной последовательности рукопожатия. Как только соединение между сервером и клиентом установлено, расшифруйте входящее сообщение (на этот раз не используя API openssl, а скорее используя расшифровку функции AES, реализованную ранее) и распечатайте и аналогично для исходящего сообщения. Мы сосредоточимся на входящих сообщениях.
Для этого, конечно, мне понадобится ключ дешифрования и IV. Я получил ключ дешифрования (ключ чтения) на стороне клиента следующим образом: (ssl - это структура SSL * openssl для установленного соединения, я непосредственно обращаюсь к структурам исходного кода openssl)
//following struct copied from crypto/evp/e_aes.c
typedef struct {
union {
double align;
AES_KEY ks;
} ks;
block128_f block;
union {
cbc128_f cbc;
ctr128_f ctr;
} stream;
} EVP_AES_KEY;
[Client Side]
EVP_AES_KEY *cipher_data;
cipher_data = EVP_CIPHER_CTX_get_cipher_data(ssl->enc_read_ctx);
cipher_data->ks.ks.rd_key --> this is the decrypt key
Я использовал этот ключ для расшифровки входящего сообщения с помощью функции расшифровки AES, но напрасно.
Теперь AES - это симметричное шифрование, поэтому я подумал, что мне нужно проверить ключ шифрования (записи) на стороне сервера. Ключ шифрования на сервере должен быть равен ключу дешифрования на стороне клиента. Я получил ключ шифрования на сервере, как показано ниже:
[Server Side]
EVP_AES_KEY *cipher_data;
cipher_data = EVP_CIPHER_CTX_get_cipher_data(ssl->enc_write_ctx);
cipher_data->ks.ks.rd_key --> this is the encrypt key
К моему удивлению, они разные. Теперь, если я использую вышеупомянутый ключ шифрования сервера, чтобы расшифровать сообщение на стороне клиента. Сообщение успешно расшифровано. (Как и ожидалось, ключ, используемый для шифрования сообщения, используется для дешифрования сообщения в стандарте AES).
Итак, я пришел к следующим выводам:
- Ключ дешифрования, полученный на стороне клиента, каким-то образом зашифрован в openssl?
- Мой метод получения ключа дешифрования на стороне клиента неверен.
Как получить ключ расшифровки на стороне клиента, который я могу использовать в процедуре расшифровки AES?