我使用RSA加密图像,Pillow用于逐字节读取。我正在加密每个128字节。但是,当我尝试将其解密时,生成的图像与原始图像不同。 这是我的代码:
from Crypto.PublicKey import RSA
from PIL import Image
def genearteRSAKeys(keyLength):
private = RSA.generate(keyLength)
public = private.publickey()
privateKey = private.exportKey()
publicKey = public.exportKey()
return privateKey, publicKey
def rsaEncrypt(pubKey, data):
publicKey = RSA.importKey(pubKey)
encryptData = publicKey.encrypt(data, "")
return encryptData
def rsaDecrypt(pivKey, data):
privateKey = RSA.importKey(pivKey)
decryptData = privateKey.decrypt(data)
return decryptData
im = Image.open("photo.jpg")
w, h = im.size
data = im.tobytes()
privateKey, publicKey = genearteRSAKeys(1024)
step = 128
block_cipher = []
for i in range(0, len(data), step):
encrypted = rsaEncrypt(publicKey, data[i:i+step])
block_cipher.append(''.join(encrypted))
data_cipher = ''.join(block_cipher)
img = Image.frombytes("RGB", (w, h), data_cipher)
img.save("photo2.jpg")
image = Image.open("photo2.jpg")
data_encrypt = image.tobytes()
block_plant =[]
for j in range(0, len(data_encrypt), step):
decrypted = rsaDecrypt(privateKey, data_encrypt[j:j+step])
block_plant.append(''.join(decrypted))
data_plant = ''.join(block_plant)
image2 = Image.frombytes("RGB", (w,h), data_plant)
image2.show()
为什么这段代码不起作用?
答案 0 :(得分:2)
RSA不用于加密大量字节。这是因为,首先,它非常无效,因为它需要大量的开销。你通常会使用混合密码系统来避免这个问题。
您正在使用的原始RSA是不安全的。但这不是造成这个问题的原因。已经陈述的问题是消息大于N,即模数。 N是以128字节编码的数字。但是因为它仍然无法加密那个大小的所有消息;如果在解释为大端无符号数时M大于N,则解密将失败。
例如,值为1000 1001
的无符号字节大于1000 0001
,但这两个值都适合8位。因此,具有该值的消息无法使用具有第二个值的模数的密钥进行加密。