2011-08-01 91 views
14

当我在Android中运行此代码时,它不会产生错误,但是当我在标准Java程序中运行它时,它会产生异常:java.security.InvalidKeyException:非法密钥大小。java.security.InvalidKeyException:非法密钥大小

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
SecretKeySpec keySpec = new SecretKeySpec(CHUNK_ENCRYPTION_KEY.getBytes(), 0, 32, "AES"); 
IvParameterSpec initVector = new IvParameterSpec(AES_INITIALIZATION_VECTOR.getBytes(), 0 , 16); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec, initVector); 

CHUNK_ENCRYPTION_KEY是硬编码到程序中的32字节密钥。 AES_INITIALIZATION_VECTOR是一个16字节的硬编码初始化向量。

有谁知道为什么它可以在Android上工作,而不是在桌面上?

+0

您的问题缺少一个问号。 – Snicolas

+0

@Hank我正面临类似的问题。你有没有解决这个问题? – NovusMobile

+0

不,我永远无法解决这个 – Hank

回答

-1

也许你提供的KEY和Initialization Vector没有32个字节,分别是16个字节长度。您也可以尝试使用构造函数不带参数的偏移和密钥长度:

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
+0

我检查了字节长度,当我转换他们字节数组,如果我不做偏移量和长度,它会产生相同的异常。 – Hank

+0

您是否将十六进制字符串转换为字节? –

+0

是的,我的整个密钥字符串由32个Unicode字符组成。 – Hank

24

在默认桌面JVM安装(使用来自Sun /甲骨文的JRE或JDK),AES是限于128位密钥大小。这是关于加密软件的进口/出口法律的补充。要解锁更大的AES密钥,您需要下载并应用“JCE Unlimited Strength Jurisdiction Policy Files”(请参见this page的底部)。

密钥大小限制由Cipher类中的代码执行。改变加密提供者(例如,给Bouncy Castle或IAIK提​​供者之一)不会让你绕过这个限制。

在一个不相关的音符,你不想使用原始getBytes()方法上String,因为结果取决于当前的语言环境(不是每个人都使用UTF-8或甚至ASCII兼容编码)。如果您想将密钥表示为文字字符串,请至少使用明确的编码,例如:CHUNK_ENCRYPTION_KEY.getBytes("UTF-8")

1

在README中未明确指出“JCE Unlimited Strength Jurisdiction Policy Files”应该复制到jre内部JDK,否则它将无法工作。文件路径应为:/path/to/jdk1.7.0_xx/jre/lib/security

相关问题