从解密的文本中获取正确的输出

时间:2019-02-02 07:54:13

标签: python encryption rsa

我正在使用python中的公共和私有密钥进行加密和解密。我已经加密了文本并试图对其进行解密,但是我得到了一些随机文本结尾处的实际消息!我可以得到帮助以了解我在做什么错吗?

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

msg = "supriya"
print("raw msg->", msg)
public_key_string = open("key.pem","r").read()
keyPub = RSA.importKey(public_key_string) # import the public key
cipher = Cipher_PKCS1_v1_5.new(keyPub)
#print(cipher.encrypt.__doc__)
cipher_text = cipher.encrypt(msg.encode()) # now we have the cipher
'print("cipher text->", cipher_text)'

private_key_string = open("key2.py","r").read()
private_key = RSA.importKey(private_key_string)
print(private_key)
decrypted = private_key.decrypt(cipher_text)
print(decrypted)

当我尝试print(decrypted)我得到:

b"\x02\x1cL`(\xf8\xbb\x84Eg\xc2\xf2Z\xa7\xa3\x10\xd06\x9a\x05
\xbd\xd0\x9e$\x94\x89\xd4\x04M\x7f\xb8\xc4\x01k\xf9\x9a\xb6&
\x07\xd6jbw\x9c>\x08\xdb\xe5\xda@\x9b\\\xa5Pz\xe8\x94s4+\xee
]'W.T+\xb6\xd7\x19\x7f\x85tL\xe9J:\x08\xf7\xbd\xbd\xdc\x99ep
\xd5\xea\xf1[\xff\x8a\x1d\xd5#\xd8s\n\xec\xb5,\xde\x1dE\xe7
\x99\x1f(\xbfm=iu1 \xe4^\x18\x10\x06z'\xf4_\x1c\x88[D\xa5
\xe6J\xa8\xf1\x7f\xb4\xe3r\xad)\xcb\xa3\x06\xf9\xbea6A\xf32
\x99\xa3y\xf5\xa3[\xc4m\xa8;\xfa\xcdQc#\xc8\t\x8d\xf8\xcb8
\xadC\xb0\x1c\xe8\x8b\xfc\x9c\x87&K\xd4\xd8\x9c/`\xbd\x92\\
\xc2\xe0:\x13e\x8b\xc9\xd8,p{\xb1@\x80\xbf\xf50\xb8\x84a\x15
\x0cF\xe1\xa4\xea\r\x16\x12:e}Edc\x9e\xa4\xb8\x87u\x1e\xbf
\x17\xf8\\\xeb\x9e\x88\x7f^\xb7\xb1\xa7o{s\x00supriya"

1 个答案:

答案 0 :(得分:1)

您在加密上使用了PKCS1v1.5 padding。这样做可能很好,因为使用加密的人们通常希望并期望它提供安全性,尤其是机密性,并且几乎在所有情况下(显然包括您的情况)不加填充的RSA加密很容易被破坏并且不安全。在crypto.SX和security.SX上搜索“教科书RSA”或“ RSA无填充”,以查找很多问答。 (即使v1.5也不完美;在某些情况下,由于Bleichenbacher(也包含在那些Stacks上),它仍然容易受到自适应密文攻击,而OAEP是目前最好的标准填充。但是请放开。)

但是您没有在解密中使用它。因此,您的解密值包括v1.5加密填充,它是一个值为2的八位位组,与使RSA原语中使用的“编码消息”(EM)的正确大小所需的非零随机八位位组相同,即模数的大小,一个零字节,后面跟明文。您应该像在加密中一样,在解密中使用PKCS1_v1_5 (私钥除外)。