从客户端的openssl中提取AES的解密密钥
我已经实现了AES 128加密和解密函数,并用示例数据对其进行了测试,结果非常理想。我使用了以下参考: 接下来,我实现了一个虚拟SSL客户端和SSL服务器,它使用openssl发送和接收数据。它工作正常,没有任何错误,并且消息可以无缝交换 这里我的主要目标是使用openssl进行初始握手序列。一旦在服务器和客户机之间建立了连接,对传入消息进行解密(这次不是使用openssl api,而是使用前面实现的decrypt AES函数),并对传出消息进行打印和类似操作。我们将重点关注传入的消息 为此,我当然需要解密密钥和IV。我在客户端获得了解密密钥(读取密钥),如下所示:(ssl是用于建立连接的openssl的ssl*结构,我直接访问openssl的源代码结构) 我使用这个密钥用AES解密函数对传入消息进行解密,但没有成功 现在AES是对称加密,所以我想让我检查服务器端的加密(写)密钥。服务器上的加密密钥应等于客户端上的解密密钥。我在服务器上获得了加密密钥,如下所示:从客户端的openssl中提取AES的解密密钥,ssl,openssl,aes,Ssl,Openssl,Aes,我已经实现了AES 128加密和解密函数,并用示例数据对其进行了测试,结果非常理想。我使用了以下参考: 接下来,我实现了一个虚拟SSL客户端和SSL服务器,它使用openssl发送和接收数据。它工作正常,没有任何错误,并且消息可以无缝交换 这里我的主要目标是使用openssl进行初始握手序列。一旦在服务器和客户机之间建立了连接,对传入消息进行解密(这次不是使用openssl api,而是使用前面实现的decrypt 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标准中解密消息)
因此,我得出以下推论:
如何在客户端获取可用于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