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

从客户端的openssl中提取AES的解密密钥,ssl,openssl,aes,Ssl,Openssl,Aes,我已经实现了AES 128加密和解密函数,并用示例数据对其进行了测试,结果非常理想。我使用了以下参考: 接下来,我实现了一个虚拟SSL客户端和SSL服务器,它使用openssl发送和接收数据。它工作正常,没有任何错误,并且消息可以无缝交换 这里我的主要目标是使用openssl进行初始握手序列。一旦在服务器和客户机之间建立了连接,对传入消息进行解密(这次不是使用openssl api,而是使用前面实现的decrypt AES函数),并对传出消息进行打印和类似操作。我们将重点关注传入的消息 为此,

我已经实现了AES 128加密和解密函数,并用示例数据对其进行了测试,结果非常理想。我使用了以下参考:

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

这里我的主要目标是使用openssl进行初始握手序列。一旦在服务器和客户机之间建立了连接,对传入消息进行解密(这次不是使用openssl api,而是使用前面实现的decrypt AES函数),并对传出消息进行打印和类似操作。我们将重点关注传入的消息

为此,我当然需要解密密钥和IV。我在客户端获得了解密密钥(读取密钥),如下所示:(ssl是用于建立连接的openssl的ssl*结构,我直接访问openssl的源代码结构)

我使用这个密钥用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解密例程的解密密钥?

    OpenSSL的
    AES\u密钥
    不是密钥;这是一个关键的时间表与调整。对于加密,前1、1.5或2个轮密钥是“用户”密钥,但对于使用等效逆形式(FIPS197中的5.3.5)的解密,轮密钥由InvMixColumns矩阵预乘(在GF/11B中),加上OpenSSL反转顺序,使Rn位于下标0..3,R0位于下标4n..4n+3;请参阅源代码中的
    crypto/aes/aes_core.c
    。取Rn和可能的Rn-1(取决于密钥大小)并用forward MixColumns重新乘以它们应该是可行的,但我还没有尝试过。什么是虚拟SSL客户机/服务器?它是否真正实现了SSL/TLS协议。如果不是,它只是一个自定义加密连接,很可能不安全,容易受到几十次攻击。只要使用TLS1.2/1.3就可以了。
    [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