首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“AES密钥缠绕”算法的意义是什么?

“AES密钥缠绕”算法的意义是什么?
EN

Security用户
提问于 2023-05-11 19:18:47
回答 1查看 55关注 0票数 1

对于IETF RFC 3394中类似CMS的上下文,“AES密钥缠绕”算法的用途是什么?

只要看看算法(加到这篇文章的末尾),非正式地说,它闻起来很像一种“家酿”密码系统。它只在少数,有限的情况下使用。

检查文档中是否有任何设计原理,我在下面看到了以下说明:

本文档中的大部分文本摘自俄歇包。该文档的作者负责AES密钥包装算法的开发。

我已经检查了上游文件的理由。我能找到的最接近的东西是以下摘录;它的作者没有引用任何东西,除了“AES代码本”的原始定义。

将一个理想的伪随机排列近似成这样就足够了,其程度就像猜测AES引擎密钥一样不可能利用不受欢迎的现象。该密钥包装算法需要提供足够的安全性,以便在精心设计的密钥管理体系结构中保护密钥。

是否有任何理由(除了遗留系统兼容性)使用“AES-包装”作为密钥加密算法,而不是像GCM这样的通用模式?

代码语言:javascript
复制
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)))
EN

回答 1

Security用户

发布于 2023-05-11 23:32:59

NIST SP-800-38F有几个语句试图解释为什么:

  • 第3.1节概述了这一点(重点是地雷):

KW、KWP和TKW旨在保护加密密钥的机密性和真实性/完整性。它们都提供了一个选项,用于以与保护一般数据的方法不同的方式保护密钥。将密钥与一般数据隔离可以提供额外的保护层。

但是,以下两段立即淡化了整个论点:

然而,不需要使用不同的加密方法来保护加密密钥。先前批准的认证-加密模式-以及批准的加密模式与认证方法的组合-被批准用于保护密码密钥,除了一般数据。同样,KW、KWP和TKW都被批准用于保护一般数据以及加密密钥。

在这一节的最后一段中,他们讨论了它的一些优点:

KW、KWP和TKW都是稳健的,因为即使输入数据的长度大于一个块,也可以期望每一位输出以非平凡的方式依赖于每一位输入。与其他经过身份验证的加密模式相比,此属性的实现代价是吞吐量大大降低,但这种权衡可能适合于某些密钥管理应用程序。例如,当要保护的密钥的长度大于底层分组密码的块大小时,或者当受保护数据的值非常高时,可能需要鲁棒方法。

密钥包装算法所做的一件事是指定一种经过身份验证的操作模式,这意味着如果数据损坏,该算法必须返回失败。这样,您就不能继续使用无效的密钥。

与附录B.2中的其他加密方法相比,与其他身份验证方法相比,这是一种相对优势:

相反,对于KW、KWP和TKW,没有单独的身份验证标记:相反,验证数据真实性所必需的信息嵌入在所有的密文位中。因此,对于这三种算法,如果不调用认证解密函数,就无法验证数据的真实性。

这意味着,通过使用AES-WRAP方法,您不能跳过身份验证步骤。这值点小东西。

票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/270194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档