python - 解密 SSL 预主 key

标签 python ssl encryption cryptography

我正在尝试通过 Wireshark 分析 SSL 3.0 session 。具体来说,我想解密加密的预主 key 。我的理解是pre-master是用证书公钥加密的。这是基于 SSL RFC 和规范

这就是我所做的。我创建了一个测试公钥/私钥对。私钥是:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDCNh5qKloB7BZ2MgP5hWwc4h/LuH+2VRiriCiV3z/NS8NKK3Gy
edZTa0GL1gm6JoDzcnGg/JXLjnqI/aiIok1AwjaJ5LqErWlkYrkV/1iB6x0oViRT
NsN3hagHHi5Z7n3j1/vP+hfMkSiOeyZ3YwxSWOTDDg2hfmVpJ+5n5ysMwwIDAQAB
AoGAMovlVJpbPL7WhcK0uB+aqNXNkrcdPjZdql9QuNkXAPakCEzQVbRSLPnwYFW/
yFw3GaWCn3S+A/G8QKVMVOtxEWKKBkp3BFKmAsf9t3DeNY7lU8JRdF0f290lhanK
aKdej7OuBDFkY7kYhdXj7fq/EcDsRA7l+TD0sjIp7ikA3NkCQQDpfaYnnkayKl5o
/apDP3FjDeiK3n1xTX3SG9LuS37clzRIlIMh5NTxzRDDxE5jbIAXWE3ikI63Kpo1
zXZOkg3HAkEA1O8WfXg7frsMEaXv671570J+T0yjf8m87o4oZpN4F5ni3uC0sn0u
vc5SeHyAhJlQrDqSVDTGq9Ntc+PqEBR5JQJBAJnTFav0Mk8eaqRwucMkAOdpOlKC
0dHbY5EQk546TpG1a9SFQv8JauECYJEYuyv1R04Z9vXUlrFFd+MKQW7x+fECQQCa
OtbSaHzHbVnvin5+BM7GAyaT75HZZFkJfUQ8EAKDLb5K6v1W7x8k8cWAacV4xcfO
B9qnTVa9bDWyJFoL7ZhVAkEAm1j78aFqXKR8BK0Wk9ulmVJJGX6WZUENlBzln/hZ
LXL0G4fT7BVgvJbFWIElf80y8U1cbhH6S5N2kZ7Pb7rJ8w==
-----END RSA PRIVATE KEY-----

我启动了一个 OpenSSL 服务器,如下所示:

openssl s_server -accept 8443 -cert server.crt -key server.key -ssl3 -cipher 'RC4-SHA'

并连接如下:

openssl s_client -connect localhost:993

然后我在 wireshark 中捕获了 SSL 握手并查看了第三个数据包,标记为“客户端 key 交换、更改密码规范、加密的握手消息”。在“Client Key Exchange”下,有一个128字节的部分,我理解为加密的pre-master key。在十六进制中,它是:

9601aa2a2768b58af647e03f23e3bdaa5d9ab12d648d85755aaaee430ea273946dec5348aaa61dc261138d50d2c80966b7113a659ad5a3998263e2dc0ce4bba5dbd22d2c6bc5c4c75802b8b130d1b0b39558d5516bbe1a1ce2852a6495e52fda5259626480ec1aede49a085b5f6005a1317cfabf72ff740cd038808e01fb3ac2

我正在尝试用 python 解密它。考虑到我有私钥,这应该很简单。我执行以下操作:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

handshake = "9601aa2a2768b58af647e03f23e3bdaa5d9ab12d648d85755aaaee430ea273946dec5348aaa61dc261138d50d2c80966b7113a659ad5a3998263e2dc0ce4bba5dbd22d2c6bc5c4c75802b8b130d1b0b39558d5516bbe1a1ce2852a6495e52fda5259626480ec1aede49a085b5f6005a1317cfabf72ff740cd038808e01fb3ac2".decode('hex')

privkey = open('server.key', 'r').read()
rsakey = RSA.importKey(privkey)
rsakey = PKCS1_OAEP.new(rsakey)
decrypted = rsakey.decrypt(handshake)

print decrypted

但是,我得到这个错误:

Traceback (most recent call last):
  File "handshake.py", line 13, in <module>
    decrypted = rsakey.decrypt(handshake)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/PKCS1_OAEP.py", line 227, in decrypt
    raise ValueError("Incorrect decryption.")
ValueError: Incorrect decryption.

为什么我不能解密这个我有私钥。 OpenSSL 做了哪些我没有做的事情?是什么赋予了?感谢您提供任何帮助!

最佳答案

看来您应该使用 PKCS#1 v1.5 填充而不是 OAEP。

这应该有效:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

handshake = "9601aa2a2768b58af647e03f23e3bdaa5d9ab12d648d85755aaaee430ea273946dec5348aaa61dc261138d50d2c80966b7113a659ad5a3998263e2dc0ce4bba5dbd22d2c6bc5c4c75802b8b130d1b0b39558d5516bbe1a1ce2852a6495e52fda5259626480ec1aede49a085b5f6005a1317cfabf72ff740cd038808e01fb3ac2".decode('hex')

privkey = open('server.key', 'r').read()
rsakey = RSA.importKey(privkey)
rsa = PKCS1_v1_5.new(rsakey)
sentinel = 'Failure'
decrypted = rsa.decrypt(handshake, sentinel)

print decrypted.encode('hex')

关于python - 解密 SSL 预主 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285099/

相关文章:

python 2.3 - 删除目录而不等待进程完成

python - PayPal Python Pay 请求 ClientDetails

php - openssl_verify 和 "error:0906D06C:PEM routines:PEM_read_bio:no start line"

python - urllib 和 "SSL: CERTIFICATE_VERIFY_FAILED"错误

c# - 如何解密内存中的加密图像并在应用程序中使用

python - 使用 Django 和 csv.DictReader 解析 CSV

python - 转换日期 (YYYY MM DD HH :MM:SS) to Decimal Day (YYYY MM DD. ddddd)

ios - 在 AFNetworking 2.0 中使用 SSL 时出现错误 1012

encryption - 如何在加密算法中使用 key ?

node.js - Nodejs createDecipher,可以用两个不同的 key 解密相同的密文