2009-09-12 5 views
2

탄력성을 사용하여 J2ME에서 암호화 된 파일의 암호 해독에 문제가 있습니다. 내가하려는 것은 암호화 할 파일을 선택하고 암호화 된 파일을 작성한 다음 원래 형식으로 다시 해독하려고합니다 (확인을 위해 다른 파일에 쓰기).J2ME에서 파일 암호화 및 암호 해독

암호화 된 파일을 읽을 때이 오류가 발생합니다.

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

마지막 기능은 예외가 발생합니다 : 여기

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) 

내 코드의 일부입니다.

답변

6

하나의 문제점이 있습니다. Writer로 test.encrypt 파일을 작성합니다 (각 바이트를 char로 변환하여 두 배로 만듭니다). 바이트를 읽는 InputStream으로 다시 읽습니다. 따라서 암호화 된 데이터가 손상되었습니다.

+1

+1 - 멋진 캐치. –

+0

Thx 남자 ... 내 문제를 해결합니다. –