2016-03-12 126 views
0

我一直在尝试使用pycrypto中的RSA加密Python中的数据。我试图在这里按照指示:http://www.laurentluce.com/posts/python-and-cryptography-with-pycrypto/但这里是出来当我打电话enc_data = public_key.encrypt('abcdefgh', 32)如何使用pycrypto和RSA加密(和解密)数据?

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    enc_data = public_key.encrypt('abcdefgh', 32) 
    File "C:\Python35\lib\site-packages\Crypto\PublicKey\RSA.py", line 150, in encrypt 
    return pubkey.pubkey.encrypt(self, plaintext, K) 
    File "C:\Python35\lib\site-packages\Crypto\PublicKey\pubkey.py", line 75, in encrypt 
    ciphertext=self._encrypt(plaintext, K) 
    File "C:\Python35\lib\site-packages\Crypto\PublicKey\RSA.py", line 224, in _encrypt 
    return (self.key._encrypt(c),) 
    File "C:\Python35\lib\site-packages\Crypto\PublicKey\_slowmath.py", line 65, in _encrypt 
    return pow(m, self.e, self.n) 
TypeError: unsupported operand type(s) for pow(): 'str', 'int', 'int' 

预先感谢对这个问题的任何意见。

+0

你为什么要使用RSA加密数据? – zaph

+0

请不要使用教科书(unpadded)RSA,因为它非常不安全。看看['Crypto.Cipher.PKCS1_OAEP'](https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.PKCS1_OAEP-module.html)。 –

回答

2

如果你看一下encrypt方法:

plaintext(字节串或长) - 数据片与RSA加密。它可能不是数字上大于RSA模块(n)。

您的数据不是字节字符串或长。

还要注意:

注意:此功能进行简单的,原始的RSA加密(教材)。在实际的应用程序中,您始终需要使用适当的加密填充,并且不应该使用此方法直接加密数据。不这样做可能会导致安全漏洞。建议使用模块Crypto.Cipher.PKCS1_OAEPCrypto.Cipher.PKCS1_v1_5代替。请注意,您还需要通过对文本进行编码来将这些函数转换为字节数组。

请注意,明文只是密码原语的输入。所有现代密码都以字节为单位进行操作。从历史上看,输入可能是实际的文本,但不再是。

-1

在一个例子:

from Crypto.PublicKey import RSA 
from Crypto import Random 
random_generator = Random.new().read 
key = RSA.generate(1024, random_generator) 

public_key = key.publickey() 
print(public_key) 
enc_data = public_key.encrypt('abcdefgh'.encode("utf-8"), 32) 

print(enc_data) 
print(key.decrypt(enc_data).decode("utf-8"))