PBEWITHHMACSHA512ANDAES_128和初始化向量

时间:2015-08-13 14:41:26

标签: java encryption

我正在使用Java 8中的PBEWITHHMACSHA512ANDAES_128 excryption方法如果我按如下方式初始化KeySpec和Cipher对象:

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithHmacSHA512AndAES_128");
KeySpec spec = new PBEKeySpec(PASSWORD.toCharArray(), SALT.getBytes(), 4096, 128);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec secret = new SecretKeySpec(tmp.getEncoded(),"PBEWithHmacSHA512AndAES_128" ); 
Cipher cipher = Cipher.getInstance("PBEWITHHMACSHA512ANDAES_128"); 
cipher.init(Cipher.ENCRYPT_MODE, secret);

我可以在Java程序的相同执行中加密和解密,但是一旦程序完成,任何加密的数据都将无法恢复。

我的第一个假设是JRE正在选择随机IV,因为它是块密码所必需的,但是试图用以下方法检索IV:

cipher.getParameters().getParameterSpec(IvParameterSpec.class); 

产生InvalidParameterSpecException。获取可解密数据的唯一方法是指定由PBEParameterSpec包装的IvParameterSpec(仅传递IvParameterSpec会产生InvalidAlgorithmParameterException)。

是否正确传递PBEParameterSpec以指定IV,以及允许用户在需要时不指定IV的目的是什么?

由于

1 个答案:

答案 0 :(得分:1)

默认情况下,PBEWITHHMACSHA512ANDAES_128使用CBC模式和PKCS5Padding。

你是对的,根据Java源代码PBES2Core.java,使用随机IV。

如果你想指定你自己的IV你必须这样做(它使用一个空字节的IV):

    KeySpec spec = new PBEKeySpec(PASSWORD.toCharArray());
    SecretKey tmp = factory.generateSecret(spec);
    SecretKeySpec secret = new SecretKeySpec(tmp.getEncoded(), "PBEWithHmacSHA512AndAES_128");
    Cipher cipher = Cipher.getInstance("PBEWITHHMACSHA512ANDAES_128");
    IvParameterSpec iv = new IvParameterSpec(new byte[16]);
    PBEParameterSpec pbeSpec = new PBEParameterSpec(SALT.getBytes(), 4096, iv);
    cipher.init(Cipher.ENCRYPT_MODE, secret, pbeSpec);