Java中的AES密钥大小

9

测试使用RSA加密AES密钥时,我意识到 RSA只有一个块,并且大小有限(由程序员设置)来存储加密后的密钥。 问题是,当我使用:

KeyGenerator.getInstance("AES").generateKey()

AES密钥在每台计算机和JVM实现中都具有固定的大小吗?
4个回答

16
在KeyGenerator中有一个init方法,允许您指定比特数。
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey key = keyGenerator.generateKey();

这可以满足您的需求吗?

默认值似乎为128位,但是我不会假设所有JVM都使用相同的默认值,或者它将永远是默认值。


我同意不依赖于默认值。(Java 的其他默认值会随时间而改变。)此外,值得注意的是,.init() 的唯一有效值为128、192或256位,而192和256可能甚至无法使用......这可能导致一些痛苦的部署问题。 - Stu Thompson

2
"Suns Java Cryptography Extension documentation"中指出,AES密钥支持多种密钥长度,并未提供默认长度的信息。此外,不同版本的Suns JVM使用的司法文件也可能导致密钥的最大长度有所不同。请参考Suns Java Cryptography Extension documentation了解更多信息。

这很糟糕..所以我不能只设置一个大小并相信它在任何地方都能正常工作。 - The Student
大小也可以根据司法设置而受限。 - BenM
看起来AES始终可以是128位(16字节)。 - The Student

1

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)

0

KeyGenerator有几个init()方法;在生成密钥之前,应该调用其中一个。 KeyGenerator的Javadoc指定,如果您不调用其中一个init()方法,则"每个提供程序都必须提供(并记录)默认初始化"。

因此,这是特定于提供程序的。由于您使用“AES”算法名称初始化密钥生成器,因此可以假设您将获得适合AES的密钥大小,即128、192或256位(分别为16、24和32字节)。但实际提供程序提供哪一个取决于JVM及其可能的配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接