我通过shell有这些命令序列可以正常工作:
fishgills@fishgills-Mac ~ cat /tmp/secret_message
Helloo there.%
fishgills@fishgills-Mac ~ openssl rsautl -encrypt -inkey ~/Documents/test_pub.pem -pubin -in /tmp/secret_message -out /tmp/test.enc
fishgills@fishgills-Mac ~ openssl rsautl -decrypt -inkey ~/Documents/test.pem -in /tmp/test.enc
Helloo there.%
fishgills@fishgills-Mac ~
如你所见,一切正常。加密消息并能够解密它。
所以在python中,我试图做同样的事情:
from Crypto.PublicKey import RSA
rsakey = RSA.importKey(open("/Users/fishgills/Documents/test.pem", 'rb').read())
raw_data = open("/tmp/test.enc", 'rb').read()
decrypted = rsakey.decrypt(raw_data)
print decrypted
程序的输出是:
fishgills@fishgills-Mac ~ python main.py ~/Documents/test.pem
�%��u�9��炿��:og:_�Z��WF/��W �v��������a�Jw+�J�Th�N9`V���5t##Go0�
#��A2e*����a�����a�ň��ߘhQX��U�7AB��B�Q�X�l�� ����rkK����� �kKj��\u���PILT�@���Rj���0:��߰9˕�Helloo there.
你可以在那里看到消息......但是有一堆垃圾。 PyCrypto文档说decrypt
方法返回一个字节字符串,但我无法正确地decode
,我得到的结论是:
Traceback (most recent call last):
File "main.py", line 9, in <module>
print decrypted.decode("utf-8")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd7 in position 1: invalid continuation byte
任何人都能指出我正确的方向吗?
答案 0 :(得分:3)
OpenSSL默认使用PKCS#1 v1.5填充。但是,正如documentation for Crypto.PublicKey所说:
注意:此函数[decrypt(self,ciphertext)]执行简单的原始RSA解密(教科书)。在实际应用程序中,您始终需要使用正确的加密填充,并且不应使用此方法直接解密数据。
因此,如果您想在Python中解密消息,则需要使用a module that takes this padding into account。
def test_decrypt():
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
key = RSA.importKey(open('test.pem').read())
cipher = PKCS1_v1_5.new(key)
return cipher.decrypt(open("test.enc", 'rb').read(),'** decryption error **')
test_decrypt()
(注意:根据Python文档,您最好使用PKCS#1 OAEP而不是PKCS#1 v1.5。在OpenSSL中,您可以通过在命令行选项中添加-oaep
来实现此目的Python中的解密代码非常相似,您可以参考documentation代码示例。)