2010-04-06 61 views
7

测试RSA以加密AES密钥,I realized RSA只有一个有限大小的块(由程序员设置)存储加密的密钥。 的问题是,当我使用:Java中的AES密钥大小

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

的AES密钥将在每一个计算机和JVM实现一定的大小?

回答

11

KeyGenerator中有一个init方法,允许您指定位数。

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
keyGenerator.init(128); 
SecretKey key = keyGenerator.generateKey(); 

这会做你需要的吗?

默认appears为128位,但我不会假设所有JVM都使用相同的默认值,或者它始终是默认值。

+0

我同意不取决于默认值。 (其他Java默认值随时间而改变)另外,值得注意的是,'.init()'唯一有效值为128,192或256位,并且192和256甚至可能不可用......可能会导致一些痛苦的部署乐趣。 – 2011-08-24 11:56:57

2

Suns Java Cryptography Extension documentation指出AES密钥支持多种密钥大小,并且不提供有关默认大小的任何信息。

根据不同版本的Sun JVM使用的辖区文件,密钥的最大大小也可能有所不同。

+0

这是不好的..所以我不能只设置大小并beleave它将在任何地方工作正常.. – 2010-04-06 14:25:01

+0

大小也可以限制,取决于管辖权设置。 – BenM 2010-04-06 14:28:33

+0

它看起来像AES始终可以是128位(16字节) – 2010-04-06 14:52:04

0

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

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

0

https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html

Java平台的每一个执行需要支持与keysizes以下标准密码转换括号:

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)