2009-09-12 8 views
2

J'ai un problème pour décrypter un fichier crypté dans J2ME en utilisant le château gonflable. Ce que j'essaie de faire est de sélectionner un fichier à chiffrer, d'écrire le fichier chiffré et de le déchiffrer à sa forme originale (écrire dans un autre fichier à des fins de vérification).Crypter et décrypter le fichier dans J2ME

J'ai cette erreur lors de la lecture du fichier crypté.

Stack Trace : 
s: pad block corrupted 
     at j.a(+219) 
     at e.c(+38) 
     at e.b(+30) 
     at com.aaron.midlets.BluetoothServerMidlet.c(+134) 
     at com.aaron.midlets.BluetoothServerMidlet.b(+161) 
     at com.aaron.midlets.BluetoothServerMidlet.a(+67) 
     at com.aaron.midlets.BluetoothServerMidlet.startApp(+105) 
     at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:43) 
     at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:374) 
     at com.sun.midp.main.Main.runLocalClass(Main.java:466) 
     at com.sun.midp.main.Main.main(Main.java:120) 

Voici une partie de mon code:

private void createEncryptFile() { 
    FileConnection fc = FileListingUtil.getFile("root1/", "test.encrypt"); 
    try { 
     fc.create(); 
     readAndEncrypt(); 
    } catch (Exception e) { 
    } 
} 

private void readAndEncrypt() { 
    FileConnection fc = FileListingUtil.getFile("root1/", "test.original"); 
    FileConnection fc2 = FileListingUtil.getFile("root1/", "test.encrypt"); 

    try { 
     InputStream test = fc.openDataInputStream(); 
     OutputStreamWriter output = new OutputStreamWriter(fc2.openOutputStream()); 

     int fileSize = (int) fc.fileSize(); 
     byte[] imgData = new byte[fileSize]; 

     int bytesRead = 0; 
     while (bytesRead < fileSize) { 
      bytesRead += test.read(imgData, bytesRead, fileSize - bytesRead); 
     } 

     EncryptorUtil util = new EncryptorUtil("12345678"); 
     try { 
      byte[] dataE = util.encrypt(imgData); 
      for (int y = 0; y < dataE.length; ++y) { 
       output.write((int) dataE[y]); 
      } 
     } catch (CryptoException ex) { 
      ex.printStackTrace(); 
     } 
     test.close(); 
     output.close(); 

     createDecryptFile(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

private void createDecryptFile() { 
    FileConnection fc = FileListingUtil.getFile("root1/", "test.decrypt"); 
    try { 
     fc.create(); 
     readAndDecrypt(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void readAndDecrypt() { 
    FileConnection fc = FileListingUtil.getFile("root1/", "test.encrypt"); 
    FileConnection fc2 = FileListingUtil.getFile("root1/", "test.decrypt"); 

    try { 
     InputStream test = fc.openDataInputStream(); 
     OutputStreamWriter output = new OutputStreamWriter(fc2.openOutputStream()); 

     int fileSize = (int) fc.fileSize(); 
     byte[] imgData = new byte[fileSize]; 

     int bytesRead = 0; 
     while (bytesRead < fileSize) { 
      bytesRead += test.read(imgData, bytesRead, fileSize - bytesRead); 
     } 

     EncryptorUtil util = new EncryptorUtil("12345678"); 

     try { 
      byte[] dataE = util.decrypt(imgData); 
      for (int y = 0; y < dataE.length; ++y) { 
       output.write((int) dataE[y]);     
      } 
     } catch (CryptoException ex) { 
      ex.printStackTrace(); 
     } 
     test.close(); 
     output.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

la dernière fonction jeter l'exception.

Répondre

6

Je peux voir un problème. Vous écrivez le fichier test.encrypt en tant qu'écrivain (qui convertit chaque octet en caractère char, le doublant). Vous le lisez en tant que InputStream, qui lit les octets. Ainsi, vos données cryptées sont corrompues.

+1

+1 - belle prise. –

+0

Thx man ... il résout mon problème. –