Одновременное чтение / запись Android Encryption дополнительные байты и повторы - PullRequest
2 голосов
/ 17 марта 2011

В настоящее время я пытаюсь выполнить чтение, шифровать и шифровать один и тот же файл одновременно (по соображениям безопасности).Код, который я написал ниже, почти достигает этого, но добавляет дополнительные байты в расшифрованный файл.Метод дешифрования почти точен, за исключением того, что c.init находится в DECRYPT_MODE.

    public static void encryptFile(String path, byte[] key) throws Exception {

    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec k = new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    RandomAccessFile raf = new RandomAccessFile(path, "rw");

    byte[] buf = new byte[256];
    byte[] output;
    int bytesRead = 0;
    int totalBytes = 0;
    while ((bytesRead = raf.read(buf)) >= 0) {
        int len = buf.length;
        if (bytesRead < len) {
            byte[] out2 = c.doFinal(buf, 0 , bytesRead);
            raf.seek(totalBytes);
            raf.write(out2);
        } else {
        output = c.update(buf, 0, bytesRead);
        raf.seek(totalBytes);
        raf.write(output);
        }
        totalBytes += bytesRead;
        }
    raf.getFD().sync();
    raf.close();
    }

Расшифрованный пример

Некоторые выпускники могут в конечном итоге выплатить двойнуюисходные студенческие ссуды в рамках новой системы оплаты в Англии, цифры, рассчитанные для BBC, предполагают.

Цифры ведущих бухгалтеров показывают, что студент заимствовал 39 000 фунтов стерлингов на трехлетний курс \ ܯ] £ ^* z§DþÒÐùN \ ܯ] £ ^ * z§DþÒÐùНегодичный курс Повторный годовой курс может окупить в общей сложности до 83 000 фунтов стерлингов в денежном выражении.

При режиме, который должен начаться в 2012 году, выпускники будут выплачивать 9% своего заработка на срок до 30 лет.

Правительство заявляет, что система является справедливой, и с 2012 года она не может взимать до 9 000 фунтов стерлингов в год, чтобудет оплачено правительством заранее, но выплачено, как только студент начнет зарабатывать 21 000 фунтов стерлингов или больше.

Это отлаживает и функционирует, как я и ожидал, я все еще не понимаю, как эти байты / повторенияснова здесь.(Возможно заполнение или неправильный doFinal) Любые предложения будут с благодарностью:] Спасибо!

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Хорошо, похоже, выдано, что я не принимаю во внимание, что последние 16 байтов каждого обновления добавлялись к следующему вызову. Добавляя 16 байтов в raf.seek, мы остаемся в соответствии с данными и правильно добавляем doFinal. Также использование output.length, по-видимому, дает правильные параметры указателю файла. Md5s in и output являются точными, поэтому, похоже, работает! :] функция расшифровки использует raf.setLength (totalBytes + output.length);

    public static void encryptFile(String path, byte[] key) throws Exception {

    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec k = new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    RandomAccessFile raf = new RandomAccessFile(path, "rw");

    byte[] buf = new byte[128];
    int bytesRead = 0;
    int totalBytes = 0;
    byte[] output;
    while ((bytesRead = raf.read(buf)) >= 0) {
        output = c.update(buf, 0, bytesRead);
        raf.seek(totalBytes);
        raf.write(output);
        totalBytes += output.length;
        raf.seek(totalBytes+16);
    }
    output = c.doFinal();
    raf.seek(totalBytes);
    raf.write(output);
    raf.getFD().sync();
    raf.close();

}
0 голосов
/ 17 марта 2011

Если исходный файл имеет длину L, то зашифрованный файл будет иметь длину L+delta из-за заполнения. Затем, когда вы расшифруете его на месте, вы запишете L правильных байтов, но в конце файла останется delta байтов.

Если вы позвоните raf.setLength(totalBytes) после цикла while, вы должны получить правильный результат.

...