Zelig
Zelig

Reputation: 1808

Cryptography : using Password Based Encryption (PBE)

I want to use PBE to encrypt my data. So far, I have written the following code :

    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));

Encryption seems to work (I don't get any error, neither during compilation nor execution) but the initialisation of the Cipher object for decryption doesn't accept the javax.crypto.SecretKey class (compilation error). It instead asks for a java.security.key.

What can I do?

Thanks in advance for the time you will spend trying to help me.

Upvotes: 0

Views: 1229

Answers (1)

Petr Janeček
Petr Janeček

Reputation: 38414

The problem is the line

moteurCryptage.init(Cipher.DECRYPT_MODE, cle, parametresEncodage);

which should be

moteurCryptage.init(Cipher.DECRYPT_MODE, cle, moteurCryptage.getParameters());

Also, as you pointed out, it then doesn't work for some strings (works only for those really short). The problem is that when you call update(), it saves some data into the resulting byte[]. When you call doFinal() on the same variable, it overwrites the data and they are lost forever. The doFinal() method doesn't do all the encrypting again, it only does the remaining part!

That means, that you

  • have to concatenate the source strings before you process them
  • or you have to preserve destination after update(), make destination2 for doFinal() and then both decrypt the same way - update() destination and doFinal() destination2
  • or you can make destination and destination2, concatenate them (here's how, e.g.) into a single completeDestination array and do decrypting doFinal() on that.

If you would like to see the code for all the above, just say a word.

Upvotes: 1

Related Questions