从客户端的openssl提取AES的解密密钥

时间:2018-11-14 08:26:55

标签: ssl openssl aes

我已经实现了AES 128加密和解密功能,并使用示例数据对其进行了测试,并且可以完美地检出。我使用以下参考: https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf

接下来,我实现了一个虚拟SSL客户端和SSL服务器,该服务器使用openssl来发送和接收数据。它可以正常工作,并且消息可以无缝交换。

我这里的主要目标是将openssl用于初始握手序列。一旦在服务器和客户端之间建立了连接,就解密传入的消息(这次不使用openssl api,而是使用之前实现的解密AES函数),并打印输出类似的消息。我们将专注于收到的消息。

为此,我当然需要解密密钥和IV。我在客户端获得了解密密钥(读取密钥),如下所示:(ssl是已建立连接的openssl的SSL *结构,我正在直接访问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是对称加密,因此我想让我检查服务器端的crypto(write)密钥。服务器上的加密密钥应等于客户端上的解密密钥。我在服务器上得到了加密密钥,如下所示:

[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解密例程中使用的解密密钥?

0 个答案:

没有答案