Извлечение ключа дешифрования для AES из openssl на стороне клиента - PullRequest
0 голосов
/ 14 ноября 2018

Я реализовал функции шифрования и дешифрования 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).

Итак, я пришел к следующим выводам:

  1. Ключ дешифрования, полученный на стороне клиента, каким-то образом зашифрован в openssl?
  2. Мой метод получения ключа дешифрования на стороне клиента неверен.

Как получить ключ расшифровки на стороне клиента, который я могу использовать в процедуре расшифровки AES?

...