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 :

[Cryptographie] problème en utilisant le cryptage DES


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut [Cryptographie] problème en utilisant le cryptage DES
    Hello tout le monde ! J'ai un pti soucis alors je viens vers vous

    j'ai créé une classe qui récupère une clé qui se trouve dans un fichier, et j'ai implémenté deux méthodes permettant de crypter et décrypter un texte...

    Voici ces méthodes :
    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
    /** cryptage d'un texte passé en paramètre **/
    	public static String cryptage(String s)
    	{
    		String txtNouveauPswd = s;
    		byte[] plainText = txtNouveauPswd.getBytes();	// transforme la chaine en bytes et stocke dans un tableau
     
    		loadKey();
     
    		try
    		{
    			// Création de l'objet cipher DES
    			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
     
    			// Encryptage en utilisant la clé et plainText
    			//System.out.println("\nDébut d'encryptage");
    			cipher.init(Cipher.ENCRYPT_MODE, key);
    			cipherText = cipher.doFinal(plainText);
    			//System.out.println("Fin d'encryptage : ");
    			//System.out.println(new String(cipherText, "UTF8"));
    			pswdCrypte = new String(cipherText, "UTF8");
    		}
    		catch(Exception exc)
    		{
    			exc.printStackTrace();
    			System.out.println("\n " + exc.getMessage() + "\n ");
    		}
     
    		return pswdCrypte;
    	}
     
    	/** décryptage d'un texte crypté **/
    	public static String decryptage(String ss)
    	{
    		loadKey();
     
    		try
    		{
    			// Création de l'objet cipher DES
    			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
     
    			byte[] plainText = ss.getBytes();
     
    			// Décryption du cipher en utilisant la clé générée lors du cryptage
    			//System.out.println("\nDébut de decryptage : ");
    			cipher.init(Cipher.DECRYPT_MODE, key);
     
     
    			byte[] newPlainText = cipher.doFinal(plainText);
    			//System.out.println("Fin de decryptage : ");
     
    			pswdDecrypte = new String(newPlainText, "UTF8");
     
     
    			//System.out.println(new String(newPlainText, "UTF8"));
     
    		}
    		catch(IllegalBlockSizeException i)
    		{
     
    		}
    		catch(Exception excp)
    		{
    			excp.printStackTrace();
    			System.out.println("\n " + excp.getMessage() + "\n ");
    		}
     
    		return pswdDecrypte;
    	}
    Dans une autre classe qui doit crypter et décrypter un texte, j'ai écrit :
    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
    if (e.getSource() == btnValider)
    	        {
    				try
    				{
    					String p = new String(txtNouveauPswd1.getText());
     
    					System.out.println(clCrypt.cryptage(p));
    					System.out.println(clCrypt.decryptage(clCrypt.cryptage(p)));
    					//crypterPswd();
    					//decrypterPswd(cipherText, key);
    				}
    				catch(Exception r)
    				{
     
    				}
            }
    Le résultat : le cryptage marche bien, j'ai fait un test qui affiche le texte crypté... cependant le décryptage ne marche pas, et "null" est renvoyé sur la console...

    Si quelqu'un pouvait m'aider ce seait génial !

    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    pour info apparemment le problème vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] newPlainText = cipher.doFinal(plainText);
    C'est le "doFinal" qui ne passe pas visiblement

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Personnellement, j'utiliser les classes CipherOutputStream et CipherInputStream pour le codage et le décodage; même si dans mon cas j'utilise l'algorithme DESede, mais cela ne doit pas changer le mode d'implémentation.

    Jacques Desmazières

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    d'accord mais comment on l'utilise? logiquement ça devrait marcher avec ce que j'ai fait. Visiblement il y a juste un pti problème avec la fonction doFinal()

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Déjà dans ton code tu masques certaines exceptions : IllegalBlockSizeException (block catch sans rien dedans) : donc si ce type d'exception est levée tu vas te retrouver avec ta chaine décryptée à null.

    Essaie dans un premier temps de mettre un printStackTrace dans le catch afin de voir si tu n'as pas ce type d'exception levée par le doFinal

    Jacques Desmazières

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    Je viens de rajouter un printStack dans le premier bloc d'exception. L'erreur qui sort sur la console est toujours la même... voici une copie d'écran c'est ptêtre plus simple pour que vous voyez...


  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Je me souviens avoir rencontré ce problème, mais je ne suis pas sûr de me souvenir de la cause Il me semble que cela venait du passage par le format String. Essaye dans un premier temps d'utiliser les types natifs de l'api de crypto : byte[]. Si je me souviens ça devrait résoudre le problème.

    Jacques Desmazières

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    ben pourtant la variable "plaintext" est de type byte[] lorsque je réalise le "doFinale"...

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Oui, mais essaye dans un premier temps de ne manipuler que ce type. C'est à dire que ta méthode cryptage remonte un byte[], que ta méthode décryptage prenne en paramètre un byte[].
    Ce n'est peut être pas ce que tu voudras au final, mais il ce qu'il faut dans un premier temps c'est comprendre pourquoi ça ne marche pas dans l'état, ensuite tu pourras chercher comment adapter le code à tes besoins.

    Jacques Desmazières

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    ok j'essaie ça ce soir et jvous tiens au courant

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 288
    Par défaut
    ok donc j'ai modifié certaines choses : à la fin du cryptage je retourne un type 'byte[]' et non + un 'String'. Du coup ma fonction de décryptage prend en paramètre un 'byte[]' et retourne un 'String'.

    Ca marche bien j'ai testé en affichant sur la console. Par contre je me trouve maintenant face un nouveau problème. Je veux stocker ce mot de passe dans un bd... alors le stockage se passe bien, même si j'ai remarqué que les caractères stockés ne sont pas toujours les mêmes que ceux affiché sur la console (ya des "?" qui trainent...).

    C lorsque je veux récupérer le mot de passe dans la bd que j'ai un problème :



    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
    if (e.getSource() == btnValider)
            {
    			try
    			{
    				String p = new String(txtNouveauPswd1.getText());
     
    				//clCrypt.decryptage(clCrypt.cryptage(p));
     
    				// Lancement d'une connection:
    				connect = new clConnexionBaseDonnee();
     
    				try
    				{
    					// Création d'un statment:
    					stmt = connect.getConnection().createStatement();
     
    					// Requête sql:
    					stmt.executeUpdate("insert into etudiant values(1, 'dupont', 'jean', '', '"+clCrypt.cryptage(p)+"', 0, 1)");
     
    					stmt.close();
     
    					stmt = connect.getConnection().createStatement();
     
    					// Requête sql:
    					String cmdSql = new String ("SELECT pwdEtudiant from etudiant where nomEtudiant='dupont");
    					resultat = stmt.executeQuery(cmdSql);
     
    					if(resultat.next())
    					{
    						System.out.println(resultat.getByte(1));
    					}
     
    				}
    				catch(Exception t)
    				{
    					t.printStackTrace();
    					System.out.println("\n " + t.getMessage() + "\n ");
    				}
     
    				//crypterPswd();
    				//decrypterPswd(cipherText, key);
    			}
    			catch(Exception r)
    			{
     
    			}
            }
    nb : ce code n'est qu'un test pour voir si ça marche...

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Il ya plusieurs possibilités
    • 1) Utiliser un stockage binaire => stocker dans une colonne de type binaire, Stream, CLOB (mais c'est peut être un peu gros et contraignant) ou tout autre type simulaire (voir ce qui est disponible en JDBC et l'implémentation disponible sur ta base de donnée)

    • 2) Encoder "manuellement" le byte[] sous forme de chaine : on représente par exemple chaque élément du tableau par sa valeur hexadécimale (il existe peut être des classes permettant de le faire pour toi, mais je ne les connais pas, et ce transcodage est très simple à implémenter)


    Tu peux bien sûr faire ce transcodage dans tes méthodes de cryptage / décryptage afin de pourvoir utiliser la même interface qu'à l'origine (avec String).

    Jacques Desmazières

Discussions similaires

  1. [Crypt]Fonction simple de cryptage des données
    Par Agoye dans le forum Sécurité
    Réponses: 5
    Dernier message: 30/08/2006, 19h35
  2. Comment utiliser le cryptage MD5 (Dimka Maslov) ?
    Par bds2006 dans le forum Delphi
    Réponses: 3
    Dernier message: 08/06/2006, 17h24
  3. Utiliser les méthodes des boutons crées en rafale.
    Par kabouns dans le forum Composants
    Réponses: 8
    Dernier message: 03/12/2004, 10h48
  4. Quiz : testez vos connaissances sur le cryptage des données
    Par SheikYerbouti dans le forum Oracle
    Réponses: 0
    Dernier message: 08/10/2004, 10h06

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