Измените байты, прочитанные InputStream во время чтения, а не позже - PullRequest
3 голосов
/ 27 сентября 2011

Мне нужно сделать простое шифрование, чтобы обычный конечный пользователь не мог легко получить доступ к некоторым файлам.

Файлы, которые считываются FileInputStream, являются html-файлами, pngs, jpegs и различными простыми текстовыми файлами (javascript, xml, ...)

Что я сейчас делаю, так это:

public static byte[] toEncryptedByteArray(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    copy(input, output, true);
    return output.toByteArray();
}

public synchronized static final int copy(final InputStream input, final OutputStream output, final boolean modify) throws IOException {
    if (input == null || output == null) {
        throw new IOException("One stream is null!");
    }
    byte[] mBuffer = new byte[DEFAULT_BUFFER_SIZE];
    int count = 0;
    int n;
    while ((n = input.read(mBuffer)) != -1) {
        if (modify) {
            for ( int i = 0 ; i < n ; i++ ) {
                mBuffer[i] = (byte) ~mBuffer[i]; // byte manipulation
            }
        }
        output.write(mBuffer, 0, n);
        output.flush();
        count += n;
    }
    mBuffer = null;
    return count;
}

Объем памяти огромен, так как в моей памяти есть полный массив байтов (мы говорим о растровых изображениях с> 2 МБ в памяти).

Я подумал, что мог бы просто расширить класс FileInputStream и выполнять манипулирование байтами при чтении содержимого файла. Это уменьшило бы использование памяти, так как я мог бы использовать Bitmap.decodeStream(inputstream) вместо создания байтового массива для получения растрового изображения ... но здесь я застрял полностью. Методы read() и readBytes(...) являются родными, поэтому я не могу их переопределить.

Пожалуйста, распространите свет в моей тьме ...

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Потоки предназначены для переноса. Вот почему вы часто видите такие строки:

InputStream is=new BufferedInputStream(new FileInputStream(file));

Итак, создайте DecryptingInputStream, который выполняет расшифровку, оборачивая вокруг InputStream.

С учетом всего вышесказанного взломать не составит труда, поскольку ваши ключи и алгоритм дешифрования будут легко определены любым, кто декомпилирует ваше приложение.

0 голосов
/ 27 сентября 2011

FileInputStream не является вашей проблемой. Функция read () не будет считывать больше, чем DEFAULT_BUFFER_SIZE при каждом вызове. Вы используете ByteArrayOutputStream, который занимает много памяти, когда вы пишете в него.

Если вы хотите уменьшить объем требуемой памяти, я предлагаю вам записать непосредственно в FileOutputStream вместо ByteArrayOutputStream. Так что шифруйте и записывайте на диск, когда вы читаете DEFAULT_BUFFER_SIZE из InputStream.

...