用Crypto打印RSA解密的字节串?

时间:2017-04-10 23:44:15

标签: python cryptography pycrypto

我通过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

任何人都能指出我正确的方向吗?

1 个答案:

答案 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代码示例。)