2009-09-12 128 views
2

我在使用弹性城堡的J2ME中解密加密文件时出现问题。 我想要做的是选择一个文件进行加密,写入加密文件并尝试将其解密回其原始形式(写入另一个文件以进行验证)。在J2ME中加密和解密文件

我在阅读加密文件时发生此错误。

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) 

这里是我的代码部分:

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(); 
    } 
} 

的最后一个函数会抛出异常。

回答

6

我可以看到一个问题。您将test.encrypt文件编写为writer(将每个字节转换为char,将其加倍)。您将其读回为InputStream,它读出字节。所以你的加密数据已损坏。

+1

+1 - 很好的捕获。 – 2009-09-13 01:35:57

+0

Thx man ... 它解决了我的问题。 – 2009-09-20 14:36:22