// Updates: 2004.04.20 import javax.crypto.*; import java.security.*; import javax.crypto.spec.*; import java.math.*; /** * Permet d'encrypter un texte en utilisant l'algorithme PBE (Password Based * Encryption). Le risque d'utiliser un mot de passe directement comme clé est * d'obtenir des motifs dans le ciphertext. PBE résoud le problème en "salant" * (salting) le mot de passe (c'est-à-dire en ajoutant des données aléatoires), * puis en lui appliquant successivement un certain nombre de fois (nombre * d'itérations) une fonction de hachage (typiquement MD5). Les deux paramètres * utilisés, "salt" (un tableaux de bytes aléatoires) et "iterations" (le nombre * de fois qu'on applique MD5) doivent être enregistrés comme paramètres du * Cipher afin de pouvoir être utilisés lors du décodage. * Dans ce programme le salt est généré de manière aléatoire à chaque exécution, * ce qui explique que le ciphertext est différent à chaque fois même si on * encrypte le même plaintext avec le même mot de passe. */ public final class TestPBE { public static void main(String[] args) { try { String plaintext = "Vive les cours Java"; System.out.println("plaintext = " + plaintext); char[] password = {'t', 'h', 'e', ' ', 'p', 'a', 's', 's'}; PBEKeySpec keySpec = new PBEKeySpec(password); // le salt est choisis aléatoirement et le nombre d'itérations par // défaut vaut 10 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey secretKey = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] input = plaintext.getBytes(); byte[] ciphertext = cipher.doFinal(input); System.out.println("ciphertext = " + new BigInteger(ciphertext)); AlgorithmParameters params = cipher.getParameters(); // récupère les paramètres, comme le salt et le nombre d'itérations cipher.init(Cipher.DECRYPT_MODE, secretKey, params); byte[] plain = cipher.doFinal(ciphertext); String plaintext2 = new String(plain); System.out.println("plaintext2 = " + plaintext2); } catch (Exception e) { System.out.println(e); } } }