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

Java Discussion :

Problème de lecture/écriture d'un fichier chiffré


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut Problème de lecture/écriture d'un fichier chiffré
    Bonjour,

    Je fais un projet dans lequel un serveur chiffre un fichier A et écrit le résultat dans un autre fichier B (on concatène le cipher text, le vecteur d'initialisation et la clé à l'aide de l'opérateur +). Dans une seconde partie, un client doit récupérer les informations dans le fichier chiffré A afin de pouvoir utiliser son contenu.

    Le problème est que le client ne récupère pas le texte sous la même forme que dans le fichier B (j'affiche ce qu'il récupère dans un terminal). Le string du fichier n'est pas sur une seule ligne (présence de retour chariot). Le problème apparaît seulement lorsqu'il y a plusieurs retour chariot dans le fichier (quand le string n'est pas sur une seule ligne).

    Je ne possède pas de très grandes connaissances en Java mais je pense que le problème vient de l'encodage, ou de la lecture/écriture dans le fichier. A moins qu'il y ait une solution pour que le string soit tout le temps sur une seule ligne (pas de retour chariot).

    Auriez-vous quelques idées sur ce problème?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Attention, si tu affiches ce que tu recois dans un terminal, il est possible que ce soit l'encodage du terminal qui pose probleme. Pour verifier que ce que tu envoies est la meme chose que ce que tu recois, il serait préférable de verifier au debugger.
    Ceci étant dit, puisque tu fais du cryptage, le mieux est de ne pas passer par des String mais plutot par des byte[]. Comme ca, tu t'affranchiras des problèmes d'encodage et de caracteres indéfinis...

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Attention, si tu affiches ce que tu recois dans un terminal, il est possible que ce soit l'encodage du terminal qui pose probleme. Pour verifier que ce que tu envoies est la meme chose que ce que tu recois, il serait préférable de verifier au debugger.
    Ceci étant dit, puisque tu fais du cryptage, le mieux est de ne pas passer par des String mais plutot par des byte[]. Comme ca, tu t'affranchiras des problèmes d'encodage et de caracteres indéfinis...
    J'affiche dans un terminal du serveur ce qu'il va copier dans le fichier et j'affiche dans le terminal du client ce qu'il lit, les deux résultats sont différents donc un problème d'encodage du terminal serait quand même possible ?

    Et si je travaille en byte, comment je peux concaténer différents éléments à la suite sachant que j'utilise un délimiteur pour repérer les différents éléments à sélectionner.

  4. #4
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Stud10 Voir le message
    J'affiche dans un terminal du serveur ce qu'il va copier dans le fichier et j'affiche dans le terminal du client ce qu'il lit, les deux résultats sont différents donc un problème d'encodage du terminal serait quand même possible ?
    Oui, ca peut etre différent. Ca dépend de la configuration du terminal.

    Citation Envoyé par Stud10 Voir le message
    Et si je travaille en byte, comment je peux concaténer différents éléments à la suite sachant que j'utilise un délimiteur pour repérer les différents éléments à sélectionner.
    Bah de la meme maniere que si c'est un String : en utilisant des caracteres de séparation spéciaux et en parcourant le tableau jusqu'à les retrouver. Le problème du cryptage, c'est que ca donne souvent des caracteres non-imprimables et qu'en fonction de l'encodage du String, ca peut faire des trucs bizarres.

    Mais bon, pour etre plus précis, il faudrait que tu postes un bout de code...

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Alors voici ma méthode pour générer une clé AES (à partir d'un mot de passe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	private static SecretKey aesKey(char[] pwd) throws Exception{
    		char[] password = pwd;
    		byte[] salt = {
    		        (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
    		        (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
    		};
     
    		SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    		KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
    		SecretKey tmp = factory.generateSecret(spec);
    		SecretKey aesKey = new SecretKeySpec(tmp.getEncoded(), "AES");
    		return aesKey;
    	}
    Ma méthode pour chiffrer mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	private static String encryptAES(SecretKey key, String fileContent, String IV ) throws Exception {
    		SecretKey aesKey = key;
    		String plaintext = fileContent;
    		byte[] iv = IV.getBytes();
    		AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 
    		Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    		aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, paramSpec);
    	    byte[] ciphertext = aesCipher.doFinal(plaintext.getBytes());
    	    String output = new String(ciphertext);
    	    return output;
    	}
    Veux tu voir d'autres bouts de code ?

  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 : 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
    Tu utilise bien InputStream / OutputStream et non pas les Reader/writer pour gérer ton fichier?

  7. #7
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Stud10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	    byte[] ciphertext = aesCipher.doFinal(plaintext.getBytes());
    	    String output = new String(ciphertext);
    Tu remarqueras que ta fonction de cryptage renvoie un byte[] et non un String. Ce n'est pas un hasard et ca rejoins ce que j'ai dit plus tot. Certains caracteres peuvent etre non imprimables et ne pas passer dans le String (ce qui semble etre le cas qui te pose probleme).
    Maintenant, il y a 2 possibilitées :
    - Soit tu peux envoyer le byte[] plutot que le String et le déchiffrer de l'autre coté (c'est le mieux)
    - Soit tu es obligé de passer un String et à ce moment la, il va falloir faire l'encodage dans les 2 sens (byte[] -> String puis String -> byte[]).

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

Discussions similaires

  1. Problème de lecture/écriture de fichier
    Par gobelet dans le forum C++
    Réponses: 1
    Dernier message: 19/05/2011, 15h49
  2. Réponses: 47
    Dernier message: 28/01/2007, 19h39
  3. Réponses: 4
    Dernier message: 23/10/2006, 16h17
  4. lecture écriture dans un fichier
    Par poukill dans le forum C++
    Réponses: 9
    Dernier message: 23/05/2006, 11h02
  5. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15

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