2013-02-22 71 views
1
public static String doGenerate() { 
    int val = 10000000; 
    Random r = new Random(); 
    int gen = r.nextInt(89999999); 
    int gen1 = r.nextInt(89999999); 
    gen = val + gen; 
    gen1 = val + gen1; 
    String reply = gen + "" + gen1; 
    return reply; 
} 

这是我用来生成密钥的方法,我需要用于下面给出的AES算法。Java - SHA-256散列:无效的AES密钥长度:64字节

public static void decryptFile(String keyString, String fileName){ 
    try { 
     KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
     kgen.init(128); 
     SecretKey key = (SecretKey) new SecretKeySpec(
      keyString.getBytes(), "AES");// kgen.generateKey(); 

     AESEncrypter encrypter = new AESEncrypter(key); 

     encrypter.decrypt(new FileInputStream(
      new java.io.File("").getCanonicalFile() + 
      File.separator + "Received"+ 
      File.separator + fileName), 
      new FileOutputStream(new java.io.File("").getCanonicalFile() + 
      File.separator + "Decrypted" + 
      File.separator + fileName)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

这是AESEncrypter方法。

public AESEncrypter(SecretKey key) { 
    // Create an 8-byte initialization vector 
    byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 
      0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 

    AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 
    try { 
     ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

     // CBC requires an initialization vector 
     ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
     dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

解密后,我得到一个无效键例外:java.security.InvalidKeyException:无效的AES密钥长度:64个字节。这是为什么发生?有没有解决方案?

+0

64字节它说.. – 2013-02-22 06:41:30

回答

1

您的密钥生成函数有缺陷 - 它只生成整数并将其转换为字符串,大量减少可用密钥空间并显着减弱密钥。

但是,它确实产生了16个适合AES密钥的字节值。自上次收到错误信息以来,我只能假设你已经更改了代码?

我强烈建议您恢复为仅使用KeyGenerator来生成您的AES密钥。这将以安全的方式进行。

+1

实际上,它返回16个字符。这可能不会编码为16个字节,虽然它通常。 UTF-16应将其编码为32个字节。这仍然不能解释64个字节。 – 2013-02-25 02:11:28

+0

谢谢..我现在就明白了.. :) – 2013-04-01 05:52:03

相关问题