2014-04-30 204 views
7

我对我行AES密钥长度无效:128字节?

CIPHER.init(Cipher.ENCRYPT_MODE, keySpec); 

越来越java.security.InvalidKeyException: Invalid AES key length: 128 bytes及密码是

Cipher CIPHER = Cipher.getInstance("AES"); 

和keySpec

SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); 

该密钥是一个长度为128的byte[]我通过的Diffie-Hellman了密钥交换(尽管它在哪里并不重要,对吧?),key完全填充了非零字节为什么Cipher.init(...)抱怨钥匙长度错误? This webpage明确指出支持长度为128的密钥。

我在忽略什么?

+5

我相信你想128位密钥 - 不是128字节? –

+2

oops right herp derp。请把它作为答案,所以我可以接受它,也许建议什么加密算法使用128字节的密钥 – vrwim

+0

好吧。现在发布回答 –

回答

7

我认为你需要128位密钥在这里用于AES算法 - 不是128字节。要将长键转换为需要的长度,您可以尝试使用基于密码的键推导函数。以PBKDF2为例。

+3

对于像Diffie-Hellman组元素这样的高熵材料来说,PBKDF2有点矫枉过正。有关该@vrwim的更多信息,请参阅https://stackoverflow.com/questions/23167936/generating-aes-key-after-ecdh – Perseids

+0

我已经阅读了一些关于PBKDF2的内容,但似乎是密码哈希值,所以它们是彩虹桌更难以破解。我有我的DH密钥交换安全吗?我想我只需要一个散列函数来将键值散列到合适的长度? – vrwim

+2

@vrwim是的,这应该是足够的,检查[这个Q/A](http://crypto.stackexchange.com/questions/15673/security-of-kdf1-and-kdf2-hash-based-kdfs)。 KDF1和2并不比散列输出多得多。 –

1

AES算法允许128,192或256位密钥长度。即16,24或32字节。您的密钥长度应该是16,24或32个字节。

相关问题