密码学:使用基于密码的加密(PBE)

时间:2012-03-29 15:19:43

标签: java cryptography

我想用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

我该怎么办?

提前感谢你花时间去帮助我。

1 个答案:

答案 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() destinationdoFinal() destination2
  • 或者您可以destinationdestination2,将它们(例如here's how)连接到一个completeDestination数组中并对其进行解密doFinal()

如果你想看到上述所有代码,只需说一句话。