IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Java Discussion :

Cryptage AES - Java & Javascript


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut Cryptage AES - Java & Javascript
    Bonjour à tous,

    Je me tourne vers vous désespérément afin de trouver des réponses car je n'en peux plus de consulter des forums avec des bouts de réponses qui ne mènent à rien.

    Le principe est simple, je stocke sur une base de données de données cryptés, et je souhaite pouvoir les décrypter =)

    J'utilise CryptoJS en javascript pour encrypter les données avant de les envoyer sur le serveur, et j'ai un service java qui à besoin à un moment donnée de les décrypter ^^.

    Voici le code javascript je j'utilise et qui fonctionne dans les deux sens (crypte et décrypte) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     var secret = 'phrase a crypter';
    	var key = 'cle';
    	console.log(key + "#");
     
    	// Entré : String Utf8
    	var test = CryptoJS.AES.encrypt(secret, key, { iv: key, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // Sortie : Base 64
    	// U2FsdGVkX1+3+hj2N4kPGJRZpeEG1+RQKAKxNahOCiwS1wtOGSe39NEq7FNmwED+
     
    	// Entré : String Base 64
    	var pass = CryptoJS.AES.decrypt(test, key, { iv: key, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // Sortie : String HEX
    	console.log(pass.toString(CryptoJS.enc.Utf8) + "#"); // On remet en String Utf8 pour le lire
     
    	// phrase a crypter -> =D
    Niquel je suis super content jusque là. Comme vous pouvez le voir,a fin de simplifier la démarche clé et initial vecteur sont identiques. D'après CryptoJS, c'est une clé de 256 bits qui est générée.

    On rentre dans le vif des problèmes, aucun code que j'ai pu trouver ou bidouillé ne fonctionnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    Security.addProvider(new BouncyCastleProvider());
    		String plainPassword = "";
    		SecretKeySpec key = new SecretKeySpec("cle\0\0\0\0\0\0\0\0\0\0\0\0\0".getBytes(), "AES");
    		IvParameterSpec iv = new IvParameterSpec("cle\0\0\0\0\0\0\0\0\0\0\0\0\0".getBytes());
     
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
     
    		cipher.init(Cipher.DECRYPT_MODE, key, iv);
     
    		byte[] encoded = cipher.doFinal(Base64.decodeBase64("U2FsdGVkX1+3+hj2N4kPGJRZpeEG1+RQKAKxNahOCiwS1wtOGSe39NEq7FNmwED+".getBytes()));
    		plainPassword = new String(encoded);
    		System.out.println(plainPassword);
    J'ai une super erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" javax.crypto.BadPaddingException: pad block corrupted
    	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
    	at javax.crypto.Cipher.doFinal(Cipher.java:2087)
    	at main.test.main(test.java:77)
    Voili, que dire de plus, j'ai fais attention a prendre les même encodace, padding, clé, iv mais rien n'y fait, je passe a côté de quelque chose.

    Merci d'avance à tous, si vous avez des questions, n'hésitez pas.

    A bientot

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    tu as essayé de décoder ton base64 avec la classe sun.misc.BASE64Decoder ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] encoded = cipher.doFinal(decoder.decodeBuffer("U2FsdGVkX1+3+hj2N4kPGJRZpeEG1+RQKAKxNahOCiwS1wtOGSe39NEq7FNmwED+"));
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    C'est documenté ici:

    https://code.google.com/p/crypto-js/, section cipher output. Ce que tu obtiens, ce n'est pas la version cryptée du code, mais une structure au format open-ssl contenant toutes les informations de l'output. Il s'agit en fait d'un préfixe de 64 bits ("Salted__") suivi du salt (64 bits?) suivi de la clé, le tout ensuite passé à la moulinette base64.

    Donc tu base64.decode() ça, tu sépare préfixe, salt et données cryptée, tu initialise tout comme il faut dans java (ajout du salt dans l'algo de cryptage) et tu décode.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonjour,

    Si c'est bien ça, je pouvais continuer à chercher Oo, j'avais pas du tout compris sa comme ça, en effet sa explique pas mal de choses.

    Je vais tester de splitter le tout et je vous ferais un retour dès que mes tests auront aboutis.

    Merci beaucoup de votre contribution.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Re bonjour,

    J'ai relu toute la documentation et surtout sur le cipher output. Je comprends un peu mieux comment ils s'y sont pris. Toutefois, j'ai vraiment du mal a donner les informations à Java, a chaque fois, ce n'est pas au bon format et je ne parle meme pas des problèmes de taille de clé.

    J'ai suivis l'exemple sur CryptoJs et est gardé que les informations importantes :

    Code : 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
    var JsonFormatter = {
            stringify: function (cipherParams) {
                // create json object with ciphertext
                var jsonObj = {
                    ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)
                };
     
                // optionally add iv and salt
                if (cipherParams.iv) {
                    jsonObj.iv = cipherParams.iv.toString();
                }
                if (cipherParams.salt) {
                    jsonObj.s = cipherParams.salt.toString();
                }
     
                // stringify json object
                return JSON.stringify(jsonObj);
            },
     
            parse: function (jsonStr) {
                // parse json string
                var jsonObj = JSON.parse(jsonStr);
     
                // extract ciphertext from json object, and create cipher params object
                var cipherParams = CryptoJS.lib.CipherParams.create({
                    ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
                });
     
                // optionally extract iv and salt
                if (jsonObj.iv) {
                    cipherParams.iv = CryptoJS.enc.Hex.parse(jsonObj.iv)
                }
                if (jsonObj.s) {
                    cipherParams.salt = CryptoJS.enc.Hex.parse(jsonObj.s)
                }
     
                return cipherParams;
            }
        };
     
        var encrypted = CryptoJS.AES.encrypt("mickaffdel", "cle", { format: JsonFormatter, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    Ce qui me donne un Json comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"ct":"xHNsNd/THByD5Wgg6UdlLQ==","iv":"98b33f6423fc8999f828067299f797a9","s":"e80987d41d610372"}
    En java, j'ai récupéré les informations et voila comment je l'ai exploitent :

    Code : 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
    String ct = "xHNsNd/THByD5Wgg6UdlLQ=="; // Base 64
    		String cl = "cle\0\0\0\0\0\0\0\0\0\0\0\0\0"; // Utf 128 bits
    		String iv = "98b33f6423fc8999f828067299f797a9"; // Hex 256 bits
    		String st = "e80987d41d610372"; // Hex 128 bits
     
    		Security.addProvider(new BouncyCastleProvider());
     
    		/* IV */
    		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
     
    		/* KEY */
    		SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    		KeySpec spec = new PBEKeySpec(cl.toCharArray(), st.getBytes(), 65536, 128);
    		SecretKey tmp = factory.generateSecret(spec);
    		SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
     
    		/* CIPHER */
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    		cipher.init(Cipher.DECRYPT_MODE, secret, ips);
     
    		byte[] decoded_byte = cipher.doFinal(Base64.decodeBase64(ct.getBytes()));
    		String decoded_string = new String(decoded_byte);
    		System.out.println(decoded_string);
    Voila l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.security.InvalidAlgorithmParameterException: IV must be 16 bytes long.
    	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(Unknown Source)
    	at javax.crypto.Cipher.init(Cipher.java:1346)
    	at javax.crypto.Cipher.init(Cipher.java:1282)
    	at main.test.main(test.java:89)
    Je comprends bien le type d'erreur, je sais comment la contourner mais je ne peux pas modifier la taille de la clé. Je me demande si j'utilise bien la bonne manière de créer ma clé avec les informations que j'ai.

    Merci d'avance encore à tous.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu dois convertir tes string iv et st en byte[] en parsant les charactères hexadecimaux. La tu transforme dans ton code pour le moment chaque caractère en un byte correspondant à son code ascii. Ce n'est pas bon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.4] Cryptage AES <-> Java / PHP
    Par karistote dans le forum Langage
    Réponses: 1
    Dernier message: 22/10/2014, 09h26
  2. [Applet] appel de methodes java en javascript
    Par soulhouf dans le forum Applets
    Réponses: 16
    Dernier message: 06/09/2005, 14h18
  3. Variable Java dans JavaScript
    Par blaiseac dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 14h09
  4. [Crypto] Besoin d'aide de cryptage en java
    Par djyb2003 dans le forum Sécurité
    Réponses: 3
    Dernier message: 08/03/2004, 18h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo