2016-03-12 167 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"))