对于IETF RFC 3394中类似CMS的上下文,“AES密钥缠绕”算法的用途是什么?
只要看看算法(加到这篇文章的末尾),非正式地说,它闻起来很像一种“家酿”密码系统。它只在少数,有限的情况下使用。
检查文档中是否有任何设计原理,我在下面看到了以下说明:
本文档中的大部分文本摘自俄歇包。该文档的作者负责AES密钥包装算法的开发。
我已经检查了上游文件的理由。我能找到的最接近的东西是以下摘录;它的作者没有引用任何东西,除了“AES代码本”的原始定义。
将一个理想的伪随机排列近似成这样就足够了,其程度就像猜测AES引擎密钥一样不可能利用不受欢迎的现象。该密钥包装算法需要提供足够的安全性,以便在精心设计的密钥管理体系结构中保护密钥。
是否有任何理由(除了遗留系统兼容性)使用“AES-包装”作为密钥加密算法,而不是像GCM这样的通用模式?
def aes_wrap(kek, key_towrap, iv=b'\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6'):
"https://datatracker.ietf.org/doc/html/rfc3394.html#section-2.2.1"
if len(key_towrap) % 8 != 0:
raise NotImplementedError("IETF RFC 5649")
n = len(key_towrap)//8
A = iv
R = bytearray(key_towrap)
c = AES.new(kek, AES.MODE_ECB)
ctr = 0
for j in range(6):
for i in range(n):
ctr += 1
B = c.encrypt(A + R[i*8:i*8+8])
A = bxor(B[:8], ctr.to_bytes(8, 'big'))
R[i*8:i*8+8] = B[8:]
return A + R
def aes_unwrap(kek, wrapped_key, iv=b'\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6'):
"https://datatracker.ietf.org/doc/html/rfc3394.html#section-2.2.2"
n = len(wrapped_key)//8 - 1
if len(wrapped_key) % 8 != 0:
raise NotImplementedError("IETF RFC 5649")
R = bytearray(wrapped_key[8:])
A = bytes(wrapped_key[:8])
c = AES.new(kek, AES.MODE_ECB)
ctr = 6*n
for j in reversed(range(6)):
for i in reversed(range(n)):
B = c.decrypt(bxor(A, ctr.to_bytes(8, 'big')) + R[i*8:i*8+8])
A = B[:8]
R[i*8:i*8+8] = B[8:]
ctr -= 1
if A != iv:
raise ValueError("integrity check failed")
return bytes(R)
from operator import xor as _xor
from itertools import starmap as _starmap
def bxor(a, b):
return a.__class__(_starmap(_xor, zip(a, b, strict=True)))发布于 2023-05-11 23:32:59
NIST SP-800-38F有几个语句试图解释为什么:
KW、KWP和TKW旨在保护加密密钥的机密性和真实性/完整性。它们都提供了一个选项,用于以与保护一般数据的方法不同的方式保护密钥。将密钥与一般数据隔离可以提供额外的保护层。
但是,以下两段立即淡化了整个论点:
然而,不需要使用不同的加密方法来保护加密密钥。先前批准的认证-加密模式-以及批准的加密模式与认证方法的组合-被批准用于保护密码密钥,除了一般数据。同样,KW、KWP和TKW都被批准用于保护一般数据以及加密密钥。
在这一节的最后一段中,他们讨论了它的一些优点:
KW、KWP和TKW都是稳健的,因为即使输入数据的长度大于一个块,也可以期望每一位输出以非平凡的方式依赖于每一位输入。与其他经过身份验证的加密模式相比,此属性的实现代价是吞吐量大大降低,但这种权衡可能适合于某些密钥管理应用程序。例如,当要保护的密钥的长度大于底层分组密码的块大小时,或者当受保护数据的值非常高时,可能需要鲁棒方法。
密钥包装算法所做的一件事是指定一种经过身份验证的操作模式,这意味着如果数据损坏,该算法必须返回失败。这样,您就不能继续使用无效的密钥。
与附录B.2中的其他加密方法相比,与其他身份验证方法相比,这是一种相对优势:
相反,对于KW、KWP和TKW,没有单独的身份验证标记:相反,验证数据真实性所必需的信息嵌入在所有的密文位中。因此,对于这三种算法,如果不调用认证解密函数,就无法验证数据的真实性。
这意味着,通过使用AES-WRAP方法,您不能跳过身份验证步骤。这值点小东西。
https://security.stackexchange.com/questions/270194
复制相似问题