2009-11-19 180 views
23

此代码给出无效的AES密钥长度错误。我如何纠正它? (我想128位密钥的AES加密)无效的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); 
} 
} 

任何帮助赞赏

回答

21

使用SecretKeyFactory派生从password.You密钥字节可以看到一个详细的例子here.请注意,你需要指定的128位密钥的密钥长度,而不是256如该示例中所示。

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

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

试图在没有彻底理解这里提出的概念(以及更多)的情况下执行密码学很可能会导致一个不安全的系统。

10

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

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

对于实际的实施细则,see

1

当您尝试使用的密钥长度不正确时,可能会出现此错误。

所以在伪代码,你想是这样的:

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

但关键是太短了 - 它需要像,说长的31个字符。

因此,检查您的键值 - >它可能存储在某个地方不正确。

-1

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

相关问题