AES密钥长度错误无效

此代码提供无效的AES密钥长度错误。 我怎么能纠正它? (我想要128位密钥AES加密)

package org.temp2.cod1; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; public class Code1 { public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { String s = "9882623867"; byte[] plaintext = s.getBytes("UTF-16"); String s2 = "supernova"; byte[] key = s2.getBytes("UTF-16"); Cipher c = Cipher.getInstance("AES"); SecretKeySpec k = new SecretKeySpec(key, "AES"); c.init(Cipher.ENCRYPT_MODE, k); byte[] encryptedData = c.doFinal(plaintext); System.out.println(encryptedData); } } 

任何帮助赞赏

使用SecretKeyFactory从密码中派生关键字节。您可以在此处查看详细示例。 请注意,您需要指定密钥长度为128位密钥而不是256位密钥,如该示例所示。

您将遇到的下一个问题是您没有指定填充方案。 除非您的消息是16字节的倍数(AES块大小),否则会引发错误。 使用PKCS5Padding,如示例中所示。

在密码上使用CBC模式将需要为每个消息选择新的初始化矢量。 必须将此唯一IV与加密邮件一起发送给收件人。

在没有彻底了解这里提出的概念(以及更多)的情况下尝试执行加密可能会导致系统不安全。

您通常不能使用任何密钥长度(例如您在这里使用“超新星”)来获得像AES这样的分组密码。 您必须使用适合您所选算法的支持密钥长度(128,192,256等)。

一种常见的方法是对密码进行哈希(例如,通过SHA)并提取前N个字节。 无论如何这都是更好的,因为它允许你用初始化值“加密”你的密码,这样即使他们的密码相同,也没有两个用户的“密钥”是相同的。 如果您真的对这些东西感兴趣,那么开创性的工作就是Bruce Schneier的Applied Cryptography 。

有关实际的实现细节, 请参阅

当您尝试使用的密钥长度不合适时,您可能会收到此错误。

所以在psuedocode中,你正在尝试这样的事情:

 String key = "123"; SecretKeySpec k = new SecretKeySpec(key, "AES"); 

但关键是太短 – 它需要像31个字符长。

所以检查你的键值 – >它可能存储在某个地方不正确。

使用带有16个字节的键值字符串进行平滑加密,例如,键“thebestsecretkey”将在base64上运行