Зашифруйте и расшифруйте файл в J2ME - PullRequest
2 голосов
/ 12 сентября 2009

У меня проблема с расшифровкой зашифрованного файла в 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 Ответ

6 голосов
/ 13 сентября 2009

Я вижу одну проблему. Вы пишете test.encrypt файл как писатель (который преобразует каждый байт в символ, удваивая его) Вы читаете его обратно как InputStream, который считывает байты. Таким образом, ваши зашифрованные данные повреждены.

...