建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
求助中

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

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

有人能指出我正确的方向吗?


Orange

2019-06-12

603

0

撰写答案

请先登陆或注册

1个回答

胜利

2019-06-12

OpenSSL默认使用PKCS#1 v1.5填充。 但是,正如Crypto.PublicKey文档所说:

注意:此函数[decrypt(self,ciphertext)]执行普通的原始RSA解密( 教科书 )。 在实际应用程序中,您始终需要使用正确的加密填充,并且不应使用此方法直接解密数据。

因此,如果要在Python中解密消息,则需要使用考虑此填充的模块 。

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来实现此-oaep中的解密代码非常相似,您可以参考文档中的示例代码。)


0
赞赏(0)

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励