在J2ME中加密和解密文件

sim*_*sew 2 encryption file-io bouncycastle java-me

我在使用充气城堡在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)
Run Code Online (Sandbox Code Playgroud)

以下是我的代码的一部分:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个函数将抛出异常.

ZZ *_*der 6

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