【问题标题】:How do you encrypt an image using CTR encryption?如何使用 CTR 加密对图像进行加密?
【发布时间】:2020-09-22 05:38:43
【问题描述】:

下午好,我正在尝试编写一个程序来读取 .bmp 文件并使用给定的初始值加密它,使用 ????????????和一次性便笺簿。

前 36 个字节构成图像的头部,没有加密,只是复制到新文件中

从 0x36 开始到末尾的图像数据被分组为四个字节的字,每个字使用 ???????????? 加密。

为避免更改图像大小,请勿包含 ????0=????????????在加密的图像中。

到目前为止,这就是我所拥有的:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Util import Counter

filename = "Image11.bmp"
filename_out = "Image11Encrypted.bmp"
key = 0xe0984dd3
bkey = key.to_bytes(32, 'big')
cipher = AES.new(bkey, AES.MODE_CTR, initial_value= 0xff128eff)

def encrypt(filename, filename_out, key):
    with open(filename, "rb") as f:
        clear = f.read()
    clear_trimmed = clear[64:-2]
    ciphertext = clear_trimmed
    ciphertext = cipher.encrypt(pad(clear_trimmed, 16))
    ciphertext = clear[0:64] + ciphertext + clear[-2:]
    with open(filename_out, "wb") as f:
        f.write(ciphertext)

encrypt(filename, filename_out, key)
print("Encrypted using AES in CTR mode and saved to \"" + filename_out + "\"")

但是,我一直遇到这个错误:

.

任何帮助都会很棒,不知道从哪里开始

【问题讨论】:

  • 代码和错误应该作为文本发布在这里,而不是图片
  • 文档建议counter 应该是Crypto.Util.Counter 类型,而不是数字(值为0xff128eff)。

标签: python encryption aes


【解决方案1】:

使用 PyCryptodome 配置 CTR 模式在here 中进行了描述。有两种方法可以指定计数器块:通过设置随机数(参数nonce)和起始值(参数initial_value)。如果没有指定nonce,则隐式生成一个块大小一半的随机nonce。

另一种方式是定义一个counter block object(参数counter),可以用来详细指定计数器块的组成部分(前缀、计数器、后缀)。

如果只指定起始值,则必须使用参数initial_value,而不是counter

cipher = AES.new(bkey, AES.MODE_CTR, initial_value=0xff128eff)

如上所述,这隐式创建了一个具有一半块大小的随机 nonce,可以通过cipher.nonce 确定。

请注意:该代码缺少解密所需的 16 字节 IV 的确定。 IV 由 nonce 和 counter 组成,通常放在密文之前的字节级别。
此外,根据问题,前 36 个字节不应加密,稍后说明数据从 0x36 开始(= 54) 并在代码中使用 64 作为数据的开头。这似乎不一致。

【讨论】:

  • 非常感谢,这解决了最初的问题。但是,我遇到了另一个未定义 AES 的问题。不确定当它已经被导入时它是如何定义的。我编辑了照片以匹配弹出的新错误
  • @MattStrayer - 首先,请回滚上一次更改并再次显示原始错误消息(最好是文本而不是屏幕截图/图像),否则后续读者会无法理解问题。然后提出一个新问题,或者,如果有对当前问题的引用,则在旧问题之后发布新信息并附上注释(UpdateEdit)。谢谢。
  • @MattStrayer - 请添加有关您的环境的信息:操作系统、IDE,尤其是您使用的 Python 和 PyCryptodome 版本。
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多