Java PBEWITHHMACSHA512ANDAES_128和初始化向量
我正在使用Java 8中的PBEWITHHMACSHA512ANDAES_128 excryption方法,如果我按如下方式初始化KeySpec和Cipher对象: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
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);