AES密钥长度错误无效

时间:2009-11-19 03:52:52

标签: java encryption 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);
}
}

任何帮助表示赞赏

4 个答案:

答案 0 :(得分:22)

使用SecretKeyFactory从密码中派生关键字节。您可以看到详细示例here.请注意,您需要指定密钥长度为128位密钥而不是256位,如图所示在那个例子中。

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

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

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

答案 1 :(得分:10)

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

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

有关实际的实施细节,see

答案 2 :(得分:1)

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

所以在伪代码中,你正在尝试这样的事情:

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

但关键是太短 - 它需要像31个字符一样。

请检查您的键值 - >它可能存放在错误的地方。

答案 3 :(得分:-1)

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