Voir le flux RSS

autran

Chiffrement AES en JAVA

Noter ce billet
par , 08/01/2016 à 19h28 (943 Affichages)
Dans ce billet, vous trouverez une source simple et efficace pour chiffrer ou déchiffrer rapidement un texte avec l'algorithme AES.

Cette source utilise l'implémentation native de JCA (Java Cryptography Architecture) qu'offre Oracle en standard dans le JDKdepuis la version Java7. Donc pas besoin d'ajouter de .jar ni d'artefact MAVEN.
Néanmoins, l’utilisation de la classe Base64 contraint à utiliser le Java 8. Pour ceux qui veulent utiliser JDK 1.7, je pourrais fournir un code de contournement à la demande (en commentaires sur ce post)

On utilisera 3 objets pour exécuter les trois étapes majeures du processus :
  • L'objet KeyGenerator pour la génération d'une clé aléatoire de 128 bits
  • L'objet Base64 pour l'encodage d'une chaine de caractères (notre texte) dans un tableau d'octets et l'opération inverse associée en utilisant le codage Base64
  • L'objet Cipher pour le chiffrement proprement dit du tableau d'octets (et respectivement le déchiffrement)

Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
 
public class CodeDecodeAES 
{
	static Cipher cipher;
 
	public static void main(String[] args) throws Exception
	{
		// génération d'une clé AES de 128bits
		KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
		keyGenerator.init(128);
		SecretKey secretKey = keyGenerator.generateKey();
 
		// instanciation d'un objet chiffreur implémentant le chiffrement AES
		cipher = Cipher.getInstance("AES");
 
		// le clair
		String plainText = "AES Symmetric Encryption Decryption";
		System.out.println("Plain Text Before Encryption: " + plainText);
 
		// le chiffré
		String encryptedText = encrypt(plainText, secretKey);
		System.out.println("Encrypted Text After Encryption: " + encryptedText);
 
		// de nouveau le clair
		String decryptedText = decrypt(encryptedText, secretKey);
		System.out.println("Decrypted Text After Decryption: " + decryptedText);
	}
 
	private static String decrypt(String encryptedText, SecretKey secretKey) throws Exception
	{
		// chargement du chiffré dans un tableau d'octets
		Base64.Decoder decoder = Base64.getDecoder();
		byte[] encryptedTextByte = decoder.decode(encryptedText);
 
		// initialisation du chiffreur en mode déchiffrement avec clé secrete
		cipher.init(Cipher.DECRYPT_MODE, secretKey);
 
		// déchiffrement du tableau d'octets
		byte[] decryptedByte = cipher.doFinal(encryptedTextByte);
 
		// chaine de caractères représentant le clair
		String decryptedText = new String(decryptedByte);
		return decryptedText;
	}
 
	private static String encrypt(String plainText, SecretKey secretKey) throws Exception
	{
		// chargement du clair dans un tableau d'octets
		byte[] plainTextByte = plainText.getBytes();
 
		// initialisation du chiffreur en mode chiffrement avec clé secrete
		cipher.init(Cipher.ENCRYPT_MODE, secretKey);
 
		// chiffrement du tableau d'octets
		byte[] encryptedByte = cipher.doFinal(plainTextByte);
 
		// chaine de caractères représentant le chiffré 
		Base64.Encoder encoder = Base64.getEncoder();
		String encryptedText = encoder.encodeToString(encryptedByte);
		return encryptedText;
	}
}

Envoyer le billet « Chiffrement AES en JAVA » dans le blog Viadeo Envoyer le billet « Chiffrement AES en JAVA » dans le blog Twitter Envoyer le billet « Chiffrement AES en JAVA » dans le blog Google Envoyer le billet « Chiffrement AES en JAVA » dans le blog Facebook Envoyer le billet « Chiffrement AES en JAVA » dans le blog Digg Envoyer le billet « Chiffrement AES en JAVA » dans le blog Delicious Envoyer le billet « Chiffrement AES en JAVA » dans le blog MySpace Envoyer le billet « Chiffrement AES en JAVA » dans le blog Yahoo

Mis à jour 29/02/2016 à 10h05 par autran

Tags: java, sécurité
Catégories
Java

Commentaires

  1. Avatar de MasterMbg
    • |
    • permalink
    Bonjour,

    Merci pour ton code, je pense pouvoir l'utiliser au besoin . Une seule remarque pour l'instant que je peux te faire est le manque des commentaires. Je ne vois pas comment un développeur amateur désirant utiliser le chiffrement dans son application pourrait facilement se retrouver avec un code sans explications qui vont avec. Ce serait génial si jamais tu associais quelques explications au code. Sinon, le code est intéressant à mon avis.

    Merci

    Christian Djo...
  2. Avatar de autran
    • |
    • permalink
    Merci Christian,
    le manque de commentaires vient de ce que j'avais placé ce code source dans un tutoriel. Mais le tutoriel n'a jamais vu le jour et fut abandonné.
    Je vais ajouter du commentaire cette semaine.
    Mis à jour 16/01/2016 à 18h03 par autran
  3. Avatar de Gugelhupf
    • |
    • permalink
    Salut autran, il est nécessaire d'avoir Java 8 (et pas Java 7) pour utiliser ton code (cf : Base64). Il serait peut-être bon de rappeler ce qu'est JCA, parce que ça peut vouloir dire Java Connector Architecture... ce qui n'est pas le cas ici (Java Cryptography Architecture).

    EDIT: Au passage, pourquoi utilises-tu une couche Base64 en plus du chiffrement AES ?
    Mis à jour 06/02/2016 à 15h26 par Gugelhupf
  4. Avatar de autran
    • |
    • permalink
    Merci Gugelhupf pour ta participation et ta vigilance,

    Je viens d'apporter les précisions dans le billet pour Java 8 et JCA.

    Pour la couche base64, je l'utilise systématiquement dans la mesure ou cette représentation est imposée (pour son interopérabilité) dans mon entreprise.
    Attention, base64 ne permet que de coder, alors que AES quant à lui permet de chiffrer.
  5. Avatar de paladice
    • |
    • permalink
    Bonjour,

    merci pour ce tuto ça m'a permis de comprendre rapidement ce que je cherchais depuis hier .
    J'ai tout de même une petite question. Si l'on désire sauvegarder le mot de passe chiffrer en base de données, pour le ressortir plus tard; je suppose qu'il faut enregistrer la clé de chiffrement avec ? non ?

    Merci d'avance
  6. Avatar de autran
    • |
    • permalink
    Oui en général,
    La clé de chiffrement est conservée sur les infrastructures de l'application.
    Par convention et usage la gestion de cette clé est transparente pour l'utilisateur.