可以将密钥包装算法设想为使用 AES 作为轮函数的扩展Feistel 方案,并结合用作粗略MAC的运行状态。如果您查看算法定义,您将看到对于每轮s轮,更新一个 64 位数据块,其中包含一个 AES 调用和另一个 64 位块的组合函数。这些块也被“旋转”,以便下一轮更新另一个块,依此类推。这实际上类似于将在完整明文上运行的大块密码定义为单个“块”。
随着对称加密系统的发展,这个效率非常低,因为它涉及每个输入字节平均 1.5 次 AES 调用(12 次 64 位块的 AES 调用),而GCM每个输入字节仅使用 0.0625 次 AES 调用(一个 AES每个 128 位块)。它还需要多次处理每个输入字节,因此必须完全缓冲整个明文消息:这对于批量加密来说是不够的。
密钥包装算法旨在保护密钥,并且遭受了一些仪式性的过度杀伤:大量累积的 AES 调用希望它会产生如此多的加扰,结果会很强大。这不是一个糟糕的选择。如果我们把它看成一个扩展的 Feistel 密码,那么有一些经验数据,许多轮次会带来安全性。不过,这应该值得进行一些体面的分析,而且据我所知,这还没有发生。这可能与这种密钥包装算法在野外似乎没有被广泛使用的事实有关。
AES 密钥包装算法的良好属性包括:
它不需要随机性。随机性在许多嵌入式系统上是一种稀缺资源,因此拥有一个没有它的安全方案是很好的。
它不需要state。如果只保留一个计数器,则无需修改 EEPROM 或 Flash 位。
它是确定性的。这意味着用相同的密钥包装相同的明文将产生相同的字节序列。确定性大多是中立的,但偶尔在某些协议中很有用。
它使用单一原语,即“AES”:代码大小也是嵌入式系统上的稀缺资源。
它的大小开销很小:它只在输入大小上增加了 64 位,并且包含一个 MAC,所以这大约是可以实现的最小的。
不好的属性主要是这些: