使用Pycrypto进行图像加密和解密

6

如何使用Pycrypto python库加密图像?我在网上找到了一些文本加密示例,但是并没有找到相同的用于图像的。有人能帮我吗?


5
将该图像转换为“bytearray”格式,它将按预期工作。 - Patrick Haugh
1
AES加密不应该关心数据是英文文本还是二进制JPEG图像... - Aaron
1个回答

4

这与加密或解密文本完全相同。

示例

首先导入一些模块:

from Crypto.Cipher import AES
from Crypto import Random

生成一个密钥和初始化向量。
key = Random.new().read(AES.block_size)
iv = Random.new().read(AES.block_size)

加密

以下代码加载一个输入文件input.jpg并对其进行加密,然后将加密数据保存在encrypted.enc文件中。在此示例中,使用AES块密码和CFB操作模式。

input_file = open("input.jpg")
input_data = input_file.read()
input_file.close()

cfb_cipher = AES.new(key, AES.MODE_CFB, iv)
enc_data = cfb_cipher.encrypt(input_data)

enc_file = open("encrypted.enc", "w")
enc_file.write(enc_data)
enc_file.close()

解密

最后,以下代码加载加密文件encrypted.enc并对其进行解密,之后将解密数据保存到文件output.jpg中。

enc_file2 = open("encrypted.enc")
enc_data2 = enc_file2.read()
enc_file2.close()

cfb_decipher = AES.new(key, AES.MODE_CFB, iv)
plain_data = cfb_decipher.decrypt(enc_data2)

output_file = open("output.jpg", "w")
output_file.write(plain_data)
output_file.close()

注意

为了简化,加密和解密在同一Python会话中进行,因此变量keyiv被立即重复使用,要测试此解决方案,您需要在同一Python会话中进行加密和解密。当然,如果您想稍后在单独的会话中解密,您需要保存keyiv,并在需要解密时重新加载它们。

测试解决方案

现在,您可以打开output.jpg文件,您应该看到与input.jpg中相同的图像。


我正在尝试做类似的事情,但是无法将图像转换为字节数据,甚至无法通过您的代码读取它,因为它会出现“utf-8”编解码器无法解码位置0处的字节0xff:无效的起始字节的错误。你能简单介绍一下吗? - Siddharth Choudhary
您的代码中输入的图像出现错误。 - user311790
@user311790 是什么错误?在我的电脑和解释器上都可以完美运行。你的图像命名为 input.jpg 吗?你使用的是哪个Python版本(2还是3)?你的机器上安装了PyCrypto吗? - Kubuntuer82
Python 2.7.15,已安装pycryptodome,代码可以运行但输出的图像无法打开。 - user311790
请注意,在答案中,“输出文件”指的是 output.jpg 而不是 encrypted.enc... 文件 output.jpg 是未加密的,仅用于测试加密的正确性,它应该能够打开并且与 input.jpg 完全相同(我也使用了 diff 工具进行了测试)。文件 encrypted.enc 无法打开,因为它已经被加密,所以如果您将其视为输出文件,则预计它无法打开。 - Kubuntuer82
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接