2017-06-02 69 views
-5

我正在使用RSA加密图像和枕头以逐字节读取它。我正在加密每个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

任何人都可以解释为什么这个问题已经downvoted如此艰难?我不明白 – BPL

+0

@BPL因为你没有给出关于预期行为的很多解释,而且看起来你只是希望我们纠正你的代码,而不用自己去做。请注意,我说“它**看起来像**”。 –

+0

你可以链接图片(加密/解密之前,之后)吗? –

回答

2

RSA不用于加密大量的字节。这是因为,首先,这是非常无效的,因为它需要很多开销。你通常会使用混合密码系统来避免这个问题。

正在使用的原始RSA不安全。但那不是造成这个问题的原因。如前所述,问题是消息大于N,模数。 N是以128字节编码的数字。但是由于它仍然无法加密所有这种尺寸的消息,如果解释为大端无符号数时M大于N,则解密将失败。

例如,值为1000 1001的无符号字节大于1000 0001,但两个值均适合8位。因此具有该值的消息不能用具有第二值的模数的密钥加密。