【问题标题】:Need help to encrypt/decrypt images需要帮助加密/解密图像
【发布时间】:2017-11-03 19:51:47
【问题描述】:

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

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

【问题讨论】:

  • 谁能解释一下为什么这个问题被否决了这么多?没看懂
  • @BPL 因为你没有对预期的行为给出很多解释,看起来你只是希望我们更正你的代码,而不是试图自己做。请注意,我说的是“它看起来像”。
  • 你能把图片链接(加密/解密之前,之后)吗?
  • RSA 不支持批量加密,因此库不支持加密大于密钥长度允许的消息。使用为批量加密设计的对称算法,如 AES。如果您确实需要来自 RSA 的两个密钥,您可以使用 Hybrid Encryption 获取

标签: python image encryption rsa pillow


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多