Python AES CTR

2024 年 8 月 29 日 | 阅读 6 分钟

你不需要解密每个字节就能获取中间的一些信息。使用 AES CTR 模式时,我们使用提供的加密密钥和 IV 生成一些随机位。我们使用这些随机位与我们的字符串进行异或运算。这会生成一个随机文本。

在理解 Python 中的 AES CTR 模式之前,我们首先应该理解 Python Pycrypto 如何使用 AES 进行解密和加密。

  • 生成密钥。
  • 初始化向量。
  • 使用 AES 加密。
  • 使用 AES 解密。
  • 基于 AES 的文件加密。在第 6.1 节中写入文件大小。应保存初始化向量。6.3. 修改最终块。
  • 基于 AES 的文件解密。

CTR 模式

CTR(计数器缩写)是一种常见的 AES 分组密码模式,它允许所有操作并行执行。由于 CTR 还包括将一系列填充向量与明文和密文块进行异或运算,因此它与 OFB 相似。主要区别在于这些填充向量的生成方式。

众所周知,AES 密码库使用 AES256-CBC 来加密和解密数据。

在计算机安全方面,加密是保护数据的最佳技术之一。此外,还有许多种类的加密。

CTR AES

AES 加密有一种计数器模式,称为 CTR。它也称为 ICM 和 SIC。

在 AES 加密中,你有一个称为初始化向量(简称 IV)的东西。这通常是一个随机的 128 位输入。在 CTR 模式下,IV 有两个组成部分。前 8 个字节是常规的随机 IV。最后 8 个字节是一个计数器。这个计数器是一个 0 索引,表示你可以访问的加密数据的 128 位块的数量。当加密 512 位数据(64 字节)时,数据中 0 字节处的起始位置计数器为 0;在 16 字节处,计数器为 1;在 32 字节处,计数器高达 2。

以这种方式继续,直到用完所有信息。与标准 AES 加密不同,这种加密可以搜索信息。你不需要解密每个字节就能获取中间的一些信息。

使用 AES CTR 模式时,我们使用提供的加密密钥和 IV 生成一些随机位。我们使用这些随机位与我们的字符串进行异或运算。这会生成一个随机文本。我们只需将文本与我们使用加密密钥和 IV 生成的相同随机位进行异或运算即可解密它们。

模块中 AES 支持的操作模式的常量

  • var MODE_ECB: 电子密码本 (ECB)
  • var MODE_CBC: 密码块链接 (CBC)
  • var MODE_CCM: 带 CBC-MAC 的计数器 (CCM) 模式
  • var MODE_OCB: 偏移量密码本 (OCB)
  • var MODE_CFB: 密码反馈 (CFB)
  • var MODE_OFB: 输出反馈 (OFB)
  • var MODE_CTR: 计数器模式 (CTR)
  • var MODE_OPENPGP: OpenPGP 模式
  • var MODE_EAX: EAX 模式
  • var MODE_GCM: Galois/计数器模式 (GCM)
  • var MODE_SIV: 合成初始化向量 (SIV)

创建新 AES 密码的语法

参数

1. 密钥 (Key): 密钥参数的值为字节、字节数组或内存视图类型。

用作对称密码中的密钥。

必须使用 16、24 或 32 字节(分别用于 AES-128、AES-192 或 AES-256)。

仅当使用 MODE_SIV 时,它才翻倍到 32、48 或 64 字节。

2. 模式 (Mode): 要使用的加密或解密链模式。

关键字参数

1. iv: 参数的预期值类型:字节、字节数组或内存视图。

仅适用于模式:MODE_OPENPGP、MODE_OFB、MODE_CFB 和 MODE_CBC。

在 MODE_OPENPGP 模式下,加密时必须为 16 字节长,解密时必须为 18 字节长(在后一种情况下,它实际上是密文前缀的加密 IV)。

对于 MODE_CBC、MODE_CFB 和 MODE_OFB,它必须是 16 字节长。

如果未输入任何内容,则会构造一个随机字节字符串(然后你必须使用 iv 属性读取其值)。

2. nonce: 参数的预期值类型:字节、字节数组或内存视图。

仅适用于模式:MODE_EAX、MODE_CCM、MODE_GCM、MODE_OCB、MODE_SIV 和 MODE_CTR,该值不能再次用于此密钥在任何其他上下文中的加密。

对于 MODE_EAX、MODE_GCM 和 MODE_SIV 没有长度限制(推荐:16 字节)。

其长度必须在 [7..13] 之间才能与 MODE_CCM 兼容。请记住,在使用 CCM 时,nonce 长度和最大消息大小之间存在权衡。建议使用 11 字节。

对于 MODE_OCB,其长度必须在 [1..15] 范围内(推荐:15)。

对于 MODE_CTR,其长度必须在 [0..15] 范围内(推荐:8)。

对于 MODE_SIV,nonce 是可选的;如果未提供,则不使用 nonce,使加密具有确定性。

对于 MODE SIV 以外的模式,如果未提供,则使用建议长度的随机字节字符串(之后,你必须使用 nonce 属性读取其值)。

3. segment_size: 参数的预期值类型:整数

仅适用于模式:MODE_CFB,明文和密文之间的比特数。必须是 8 的倍数。如果未另行说明,则视为 8。

4. mac_len: 参数的预期值类型:整数

仅适用于模式:MODE_EAX、MODE_GCM、MODE_OCB 和 MODE_CCM,认证标签的字节长度。

它必须在 [4..16] 范围内且为偶数。建议值为 16(如果未给出,则也作为默认值)。

5. msg_len: 参数的预期值类型:整数

仅适用于模式:MODE_CCM,必须(解)密的邮件长度。如果未提供,则在调用加密时必须传递完整消息。与加密一样,解密只能使用一次。

6. assoc_len: 参数的预期值类型:整数

仅适用于模式:MODE_CCM,相关信息的长度。如果未提供任何内容,所有连接的数据都会在内部缓冲,这对于特别大的消息可能会出现问题。

7. initial_value: 参数的预期值类型:整数、字节、字节数组或内存视图。

仅适用于模式:MODE_CTR,计数器的起始点值。如果缺失,密码将从 0 开始计数。对于每个块,该值增加 1。计数器数字以大端模式编码。

8. counter: 一个计数器块,可通过 Crypto.Util.Counter 实例完全自定义。

nonce 和 initial_value 参数不能同时使用。

9. use_aesni: Intel AES-NI 硬件扩展使用此功能(如果可用,则使用默认值)。

返回

它返回一个具有所需模式的 AES 对象。

创建新 CTR 密码的语法

计数器块的长度等于密码块的大小(例如,AES 为 16 字节)。它由两部分的连接组成

  • 启动时设置的固定 nonce。
  • 每个附加计数器块增加 1 的可变计数器。计数器以大端编码。

在 Crypto.Cipher 的组件级别,使用 new() 函数为适当的基本算法创建一个新的 CTR 密码对象。以下定义中的算法可以是 AES

它使用基本密码学 <算法> 创建一个新 CTR 对象。

参数

以下是 CTR 密码的参数。

  1. 密钥 (Key): 密码的秘密
  2. 模式 (Mode): 常量是 Crypto.Cipher。<算法>.MODE_CTR
  3. Nonce: 固定 nonce 的值。对于组合消息/密钥,它必须是不同的。其长度范围从零到小于块大小一。如果不存在,库会生成一个长度为块大小/2 的随机 nonce。
  4. Initial_value: 第一个计数器块中计数器的值。它可以是整数或一组字节(与整数相同,只是大端编码)。除非另有说明,否则计数器从 0 开始。
  5. Counter: 使用 Crypto.Util.Counter.new 创建唯一的计数器对象 ()。这使得可以定义一个具有额外复杂性的计数器块。

返回值

它返回一个 CTR 密码的对象。

CTR 密码对象的 encrypt() 和 decrypt() 函数接受任意长度的数据(即不需要填充)。一旦计数器完成一个完整的旋转并重复初始值,两者都会抛出 OverflowError 异常。

CTR 密码对象上有一个名为 nonce 的只读属性(字节)。

结论

在本文中,我们讨论了 Python 中的 AES CTR 模式,但首先,我们必须了解 Python Pycrypto 如何使用 AES 进行解密和加密。我们还讨论了创建新 AES 密码和新 CTR 密码的语法和参数。


下一主题Curdir Python