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

Entrée/Sortie Java Discussion :

StreamCorruptedException lors d'un readObject


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut StreamCorruptedException lors d'un readObject
    Salut à tous,
    J'ai un problème avec une méthode readObject : mon programme génère un object KeyPair, l'écrit dans un fichier avec la méthode writeObject de ObjectOutputStream, puis je crypte ce fichier avec l'algorithme Password Based Encryption. Plus tard, je veux réutiliser cet object KeyPair alors je décrypte le fichier, sauvegarde dans un autre fichier le contenu obtenu et utilise la méthode readObject sur ce dernier fichier générer. Et là il y a une StreamCorruptedException avec comme message : invalide type code 00. Je pense qu'il me décrypte mal mon fichier, voiçi le code pour générer l'object Cipher :
    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
    public static Cipher getPBECipher(int mode) throws Exception {
    		PBEKeySpec keySpec = new PBEKeySpec(
    				"mysecretsentence".toCharArray());
    		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES", "SunJCE");
     
    		MessageDigest md = MessageDigest.getInstance("MD5");
    		md.update("mysecretsentence".getBytes());
     
    		byte[] digest = md.digest();
    		byte[] salt = new byte[8];
     
    		for(int i = 0; i < 8; i++) {
    			salt[i] = digest[i];
    		}
     
    		Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
    		cipher.init(mode, keyFactory.generateSecret(keySpec),
    				new PBEParameterSpec(salt, 20));
     
    		return cipher;		
    	}
    Pourtant, à la lecture en mode texte, même si c'est pas une référence, les 2 fichiers ont l'air d'être identique.
    Merci.

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Donc selon les rares docs que j'ai trouvé, le problème serait que le fichier objet serait corrompu. Mais je ne comprend pourquoi, j'ai crypter/décypter avec le même hash MD5. Vous pensez que le fait de crypter/décrypter le fichier peut le corrompre ?!

  3. #3
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Bon je continu mon monologue explicatif puisque personne ne semble pouvoir me répondre : après plusieurs tests et recherches, je me suis rendu compte que le problème pouvait venir de CipherInputStream. Voiçi le bout de code responsable :
    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
    in = new CipherInputStream(
    						new BufferedInputStream(
    								new FileInputStream("test_2.txt")), cipher);
     
    				out =
    					new BufferedOutputStream(new FileOutputStream(
    							(outputFile = new File("test_3.txt"))));
     
    				int length = (int)new File("test_2.txt").length();
    				byte data[] = new byte[length];				
     
    				System.out.println("Length : " + length);
     
    				int read = in.read(data, 0, length);
     
    				for(int j = 0; j < length; j++) {
    					System.out.print(data[j] + " ");
    				}
    				System.out.println("\nRead : " + read);
    				out.write(data);
    				out.flush();
     
    				out.close();
    				in.close();
    Voiçi ce que la console me sort :
    Length : 35
    67 101 99 105 32 101 115 116 32 117 110 32 116 101 115 116 46 32 80 111 117 114 113 117 0 0 0 0 0 0 0 0 0 0 0
    Read : 24
    Le fichier d'origine est :
    Ceci est un test. Pourquoi ça bug ?
    Mais lors du décryptage, il me donne ça :
    Ceci est un test. Pourqu
    On remarque donc qu'il ne m'a pas écrit les quelques octets restants comme le prouve la sortie console puisque les 11 derniers bytes sont restés à zéro. Le problème semble venir donc de la méthode read mais je ne comprend vraiment pas pourquoi. Tout semble correct du point de vue de la syntaxe non ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/07/2010, 14h14
  2. Réponses: 2
    Dernier message: 21/05/2008, 10h41
  3. [Socket et serialization] Plantage lors d'un readObject
    Par KKshi666 dans le forum Langage
    Réponses: 5
    Dernier message: 29/10/2007, 11h31
  4. Réponses: 5
    Dernier message: 06/08/2002, 20h08
  5. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 10h31

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