AES 本身具有三种变体:AES-128、AES-192 和 AES-256。在内部,算法具有非常相似的结构。该数字是密钥的长度(以位为单位),即预先安排的秘密的长度(AES 是共享秘密密码)。更大的数字不仅意味着更长的密钥,而且还意味着使用密钥和输入完成更多的工作以产生输出。
这三种算法中的每一种都指定了两个函数encrypt
和decrypt
;这两个函数都将一个称为键的n位值(n = 128、192 或 256)作为输入,将一个称为输入块的 128 位值作为输入,并产生一个称为输出块的 128 位值作为输出。输入块encrypt
称为明文,输出块称为密文;对于decrypt
,角色互换。
encrypt(key, plaintext) = ciphertext
decrypt(key, ciphertext) = plaintext
AES 是一种分组密码。它仅指定如何加密或解密 128 位块。如果您的数据比这更短或更长,您需要更复杂的东西:您需要有一种
操作模式,通常称为链接模式,因为它指定如何一个接一个地处理一个块。链接模式的选择很大程度上独立于块处理算法的选择。
一些链接模式只需要键和输入。例如,最简单的模式ECB只是说将输入切割成适当大小的块,应用加密/解密算法,并将输出块粘贴在一起。这种模式有很多缺陷(例如,如果它们与块边界对齐,您可以在输入中发现重复;您可以判断两个加密消息是否相同,因为它们具有相同的密文)。
许多链接模式需要额外的输入,通常是一个块大小。它通常以某种方式与第一个输入块混合,称为初始化向量(通常缩写为IV)。IV 通常是随机选择的;这是某些模式的要求,而对于其他模式,永远不要为相同的密钥选择相同的 IV 两次就足够了(随机抽取确保了这一点)。IV 用于(至少)使具有相同密钥的相同明文的两次加密不同。使用随机 IV 的流行模式是CBC。另一种流行的模式是CTR(计数器);它的 IV 更恰当地称为nonce,因为它不必是随机的,只需不重复。
仅当输入是块大小的倍数时,才将输入分解为块。否则,通常的过程是在开始时拆分尽可能多的块,并对最后的部分块应用填充方案。尽管填充往往意味着添加一些位来组成一个完整的块,但安全填充并不是那么简单:带有一些填充P的部分块B有与恰好是BP的完整块混淆的风险. 好的填充方案必须对所有消息应用一些填充,即使是那些恰好是确切数量的块的消息。一些操作模式强制使用特定的填充方案,而其他操作模式与填充无关。加密库通常要求块密码函数的输入仅为完整块,将填充任务留给调用者。
有些模式可以用分组密码制作加密/解密算法以外的东西。CMAC等模式制作消息验证码,即基于共享秘密的签名。GCM等模式既加密又签名( AES- n -GCM-encrypt(key, IV, tag, plaintext) 的输出既是密文又是 MAC)。