Python 解密SSL预主密钥

Python 解密SSL预主密钥,python,ssl,encryption,cryptography,Python,Ssl,Encryption,Cryptography,我试图通过Wireshark分析SSL 3.0会话。具体来说,我想解密加密的预主密钥。我的理解是,预主机是用证书公钥加密的。这是基于SSL RFC和规范的 这就是我所做的。我创建了一个测试公钥/私钥对。私钥是: -----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQDCNh5qKloB7BZ2MgP5hWwc4h/LuH+2VRiriCiV3z/NS8NKK3Gy edZTa0GL1gm6JoDzcnGg/JXLjnqI/aiIok1AwjaJ5LqErWl

我试图通过Wireshark分析SSL 3.0会话。具体来说,我想解密加密的预主密钥。我的理解是,预主机是用证书公钥加密的。这是基于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
并连接如下:

openssl s_server -accept 8443 -cert server.crt -key server.key -ssl3 -cipher 'RC4-SHA'
openssl s_client -connect localhost:993
然后,我在wireshark中捕获了SSL握手,并查看了第三个数据包,标记为“客户机密钥交换,更改密码规范,加密握手消息”。在“客户端密钥交换”下,有一个128字节的部分,我理解为加密的预主密钥。在十六进制中,它是:

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.
回溯(最近一次呼叫最后一次):
文件“handshake.py”,第13行,在
解密=rsakey.decrypt(握手)
文件“/usr/lib/python2.7/dist packages/Crypto/Cipher/PKCS1_OAEP.py”,第227行,在decrypt中
raise VALUERROR(“不正确的解密”)
ValueError:解密不正确。

为什么我不能解密这个我有私钥。OpenSSL做了什么我没有做的事情?有什么好处?感谢您的任何帮助

似乎应该使用PKCS#1v1.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')

解密时使用什么哈希算法?我没有指定,代码是原样的。应该吗?这是一个预主密钥,不是密钥。必须编译并安装pycrypto才能做到这一点,dangit:)就是这样!非常感谢。我有一个问题,'sentinel'变量做什么?Had open:
返回:一个字节字符串。它要么是原始消息,要么是哨兵(如果出现错误)。
就个人而言,我不喜欢魔法值——特别是在加密软件包中,但我想每个人都有自己的魔法值。