分组密码工作模式

在密码学中,分组密码(如 AES)用于加密一个固定大小(如 128 位)的数据块。输入分组与加密输出分组通常大小相同,而密钥长度可能不同。

流密码更加灵活:它们用于加密任意大小的数据(如 PDF 文档),这些数据有时会以的形式到达(字节或帧序列,例如视频流)。

大多数流行的对称密钥加密算法都是分组密码,但密码学家提出了多种将分组密码转换为流密码的方案,从而能够加密任意大小的数据。这些方案称为“分组密码工作模式”,适用于 AESRC6CamelliaSerpent 等大多数分组密码。

对称密码分组密码工作模式结合后,所得密码构造以密码名称、分组模式和密钥大小来表示。例如:

  • AES-256-GCM——使用 256 位加密密钥和 GCM 分组模式的 AES 密码
  • AES-128-CTR——使用 128 位加密密钥和 CTR 分组模式的 AES 密码
  • Serpent-128-CBC——使用 128 位加密密钥和 CBC 分组模式的 Serpent 密码

分组密码模式(CBC、CTR、GCM 等)

分组密码模式(如 CBC、CFB、OFB、CTR、EAX、CCM 和 GCM)的核心思想,是重复应用密码的单分组加密/解密,以安全地加密/解密大于一个分组的数据。

某些分组模式(如 CBC)要求将输入拆分为多个分组,并使用填充算法(例如添加特殊填充字符)把最后一个分组填充到分组大小。其他分组模式(如 CTR、CFB、OFB、CCM、EAX 和 GCM)则完全不需要填充,因为它们在每一步都对部分明文与密码内部状态执行 XOR。

基本上,加密大型输入数据的过程如下:先使用加密密钥 + 随机盐初始化加密算法的状态,再加密第一部分数据(如一个分组或分组的一部分),然后使用加密密钥及其他参数转换加密状态;接着加密下一部分,再次转换加密状态并加密下一部分,如此反复,直至处理完全部输入数据。解密的工作方式非常相似。

为了正确使用“分组密码工作模式”,开发者应了解以下内容:

  • 常用的安全分组模式包括 CBC(密码分组链接)、CTR(计数器)和 GCM(伽罗瓦/计数器模式)。它们在开始时需要一个随机(不可预测)的初始化向量IV),也称为 nonce
  • 在大多数情况下,“计数器(CTR)”分组模式都是一个好选择,因为它安全性强、支持任意输入数据长度(无需填充),并具备并行处理能力。它只提供加密,不提供认证和完整性保护。
  • GCM(伽罗瓦/计数器模式)分组模式兼具 CTR 模式的所有优点,并增加了消息认证(生成密码学消息认证标签)。GCM 是在对称密码中实现认证加密的快速高效方式,在一般情况下强烈推荐使用。
  • CBC 模式以固定大小的分组工作。因此,将输入数据拆分为分组后,应使用填充算法让最后一个分组达到相同长度。大多数应用使用 PKCS7 填充方案#PKCS#5_and_PKCS#7)或 ANSI X.923#ANSI_X.923)。在某些场景下,CBC 分组模式可能容易受到“填充预言机”攻击,因此最好避免使用 CBC 模式
  • 一种众所周知的不安全分组模式ECB(电子密码本),它会把相同的输入分组加密成相同的输出分组(不提供密码学扩散)。不要使用它!它可能使整个加密失去安全性。
  • CBCCTRGCM 等大多数分组模式都支持“随机访问”解密(例如在视频播放器中跳转到任意时间点,播放加密视频流)。

CTR(计数器)分组模式

下图展示了使用分组密码时,明文的各个部分(分组)如何在 CTR 分组模式下依次加密:

对于 CTR 模式中的每个分组,都会根据初始化向量(IV,有时称为“nonce”)+ 当前计数器(01、02、03 等)+ 秘密加密密钥生成一个新的不可预测密钥流分组,并将输入分组与当前密钥流分组执行 XOR,得到输出分组。在 CTR 模式下,输入数据的最后一部分可以短于密码分组大小,因此无需填充。输入数据(加密前)与输出数据(加密后)的长度相同

GCM(伽罗瓦/计数器)分组模式

下图直观说明了 GCM 分组模式(伽罗瓦/计数器模式)的工作原理:

GCM 模式使用一个计数器,每处理一个分组便递增一次,并通过 GHASH 对全部密文分组和关联数据进行聚合认证,最终生成消息认证标签(MAC 码)。与所有计数器模式一样,GCM 以流密码方式工作,因此必须在每个待加密数据流的开始处使用不同的 IV

选择分组密码模式

建议将 CTR(计数器)或 GCM(伽罗瓦/计数器)分组模式与 AESRC6CamelliaSerpent 等对称密码结合使用。其他模式在某些情况下可能有用,但其中一些安全性较低,因此只有在充分了解其原理时才应使用。

CTRGCM 加密模式有许多优点:它们安全(目前没有已知的重大缺陷),无需填充即可加密任意长度的数据,可以在多核 CPU 上并行加密和解密分组,并能对加密分组进行随机(无序)访问。因此,它们适合加密加密货币钱包、文档和流媒体视频(用户可以按时间跳转)。GCM 还提供消息认证,是一般情况下推荐的分组密码模式

请注意,GCMCTR 及其他分组模式会泄露原始消息的长度。明文消息与密文长度相同。如果不想泄露原始明文长度,可以在加密前向明文添加一些随机字节,并在解密后将其删除(这相当于某种填充)。

初始化向量(IV)

为每条加密消息使用随机且不可预测的 IV(nonce)。使用相同的对称密钥和相同的 IV 加密多条消息是一个常见错误,这会让大多数分组模式遭受各种密码攻击。IV 的大小应与密码分组大小相同,例如 AES、Serpent 和 Camellia 使用 128 位 IV。

对于 GCM 模式,IV 无需保密或不可预测,但必须每条消息各不相同

认证加密

在密码学中,“认证加密”(AE)是指一种在加密数据的同时计算认证码(认证标签/MAC)的方案,用于提供消息真实性完整性。使用认证加密方案后,解密时便可得知解密是否成功(即解密密钥/密码是否正确,以及加密数据是否未被篡改)。

认证加密(AE)与类似概念带关联数据的认证加密AEAD)相关,后者是 AE 的更安全变体。AEAD 将关联数据(AD)与密文及其预期出现的上下文绑定,从而可以检测并拒绝把有效密文“剪切粘贴”到不同上下文的尝试。AEAD 用于加密与未加密数据混合使用的场景(例如加密网络协议),并确保整个数据流都经过认证和完整性保护。换言之,AEAD 增加了检查某些未加密的关联数据(AD,也称“附加认证数据”(AAD))完整性与真实性的能力。

某些加密方案(如 ChaCha20-Poly1305AES-GCM)提供集成认证加密(AEAD),而其他方案(如 AES-CBCAES-CTR)则需要按需额外添加认证。

results matching ""

    No results matching ""