Quantcast
Channel: Tutoriel – AbriCoCotier.fr
Viewing all articles
Browse latest Browse all 21

Comment chiffrer et déchiffrer un champs AES128 en Java

$
0
0

Le chiffrage/déchiffrage AES128 nécessite souvent d’être traité au niveau applicatif (et pas forcément uniquement au niveau base-de-donnée, dont le tuto est ici), donc voici quelques méthodes testées, qui fonctionnent, utilisant d’un côté une clef MD5 pour générer une clef de 128bits, et de l’autre l’algo AES pour chiffrer le tout. Notez au passage que, comme MD5 n’est pas bijectif (il existe plusieurs clefs de départ pour un seul résultat MD5), on peut considérer qu’il existera plusieurs clefs de départ, qui, générées au format MD5, fourniront la clefs final de hashage MD5.

Méthode de génération de la clef en 128bits (utilisation d’un hash MD5) :

Cette méthode prend une chaine de caractère en paramètre, et renvoie l’objet SecretKeySpec (qui est dans javax.crypto.spec.SecretKeySpec). Il utilise la méthode MessageDigest, avec l’algo MD5 pour générer le hash (NB : ça fonctionne aussi avec SHA). On met en paramètre du constructeur de SecretKeySpec l’algo qui sera utilisé, mais ça n’influe pas sur la création de la clef en elle-même. Donc on peut considérer que vous pourriez mettre ce que vous voulez à la place de AES_TRANSFORMATION_STRING.

    /**
     * Fournit une chaine de caractère en utilisant le hashage MD5
     *
     * @param toEncrypt : texte à chiffrer
     */
    private static SecretKeySpec getKey(String secretKey) {
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("MD5");

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }

        try {
            return new SecretKeySpec(digest.digest(new String(secretKey.getBytes(),"UTF8").getBytes()), AES_TRANSFORMATION_STRING);
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

Méthode de chiffrage AES128 :

Là on utilise l’objet Cipher, auquel on fournit la clef de chiffrage (générée par le getKey() ci-dessus), ainsi que l’algo, et enfin le texte à chiffrer avec l’encodage de celui-ci (ici : « ISO-8859-1″). ON remarque que c’est la méthode doFinal qui sort la chaine de bytes chiffrés. Notez enfin que l’encryptage se fait car on a initialisé Cipher avec Cipher.ENCRYPT_MODE.

private static final String AES_TRANSFORMATION_STRING = "AES";

    /**
     * Chiffre une chaine de caractère en utilisant l'algo AES128
     * @param toEncrypt : texte à chiffrer
     */
    public static String encryptAES(String toEncrypt) {
        String encrypted = null;
        try {
           // Instantiate the cipher
           Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION_STRING);
           cipher.init(Cipher.ENCRYPT_MODE, getKey());
           // Récupère la clé secrète
            byte[] cipherText = cipher.doFinal(toEncrypt.getBytes("ISO-8859-1"));
            encrypted = new String(cipherText);
        }
        catch (Exception e) {
            System.out.println("Impossible to encrypt with AES algorithm: string=(" + toEncrypt + ")");
        }
        return encrypted;
    }

Méthode de déchiffrage du contenu AES128 :

Pour notre exemple, on déchiffre avec la clef, bien sûr, sauf qu’on met Cipher.DECRYPT_MODE dans l’initialisation du Cipher.

    /**
     * Dechiffre une chaine de caractère en utilisant l'algo AES128
     * @param toDecrypt
     */
    public static String decryptAES(String toDecrypt, String secretKey) {
        String decrypted = null;
        try {
            // Instantiate the cipher
            Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION_STRING);
            cipher.init(Cipher.DECRYPT_MODE, getKey(secretKey));
            byte[] original = cipher.doFinal(toDecrypt.getBytes("ISO-8859-15"));
            return new String(original);
        }
        catch (Exception e) {
            e.printStackTrace();
            System.out.println("Impossible to decrypt with AES algorithm: string=(" + toDecrypt + ") message=(" + e.getMessage() + ")");
        }
        return decrypted;
    }

Rappelez vous bien que le Java manipule ici des byte[] et non des String.

Si vous voyez une erreur dans le code donnez ici, n’hésitez pas à la faire remarquer dans les commentaires !

Voilà voilà !


AbriCoCotier.fr, 2011. | Permalien | 2 commentaires | Plugin Better Feed, par Ozh
Rangé dans : , , ,


Viewing all articles
Browse latest Browse all 21

Trending Articles