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

  1. #21
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Il y a un truc bizzare dans votre programme car j'ai repris votre code et chez moi ça marche, je décode cette chaine :

    mickamlkrjtflkjrlkejgtlkjlfdsjlfjdkslffdel



    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
    		String ct = "hyFSpYiHtFaWqcqI6OtnKwVVywQKF77l6m+z3MkDiNWRXoBDc0TzY7avGg4t6eaC"; // Base 64
    		String cl2 = "19e07b16c18910e7d6e831788aafd384bc2cc09fe3afd88819afc5278e90c3a4";
    		//String cle = "cle\0\0\0\0\0\0\0\0\0\0\0\0\0";
    		String iv2 = "124e0a752a8d83d827273f0ddcc6ccc9"; // Hex 256 bits
    		String st = "1885272f8527e341"; // Hex 128 bits
     
     
    		byte[] iv_byte = DatatypeConverter.parseHexBinary(iv2);
    		byte[] cl_byte = DatatypeConverter.parseHexBinary(cl2);
    		byte[] st_byte = DatatypeConverter.parseHexBinary(st);
     
    		Security.addProvider(new BouncyCastleProvider());
     
    		/* IV */
    		IvParameterSpec ips = new IvParameterSpec(iv_byte);
     
    		/* KEY */
    		SecretKey secret = new SecretKeySpec(cl_byte, "AES");
     
    		/* CIPHER */
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    		cipher.init(Cipher.DECRYPT_MODE, secret, ips);
     
    		byte[] decoded_byte = cipher.doFinal(Base64.decode(ct.getBytes()));
    		String decoded_string = new String(decoded_byte);
    		System.out.println(decoded_string);

  2. #22
    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
    Bonsoir,

    Dois-je vous apeller "Dieux" ??? Oui c'est vrai que le pass n'est pas très clair, mais c'est bien le message d'origines. Par contre, je commence à avoir peur car moi sa ne marche toujours pas.

    Je me demande si j'utilise les bonnes librairies pour décoder la base64. Quoi qu'il en soit pourriez vous mettre le code entier du fichier ? Voici le mien :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package main;
     
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.Security;
    import java.security.spec.InvalidKeySpecException;
     
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
     
    import org.bouncycastle.util.encoders.Base64;
    import org.bouncycastle.crypto.DataLengthException;
    import org.bouncycastle.crypto.InvalidCipherTextException;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
     
    public class test {
     
    	public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidKeySpecException, UnsupportedEncodingException, InvalidAlgorithmParameterException, DataLengthException, IllegalStateException, InvalidCipherTextException
    	{
     
    		String ct = "hyFSpYiHtFaWqcqI6OtnKwVVywQKF77l6m+z3MkDiNWRXoBDc0TzY7avGg4t6eaC"; // Base 64
    		String cl2 = "19e07b16c18910e7d6e831788aafd384bc2cc09fe3afd88819afc5278e90c3a4";
    		//String cle = "cle\0\0\0\0\0\0\0\0\0\0\0\0\0";
    		String iv2 = "124e0a752a8d83d827273f0ddcc6ccc9"; // Hex 256 bits
    		String st = "1885272f8527e341"; // Hex 128 bits
     
     
    		byte[] iv_byte = DatatypeConverter.parseHexBinary(iv2);
    		byte[] cl_byte = DatatypeConverter.parseHexBinary(cl2);
    		byte[] st_byte = DatatypeConverter.parseHexBinary(st);
     
    		Security.addProvider(new BouncyCastleProvider());
     
    		/* IV */
    		IvParameterSpec ips = new IvParameterSpec(iv_byte);
     
    		/* KEY */
    		SecretKey secret = new SecretKeySpec(cl_byte, "AES");
     
    		/* CIPHER */
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    		cipher.init(Cipher.DECRYPT_MODE, secret, ips);
     
    		byte[] decoded_byte = cipher.doFinal(Base64.decode(ct.getBytes()));
    		String decoded_string = new String(decoded_byte);
    		System.out.println(decoded_string);
    	}
     
    }
    Après, j'avoue que le but final n'est pas décrypter le message avec la clé fournis par le javascript, car si je dois la concerver en mémoire, alors n'importe qui peut retrouver le mot de passe. Mais c'est déjà formidable, si l'algo fonctionne, il ne reste plus pour moi qu'a trouver comment reconstruire cette clé à partir de la phrasepass et du salt.

    =)

  3. #23
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    C'est peut-être ton jar Bouncy Castle qui est foireux car le code est identique à la virgule prêt au niveau des imports. J'ai le bcprov-jdk15-145.jar
    Je te laisse regader de ce coté là, mais sinon c'est tout bon.

    Sinon pour la suite tu veux donc chiffrer ta base locale et tu veux faire le travail en local par javascript. Ce qui est une grosse faille de sécurité en fait.

    Le password maitre ne doit jamais quitter ton serveur, tu dois générer une clé pour chacun de tes clients et lui transmettre pour déchiffrer sa base.
    Ainsi tous tes clients auront un chiffrement différent. Tu stockes juste en clair l'IV en local car ce n'est pas un élément secret. Le salt n'a pas a être transmis c'est juste un élément de génération des clés.

    Tu as pourtant trouvé les objets nécessaire (les PBEKey), mais visiblement tu ne sais pas trop comment les utiliser. Cette structure sert à générer des clés à partir d'un seul et unique mot de passe secret qui reste sur le serveur.

    Quand tu définis une factory comme ceci attention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    Ce n'est pas du tout adapté a ce que tu veux faire. Le HMAC (Hash Message Autentification Code) sert à identifier des messages entre partenaire.

    Pour AES il faut utiliser une structure adapté comme 'PBEWITHSHA256AND256BITAES-CBC-BC' puisque tu utilises le mode opératoire CBC et BouncyCastle. Le sel et l'algorithme de hashage garantissent le fait que tu vas générer tes propres clés sans possibilité de se faire attaquer le password secret autre que la force brute.

    Reste la possibilité pour l'attaquant de récupérer la clé que tu lui envoies. Mais déjà cette clé ne servira que sur sa base et il devra la lire en mémoire. Ce qui limite le cas d'utilisation. Il est difficile de faire mieux.


    Bon courage pour la suite.

  4. #24
    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 : 46
    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
    En fait, la seule raison pour laquelle je vois l'intérêt de chiffrer en javascript, c'est si le serveur ne doit pas avoir accès aux données. Mais dans ce cas là, la clé est à stocker du coté du client, par exemple sous forme d'un mot de passe. Sinon, si c'est juste pour protéger la transmission, je ne vois aucun intérêt de le faire en javascript, le ssl fait très bien son travail. Et comme le mentionne Jimmy_, ça peux même amener des trous de sécurité.

  5. #25
    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,

    Je me suis peut etre mal exprimé quand a l'utilisation des données, et j'aimerais donc votre avis si il existe une faille de sécurité.

    Coté serveur : base de données

    Coté client : pleins de plateformes
    * Client javascript dans le navigateur
    * Application java
    * Application android

    Le but est simple pour mes utilisateurs :
    Pouvoir sur n'importe quelle plateforme, récupérer leurs données sensibles on le nommerra (passhide).

    L'accès à la base de données se fait par une API PHP (pas d'accès direct à la base de données).

    Chaque application peut créer une nouvelle donnée secrete et la lire.
    En gros l'utilisateur se connecte à l'API, je vérifie s'il est bien identifié (couple identifiant/password hashé en sha512). Une fois qu'il est connecté, je lui envoie ses données (passhide). L'utilisateur récupère donc toutes ces données crypté (AES256) et les enregistres en local. Lorsqu'il veut les consulter il les décrypte à la volé avec le mot de passe de l'identifiant (stocké durant la session coté client).

    Le javascript est un peu "batard" car en fait, c'est le seul qui ne conserve pas les données en local sur du long terme. Mais j'en ai besoin car il doit crypter les données pour que quand mes applications java les récupères eux puissent les enregistrer en toute sécurité. Et comme il récupère les données crypté de mes applications java, ba il doit les décrypter pour les faire lire à l'utilisateur ^^

    Tous les échanges se font à travers des requettes HTTP utilisant SSL.

    Voili, qu'en pensez-vous ? Y a t'il selon vous des points critiques ?

    Quoi qu'il en soit, j'ai envie de me suicider, on dit que l'avantage de la machine virtuelle Java => pouvoir fonctionner de la même manière sur toutes les plateformes... Ba moi sa fonctionne pas même avec le bcprov-jdk15-145.jar.

    Sur quelle plateforme es-tu ? Windows, linux. La version de ton JDK éventuellement.

  6. #26
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui c'est donc ça.
    TU dois générer tes clés coté serveur et les transmettre à ton client. Il faut s'assurer que les clés sont différentes pour chacun de tes clients à l'aide de la factory que j'ai donné.
    Ainsi un client A ne peut pas lire la base du client B avec sa clé. Et surtout ton mot de passe maitre reste coté serveur.


    Pour ton erreur, déjà il faudrait la pile complète java pour voir d'où cela peut venir.

  7. #27
    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
    Euh, j'ai peur de ne pas avoir compris pourquoi c'est le serveur qui dois les générer. Le mot de passe maitre qui décrypte tout : il n'est sauvegardé nul part, l'utilisateur le saisi au moment d'afficher les données, et du coup, si je dois crypter les données cotés serveur, je dois transmettre le password maitre. C'est marrant mais je ferais totalement l'inverse, en générant les pass coté client, et je demande à ma bdd de les sauvegarder.

    Le serveur n'a pas le mot de passe maitre, il a une version hashé permettant de vérifié juste à la connexion si les deux hash correspondent et donc que c'est bien l'utilisateur qui se connecte. Même avec SSL, je ne veux pas prendre la "responsabilité" de recevoir, garder, ou meme voir passer le mot de passe en clair. Si jamais mon "serveur" se fait hacké, ce dernier pourra voir passer à la limite le hash du password maitre et voir partir les mdp cryptés vers l'utilisateur.

    Je suis pas un expert en sécurité, mais j'ai consience qu'avec ce schéma, je préserve le mot de passe maitre permettant de tout décrypter (je précise que chaque utilisateur à son propre mot de passe maitre et l'API ne livre que les données de l'utilisateur)

    ###################

    Revenons à nos moutons, j'ai finalement réussis avec un check sur bouncycastle

    Et au final, vous allez rire, le probleme vient de la restriction imposé à java par les normes américaines (FBI) pour le décryptage de mot de passe obligeant une taille maximale de clé. Il semblerait qu'une clé de 256bit dans notre cas, soit de trop.

    Il faut installer le Unlimited strength file de Java dont voici le tuto :
    http://suhothayan.blogspot.fr/2012/0...ptography.html

    Merci à tous vraiment pour votre contribution. Je ne sais pas si je peux mettre résolu à 100% car je dois encore générer à l'aide du "SecretKeyFactory" la clé de décryptage à l'aide du mot de passe maitre (claire).

    Mais comme je l'ai dis, je pense pas que cela soit le plus compliqué ^^

    Merci encore à tous, si vous avez des améliorations, des idées, faisons avancer les choses

  8. #28
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    A ok tu veux tout dériver du mot de passe du client, la connexion et aussi le chiffrement de la base, pourquoi pas.

    Bon courage, à priori tu as maintenant tous les éléments pour y arriver.

  9. #29
    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
    Merci beaucoup, je vous tiens au courant si je trouve comment générer la SecretKey à partir d'une clé claire.

  10. #30
    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 : 46
    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
    En gros, c'est ce que je disais, tu ne veux pas que le serveur puisse décoder les données à aucun moment. Du coup, le mot de passe du client et le seul point critique pour décoder, point que tu n'envoie jamais au serveur.

  11. #31
    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
    Tout compris =)

    Oui, si demain je donne ma BDD au FBI a eux de se débrouiller, je ne vais pas pouvoir les aider. Je ne peux et ne veux pas pouvoir lire le contenu.

    Seul point critique comme vous dites, le mot de passe du client, mais jamais transmis, il reste toujours stocké en mémoire tant que le logiciel est actif et jamais écris. C'est leurs propres responsabilités.

    A chaque fois que l'utilisateur se connecte, il doit saisir son mot de passe qui ne lui permet de décrypter que ses données.

    Cela craint-il ?

    Merci d'avance =)

  12. #32
    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 : 46
    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
    Ca reste assez solide, pour autant que le mot de passe face plus de 4 caractères et que tu t'assure que le fait d'envoyer un hash du pass au serveur ne compromet pas la sécurité.

  13. #33
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui, si demain je donne ma BDD au FBI a eux de se débrouiller, je ne vais pas pouvoir les aider. Je ne peux et ne veux pas pouvoir lire le contenu.
    ils ont de quoi lire le mot de passe tapé par ton utilisateur à 10.000km de distance , alors je me ferai pas trop de soucis pour ça.

    Sinon ta sécurité à l'air correcte comme ça.

  14. #34
    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
    Ca reste assez solide, pour autant que le mot de passe face plus de 4 caractères et que tu t'assure que le fait d'envoyer un hash du pass au serveur ne compromet pas la sécurité.
    A la création du compte, j'oblige ce dernier à :
    * Avoir au moins 8 caractères
    * Au moins 1 minuscule
    * Au moins 1 majuscule
    * Au moins 1 chiffre
    * Au moins 1 symbole

    (je suis un peu parano mais bon).

    Le hash est juste le mdp hashé en SHA512 transmis à la bdd uniquement pour valider l'authentification (toujours à travers cette connexion SSL).

  15. #35
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Sur ce crénau , tu restes vulnérable aux keyloggers.

    Pour renforcer la sécurité il faut ajouter un OTP, du genre secureID.
    Ou un clavier de saisie virtuelle pour le mot de passe.

  16. #36
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sur ce crénau , tu restes vulnérable aux keyloggers.
    C'est noté, et j'avoue y avoir pensé au clavier virtuel, je pense en implémenter un mais bon, à voir car pas évident avec les 8 caractères et c'est plus simple pour quelqu'un de regarder derrière l'épaule ^^

  17. #37
    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
    Bon, dernier message je l'espère ^^

    Je viens de finaliser mon code, je vous transmets le code complet, pour ceux qui aurait eu des problèmes.

    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
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    package test;
     
    import java.security.AlgorithmParameters;
    import java.security.SecureRandom;
    import java.security.Security;
    import java.security.spec.KeySpec;
    import java.util.Random;
     
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.SecretKeySpec;
     
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.util.encoders.Base64;
    import org.json.JSONObject;
     
    public class Main {
     
    	private static int Iterations = 65536;
     
    	public static void main(String[] args) throws Exception
    	{
    		/*****************  Global *******************/
    		Security.addProvider(new BouncyCastleProvider());
    		String password = "password";
     
    		/***************** Encrypter ****************/
    		String texte = "texte de la mort qui tue";
    		String json = AesEncrypt(texte, password);
    		System.out.println(json);
     
    		/***************** Decrypter ****************/
    		String texte_decrypted = AesDecrypt(json, password);
    		System.out.println(texte_decrypted);
    	}
     
    	public static String AesEncrypt(String texte, String password) throws Exception
    	{
    		/* Générer le salt */
    		Random r = new SecureRandom();
    		byte[] st_byte = new byte[32];
    		r.nextBytes(st_byte);
     
    		/* Générer la clé */
    		SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    		KeySpec spec = new PBEKeySpec(password.toCharArray(), st_byte, Iterations, 256);
    		SecretKey tmp = factory.generateSecret(spec);
    		SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
     
    		/* Crypter le texte */
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    		cipher.init(Cipher.ENCRYPT_MODE, secret);
    		AlgorithmParameters params = cipher.getParameters();
    		byte[] iv_byte = params.getParameterSpec(IvParameterSpec.class).getIV();
    		byte[] ct_byte = cipher.doFinal(texte.getBytes());
     
    		/* Convertir les données */
    		String st = BytesToHex(st_byte);
    		String iv = BytesToHex(iv_byte);
    		String ct = new String(Base64.encode(ct_byte));
     
    		/* Ecrire les données */
    		JSONObject json = new JSONObject();
    		json.put( "st", st);
    		json.put( "iv", iv);
    		json.put( "ct", ct);
    		String json_texte = json.toString();
     
    		return new String(Base64.encode(json_texte.getBytes()));
    	}
     
    	public static String AesDecrypt(String json_texte_64, String password) throws Exception
    	{		
    		String json_texte = new String(Base64.decode(json_texte_64.getBytes()));
    		JSONObject json = new JSONObject(json_texte);
     
    		/* Récupérer les données */
    		String ct = (String) json.get("ct");
    		String iv = (String) json.get("iv");
    		String st = (String) json.get("st");
     
    		/* Convertir les données */
    		byte[] ct_byte = Base64.decode(ct.getBytes());
    		byte[] iv_byte = HexToBytes(iv);
    		byte[] st_byte = HexToBytes(st);
     
    		/* Générer la clé */
    		SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    		KeySpec spec = new PBEKeySpec(password.toCharArray(), st_byte, Iterations, 256);
    		SecretKey tmp = factory.generateSecret(spec);
    		SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
     
    		/* Decrypter le texte */
    		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    		cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv_byte));
    		byte[] texte_byte = cipher.doFinal(ct_byte);
     
    		return new String(texte_byte);
    	}
     
    	private static String BytesToHex(byte[] data)
    	{
    		StringBuilder buf = new StringBuilder();
    		for (byte b : data)
    		{
    			int halfbyte = (b >>> 4) & 0x0F;
    			int two_halfs = 0;
    			do
    			{
    				buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte) : (char) ('a' + (halfbyte - 10)));
    				halfbyte = b & 0x0F;
    			} while (two_halfs++ < 1);
    		}
    		return buf.toString();
    	}
     
    	public static byte[] HexToBytes (String s)
    	{
            String s2;
            byte[] b = new byte[s.length() / 2];
            int i;
            for (i = 0; i < s.length() / 2; i++)
            {
                s2 = s.substring(i * 2, i * 2 + 2);
                b[i] = (byte)(Integer.parseInt(s2, 16) & 0xff);
            }
            return b;
        }
    }
    En gros, je fais passer les données par un JSON (en base 64).

    Pour le bon fonctionnement de l'algorithme, je dois faire passer :
    * le CypherText
    * le Salt (pour recréer la clé)
    * l' Initial Vector

    Optionnellement on pourrait ajouter une itération aléatoire transmise dans le JSON. Mais bon...

    Qu'en pensez-vous ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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