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

Java 若我们用AES密钥包装256位AES密钥,那个么包装密钥的大小可以超过32字节?,java,encryption,cryptography,aes,symmetric-key,Java,Encryption,Cryptography,Aes,Symmetric Key,我有一段代码,其中我用AES密钥包装我的对称密钥(AES): swkKey:这是用于包装的AES密钥 键:要包装的键 代码: 若密钥为256位,swkkey为256位,wrappedAppKey的长度是多少。包装密钥是否可以超过32字节? 请注意,在这种情况下,我将获得以下日志: key length: 32(key to be wrapped) swkKey length: 32(key used to wrap) wrappedAppKey size: 48(final wrapped ke

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

  • swkKey:这是用于包装的AES密钥
  • :要包装的键
  • 代码:

    若密钥为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).
    

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

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

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

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


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

    欢迎使用StackOverflow!您的问题似乎有自己的答案(48个字节;尽管这让我有点困惑,但我希望它能够实现RFC3394,它的输出应该是40个字节;密钥长度+1个半块)。当你说“超过32位”时,你的意思是“超过32字节吗?”你的问题是“为什么包装的密钥比原始密钥长?”作为一个不相关的注释,在你阅读的任何文档中,你所称的swkKey通常被称为KEK(密钥加密密钥),或者当然是“包装密钥”。
    key length: 32(key to be wrapped)
    swkKey length: 32(key used to wrap)
    wrappedAppKey size: 48(final wrapped key output).