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 et decryptage java


Sujet :

Sécurité Java

  1. #1
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut Cryptage et decryptage java
    Bonjour,

    J'ai actuellement un soucis.
    J'ai une application qui se génére à partir d'un fichier xml. Pour la sécuriser, j'ai décidé de crypter ce fichier XML j'ai utilisé la classe suivante
    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
     
    package Cryptage;
     
     
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    import java.security.Key;
    import java.util.Vector;
     
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
     
    /**
     * @author xavier
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class Cryptage 
    {
    	private Key clef;
    	private String cle;
    	private byte[] passwordInBytes; 
     
    	public Cryptage(String cle)
    	{
    		try 
    		{
    			//passwordInBytes = cle.getBytes("ISO-8859-2");
    			//passwordInBytes = cle.getBytes("UTF8");
    			passwordInBytes = cle.getBytes("ISO-8859-2");
    			clef=new SecretKeySpec(passwordInBytes,"Blowfish");
     
    		} catch (UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
     
    	public byte[] getSecretKeyInBites()
    	{
    		return clef.getEncoded();
    	}
     
    	public byte[] cryptageString(String txt)
    	{
    		return cryptageByte(txt.getBytes());
    	}
    	public byte[] cryptageByte(byte[] txt)
    	{
    		try
    		{
    			Cipher cipher=Cipher.getInstance("Blowfish");
     
    			cipher.init(Cipher.ENCRYPT_MODE,clef);
    			return cipher.doFinal(txt);
    		}
    		catch (Exception e)
    		{
    			return null;
    		}
     
    	}
    	public byte[] decryptageInByte(byte[] txt)
    	{
    		try
    		{
    			Cipher cipher=Cipher.getInstance("Blowfish");
    			cipher.init(Cipher.DECRYPT_MODE,clef);
    			return cipher.doFinal(txt);
    		}
    		catch (Exception e)
    		{
    			System.out.println(e);
    			return null;
    		}
     
    	}
     
     
     
    	public String decryptageInString(byte[] txt)
    	{
    		return new String(decryptageInByte(txt));
    	}
     
     
     
    }
    Cette classe marche parfaitement on peut crypter decrypter sans probleme.

    Ensuite j'ai fait une application pour crypter mon fichier XML. Suite à un affichage dans la console et l'enregistrement du resultat dans un fichier. Je peux affirmer que l'application a marché.

    MAIS QUAND JE RELANCE MON APPLICATION:

    qui doit decrypter se fichier et ensuite créer un fichier temporaire j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     javax.crypto.IllegalBlockSizeException: Input length (with padding) not multiple of 8 bytes
    Je ne sais plus quoi chercher. Si vous avez une solution je suis preneur.

    Merci d'avance Xavier

    galerie virtuelle

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Tu obtiens toujours le meme resultat ie une faute?
    Il se peut que si une operation est mal aboutie ton fichier soit "corrompu" mais si c'est tout le temps, cela doit etre ton code.
    Par contre je n'ai pas compris quand cela fonctionnait ni quand cela ne fonctionnait pas car tu parle du meme fichier, non?

  3. #3
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    En fait ça marche quand je fais toutes les opérations sans la sauvegarde dans le fichier



    galerie virtuelle

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    cela implique que lors de la sauvegarde de ton fichier soit des bits sont ajoutés soit certains retirés...
    Tu est sur de ta creation de fichier? Je ne sais pas comment tu fais mais utilise tu flush() ?

  5. #5
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Merci, je pense que tu as raison je me pose de plus en plus de questions sur ce point.
    J'essaie demain et je vous tiens au courant

    Merci encore

  6. #6
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Salut,
    ce matin j'ai fait un nouveau test le probleme semble venir de certain cartactères.
    Quand je lance la méthode de cryptage en sortie j'ai parfois des "?" et l'erreur vient de ce caractère (et je présume d'autre). Pour palier à ce problème je pense à une solution suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			//passwordInBytes = cle.getBytes("UTF-8");
    			passwordInBytes = cle.getBytes("ISO-8859-2");
    			clef=new SecretKeySpec(passwordInBytes,"Blowfish");
    là j'ai essayé de crypter sous différents format mais lors du décryptage j'ai toujours un soucis.

    Si vous avez une autre idée je suis preneur.

    Merci Xavier

  7. #7
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Je crois avoir déterminer le probleme pour sauvegarder le tout je suis obligé de transformer un tableau de byte en string et pour decrypter mon fichier il faut que je retransforme le string en tableau de byte.

    Le problème vient sur les caractères suivant
    • c

    • v

    • =

    • ]

    • >


    voici mes méthodes de transformation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public static byte[] StringEnByte(String txt)
    	{
    		byte[] test=txt.getBytes();
     
    			return txt.getBytes();
     
    	}
    	public static String byteEnString(byte[] txt)
    	{	
    				return new String(txt);	
    	}
    Merci

  8. #8
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Moi j'ai un truc comme ça qui marche. J'ai adapté certains de tes trucs dedans. Je peux crypter, quitter l'appli et reouvrir et décrypter:


    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
     
    package com.maFutureBoite.president.billy;
     
    import java.io.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.security.Key; 
    import javax.crypto.Cipher; 
    import javax.crypto.spec.SecretKeySpec; 
     
    public class Securite {
      private String algo = "Blowfish";
     
      public void crypter(String password, String entree, String sortie) {
        try {
          byte[] passwordInBytes = password.getBytes("ISO-8859-2"); 
          Key clef = new SecretKeySpec(passwordInBytes, algo); 
          Cipher cipher = Cipher.getInstance(algo);
          cipher.init(Cipher.ENCRYPT_MODE, clef);
     
          byte[] texteClaire = ouvrirFichier(entree);
          byte[] texteCrypte = cipher.doFinal(texteClaire);
          sauverFichier(sortie, texteCrypte);
        }
        catch (Exception e) {
          System.out.println("Erreur lors de l'encryptage des donnees");
        }
      }
     
      public void decrypter(String password, String entree, String sortie) {
        try {
          byte[] passwordInBytes = password.getBytes("ISO-8859-2"); 
          Key clef = new SecretKeySpec(passwordInBytes, algo); 
          Cipher cipher = Cipher.getInstance(algo);
          cipher.init(Cipher.DECRYPT_MODE, clef);
     
          byte[] texteCrypte = ouvrirFichier(entree);
          byte[] texteClaire = cipher.doFinal(texteCrypte);
          sauverFichier(sortie, texteClaire);
        }
        catch (Exception e) {
          System.out.println("Erreur lors du décryptage des donnees");
        }
      }
     
      private byte[] ouvrirFichier(String filename) {
        try {
          File fichier = new File(filename);
          byte[] result = new byte[(int) fichier.length()];
          FileInputStream in = new FileInputStream(filename);
          in.read(result);
          in.close();
          return result;
        }
        catch (Exception e) {
          System.out.println("Probleme lors de la lecture du fichier: " + e.getMessage());
          return null;
        }
      }
     
      private void sauverFichier(String filename, byte[] data) {
        try {
          FileOutputStream out = new FileOutputStream(filename);
          out.write(data);
          out.close();
        }
        catch (Exception e) {
          System.out.println("Probleme lors de la sauvegarde du fichier: " + e.getMessage());
        }
      }
    }

  9. #9
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Salut
    je viens d'essayer ta méthode elle marche impec.

    Merci à vous tous (à charge de revanche)

    Galerie Virtuelle

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Charset
    Désolé pour le déterrage de topic.

    Celui-ci m'a bien aidé, je souhaite juste apporter un petit conseil pour ceux qui l'utiliseront:
    Je pense que pour la portabilité, il vaut mieux utiliser le charset ISO-8859-1, car c'est l'un de ceux qui doivent, selon la documentation être supporté par toutes les implémentations Java en interne.

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

Discussions similaires

  1. Cryptage asymétrique en java
    Par loic911 dans le forum Sécurité
    Réponses: 2
    Dernier message: 21/05/2016, 22h49
  2. cryptage et decryptage oracle
    Par Bourak dans le forum SQL
    Réponses: 7
    Dernier message: 12/05/2007, 17h28
  3. Cryptage -> URL -> Décryptage, pb code ascci %xx
    Par TicTacToe dans le forum Langage
    Réponses: 2
    Dernier message: 12/05/2006, 13h58
  4. cryptage et decryptage base64
    Par DUBUIS dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/01/2006, 18h51

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