我想用PBE来加密我的数据。到目前为止,我已经编写了以下代码:
moteurCryptage = Cipher.getInstance("PBEWithMD5AndDES");
PBEKeySpec spécifClé=new PBEKeySpec(mdp.toCharArray());
SecretKeyFactory usineàClefs=SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey clé=null;
try {
clé = usineàClefs.generateSecret(spécifClé);
} catch (InvalidKeySpecException ex) {
Logger.getLogger(DiskUtilView.class.getName()).log(Level.SEVERE, null, ex);
}
moteurCryptage.init(Cipher.ENCRYPT_MODE,clé);
byte[] paramètresEncodage;
try {
paramètresEncodage=moteurCryptage.getParameters().getEncoded();
} catch (IOException ex) {
paramètresEncodage=null;
}
destination=moteurCryptage.update(source1.getBytes());
destination=moteurCryptage.doFinal(source2.getBytes());
moteurCryptage.init(Cipher.DECRYPT_MODE,clé,paramètresEncodage);
source=new String(moteurCryptage.doFinal(destination));
加密似乎有效(我在编译和执行期间都没有收到任何错误)但是用于解密的Cipher
对象的初始化不接受javax.crypto.SecretKey
类(编译错误) 。它改为要求java.security.key
。
我该怎么办?
提前感谢你花时间去帮助我。
答案 0 :(得分:1)
问题在于
行moteurCryptage.init(Cipher.DECRYPT_MODE, cle, parametresEncodage);
应该是
moteurCryptage.init(Cipher.DECRYPT_MODE, cle, moteurCryptage.getParameters());
另外,正如您所指出的那样,它对某些字符串不起作用(仅适用于那些非常短的字符串)。问题是,当您致电update()
时,会将一些数据保存到生成的byte[]
中。当您在同一个变量上调用doFinal()
时,它会覆盖数据并永远丢失。 doFinal()
方法不会再次进行所有加密,只会执行其余部分!
这意味着,你
destination
之后保留update()
,为destination2
制作doFinal()
,然后以相同方式解密update()
destination
和doFinal()
destination2
destination
和destination2
,将它们(例如here's how)连接到一个completeDestination
数组中并对其进行解密doFinal()
。 如果你想看到上述所有代码,只需说一句话。