测试使用RSA加密AES密钥时,我意识到 RSA只有一个块,并且大小有限(由程序员设置)来存储加密后的密钥。 问题是,当我使用:
KeyGenerator.getInstance("AES").generateKey()
AES密钥在每台计算机和JVM实现中都具有固定的大小吗?
测试使用RSA加密AES密钥时,我意识到 RSA只有一个块,并且大小有限(由程序员设置)来存储加密后的密钥。 问题是,当我使用:
KeyGenerator.getInstance("AES").generateKey()
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey key = keyGenerator.generateKey();
这可以满足您的需求吗?
默认值似乎为128位,但是我不会假设所有JVM都使用相同的默认值,或者它将永远是默认值。
https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html
Java平台的每个实现都需要支持以下标准Cipher变换,括号中是密钥大小:
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
KeyGenerator
有几个init()
方法;在生成密钥之前,应该调用其中一个。 KeyGenerator
的Javadoc指定,如果您不调用其中一个init()
方法,则"每个提供程序都必须提供(并记录)默认初始化"。
因此,这是特定于提供程序的。由于您使用“AES”算法名称初始化密钥生成器,因此可以假设您将获得适合AES的密钥大小,即128、192或256位(分别为16、24和32字节)。但实际提供程序提供哪一个取决于JVM及其可能的配置。
.init()
的唯一有效值为128、192或256位,而192和256可能甚至无法使用......这可能导致一些痛苦的部署问题。 - Stu Thompson