gpt4 book ai didi

java - 如果我们用 AES key 包装 256 位 AES key ,那么包装 key 的大小可以超过 32 字节?

转载 作者:行者123 更新时间:2023-11-30 06:02:24 26 4
gpt4 key购买 nike

我有一段代码,我用 AES key 包装我的对称 key (AES):

  1. swkKey:这是用于包装的 AES key 。
  2. key:要包装的key。

代码:

SecretKey swkKeySpec = new SecretKeySpec(swkKey, 0, swkKey.length, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
final int ivLength = 12;
final IvParameterSpec iv = createIV(ivLength);///Creates a new array.
cipher.init(Cipher.WRAP_MODE, swkKeySpec, iv);
SecretKey sKeySpec = new SecretKeySpec(key, 0, key.length, "AES");
byte[] wrappedAppKey = cipher.wrap(sKeySpec);`

如果 key 是 256 位且 swkkey 是 256 位,wrappedAppKey 的长度是多少?包装 key 可以超过 32 个字节吗?请注意,在这种情况下,我会收到以下日志:

key length: 32(key to be wrapped)
swkKey length: 32(key used to wrap)
wrappedAppKey size: 48(final wrapped key output).

最佳答案

使用标准操作模式的包装 key 只是对 key 的编码数据进行加密。由于 AES key 的编码数据与原始数据相同,因此 256 位 key 的数据仅为 32 字节。

这些非专用模式(例如 GCM/CBC/ECB)的主要区别在于 key 字节的处理方式:它们直接在 SecretKey 实例中使用,而不是作为字节返回。这一点非常重要,特别是如果操作是在硬件(智能卡、HSM、TPM)而不是软件中执行的;然后可以在专用设备中保存/保护包装 key 的字节。

GCM 在底层使用 CTR 模式,这是一种流操作模式。流操作模式不需要明文的填充,因此密文也将只是 32 字节。 Java 还将身份验证标记 (t) 包括在计算中。默认情况下,GCM 使用最大身份验证标签大小,即 16 个字节,因此将其添加到 key 本身的密文中,剩下 48 个字节。可以使用更专业的 GCMParameterSpec 类而不是 ivParameterSpec 来配置标签大小;请注意,较小的标签大小可能会为 GCM 模式引入漏洞。

但是,请记住,还需要能够为 GCM 模式加密重新生成 IV/nonce。所以如果它不能从上下文中重新生成,你也需要存储它。还请注意,如果 nonce 被重复用于相同的包装 key ,GCM 模式会以一种可怕的方式中断。大多数时候使用完全随机的随机数,因此将其与密文一起存储非常重要。对于 GCM,强烈建议使用 12 字节的随机数,将密文扩展到 60 字节。

也可以使用 SIV 模式或 GCM-SIV 模式。这些模式使用身份验证标签作为“合成”IV。这使得加密具有确定性(相同的明文导致相同的密文)。由于 key 本身应该是随机的,因此它们对于这类模式非常有用,因为它们不需要使用 RNG 或存储 IV。不幸的是,通用加密库通常不包含这些模式的实现。

关于java - 如果我们用 AES key 包装 256 位 AES key ,那么包装 key 的大小可以超过 32 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com