需要帮助来加密/解密图像

时间:2017-06-02 11:53:01

标签: python image encryption rsa pillow

我使用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()

为什么这段代码不起作用?

1 个答案:

答案 0 :(得分:2)

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

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

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