AES 加密/解密

这里是对每个 AES 加密模式的简要解释以及其区别、限制和要求,以及每种模式对于初始向量(IV)的长度要求:

  1. CBC(Cipher Block Chaining):

    • 区别: 每个明文块与前一个密文块进行异或运算后再进行加密。
    • 限制和要求: 需要一个初始向量(IV),每个块的大小固定,不能并行加密或解密。
    • 安全性: 需要随机生成的 IV,且每个块的加密都依赖于前一个块,提供较好的安全性。
    • IV 长度要求: 与加密算法的块大小相同,通常为 128 位(16 字节)。
    • 密钥长度要求: CBC 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。
  2. CTR(Counter):

    • 区别: 使用加密后的计数器值与明文进行异或运算,然后再进行加密。
    • 限制和要求: 需要一个初始向量(IV),可以并行加密或解密,需要保证计数器值不会重复。
    • 安全性: 可以提供较好的安全性,但需要注意确保计数器值的唯一性。
    • IV 长度要求: 与加密算法的块大小相同,通常为 128 位(16 字节)。
    • 密钥长度要求: CTR 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。
  3. ECB(Electronic Codebook):

    • 区别: 将每个明文块独立加密,不同的明文块使用相同的密钥和算法进行加密。
    • 限制和要求: 不需要初始向量,每个块的加密都是独立的,不提供语义安全性。
    • 安全性: 由于相同的明文块会得到相同的密文块,因此容易受到重放攻击和其他攻击。
    • IV 长度要求: 不需要 IV,因为 ECB 模式下每个块都是独立加密的。
    • 密钥长度要求: ECB 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。v
  4. CFB(Cipher Feedback):

    • 区别: 使用前一个密文块作为加密算法的输入,然后再与明文进行异或运算。
    • 限制和要求: 需要一个初始向量(IV),可以并行加密或解密,块大小可变。
    • 安全性: 与 CBC 类似,但由于反馈机制的存在,可以对部分明文进行解密而不需要完整的密文。
    • IV 长度要求: 与加密算法的块大小相同,通常为 128 位(16 字节)。
    • 密钥长度要求: CFB 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。
  5. OFB(Output Feedback):

    • 区别: 使用前一个输出块作为加密算法的输入,然后再与明文进行异或运算。
    • 限制和要求: 需要一个初始向量(IV),可以并行加密或解密,块大小可变。
    • 安全性: 与 ECB 类似,不提供语义安全性,但可以用于流加密。
    • IV 长度要求: 与加密算法的块大小相同,通常为 128 位(16 字节)。
    • 密钥长度要求: OFB 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。
  6. GCM(Galois/Counter Mode):

    • 区别: 使用 CTR 模式进行加密,然后使用 GHASH 进行消息认证。
    • 限制和要求: 需要一个唯一的 IV,提供数据完整性检查和加密。
    • 安全性: 提供较高的安全性,但需要确保 IV 的唯一性和保密性。
    • IV 长度要求: 通常为 96 位(12 字节),但也可以是其他长度。
    • 密钥长度要求: GCM 模式使用的密钥长度可以是 128 位、192 位或 256 位,与 AES 加密算法本身的密钥长度相同。

这里是对 Hex、String 和 Base64 的简要解释以及它们的区别和要求:

Hex(十六进制):

  • 区别: 使用 16 个字符(0-9 和 A-F)表示一个字节的值,通常以 0x 开头。
  • 要求: 只能表示二进制数据,每个字节对应两个十六进制字符,数据长度增加一倍。
  • 用途: 常用于表示二进制数据的字符串形式,例如编程中的字节流、哈希值等。

String(字符串):

  • 区别: 使用可打印字符集(如 ASCII、UTF-8)表示文本数据,通常由字符组成。
  • 要求: 字符串长度取决于字符编码和实际字符数量,可以包含文本、数字、特殊字符等。
  • 用途: 用于表示文本信息,例如文档、配置、用户输入等。

Base64:

  • 区别: 使用 64 个字符(A-Z、a-z、0-9、+、/)表示二进制数据,每 3 个字节转换为 4 个 Base64 字符。
  • 要求: 编码后的字符串长度通常比原始二进制数据稍长,但更适合在文本协议中传输或存储二进制数据。
  • 用途: 常用于在文本协议中嵌入二进制数据,例如在 HTML、XML、JSON、URL 参数中传递图片、音频、视频等二进制内容。