views:

628

answers:

2

Hi guys. I'm having problem decrypting an encrypted file in J2ME using bouncy castle. What I'm trying to do is select a file to encrypt,write the encrypted file and try decrypt it back to its orginal form (write to another file for verification purpose).

I have this error when reading the encrypted file.

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)

Here are part of my 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();
    }
}

the last function will throw the exception.

Can anyone tell me what is wrong with my code?

Thanks. Simon

+4  A: 

I can see one problem. You write test.encrypt file as writer (which converts each byte into char, doubling it). You read it back as InputStream, which reads out bytes. So your encrypted data is corrupted.

ZZ Coder
+1 - nice catch.
James Black
Thx man...it solves my problem.
simon sew
A: 

how did you get the problem rectified Simon?

rahul