如果我们用AES密钥包装256位AES密钥,那么包装的密钥的大小可以超过32个字节吗?

She*_*ava 2 java encryption cryptography symmetric-key aes

我有一段代码用AES密钥包装对称密钥(AES):

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

码:

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);`
Run Code Online (Sandbox Code Playgroud)

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

key length: 32(key to be wrapped)
swkKey length: 32(key used to wrap)
wrappedAppKey size: 48(final wrapped key output).
Run Code Online (Sandbox Code Playgroud)

Maa*_*wes 5

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

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

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

但是,请记住,还需要能够重新生成IV / nonce,以进行GCM模式加密。因此,如果无法从上下文中重新生成它,则还需要存储它。还要注意的是,如果随机数曾经被用于同一包装密钥,则GCM模式将以可怕的方式中断。在大多数情况下,使用完全随机的随机数并因此将其与密文一起存储非常重要。对于GCM,强烈建议使用12字节的随机数,将密文扩展为60字节。

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