Java PBEWITHHMACSHA512ANDAES_128和初始化向量

Java PBEWITHHMACSHA512ANDAES_128和初始化向量,java,encryption,Java,Encryption,我正在使用Java 8中的PBEWITHHMACSHA512ANDAES_128 excryption方法,如果我按如下方式初始化KeySpec和Cipher对象: SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithHmacSHA512AndAES_128"); KeySpec spec = new PBEKeySpec(PASSWORD.toCharArray(), SALT.getBytes(), 4096, 12

我正在使用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会导致InvalidalgorithParameterException)

传递PBEParameterSpec是指定IV的正确方法吗?允许用户在需要时不指定IV的目的是什么


谢谢

默认情况下,PBEWIHMACSHA512ANDAES_128使用CBC模式和PKCS5P添加

您是对的,根据Java源代码PBES2Core.Java,使用了随机IV

如果要指定自己的IV,必须这样做(使用空字节的IV):


您的帖子缺少构建
PBEKeySpec
的代码。
    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);