在J2ME中加密和解密文件

时间:2009-09-12 14:07:16

标签: encryption file-io java-me bouncycastle

我在使用充气城堡在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();
    }
}

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

1 个答案:

答案 0 :(得分:6)

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