Обфусцируйте JPG с помощью переключателя битов - производительность чтения на Android - PullRequest
2 голосов
/ 22 декабря 2011

Аннотация:

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

Более подробное описание:

Я пытаюсь улучшить свой код, может быть, у вас есть идеи или улучшения для следующей ситуации. Пожалуйста, имейте в виду, что я не пытаюсь победить ЦРУ и не беспокоюсь, если кто-то «затормозит» шифрование.

Фон прост: мое приложение загружает кучу изображений с сервера в папку на SD-карте. Я НЕ хочу, чтобы изображения были простыми файлами JPG , потому что в этом случае индексатор мультимедиа занесет их в библиотеку, и пользователь может просто скопировать всю папку на свой жесткий диск.

Очевидный путь - шифрование. Но полноценное шифрование AES или другое шифрование не имеет смысла по двум причинам: мне пришлось бы хранить пароль в приложении, чтобы любой мог получить ключ в любом случае. И цена дешифрования изображений на лету слишком высока (речь идет, например, о галерее с 30 изображениями по 200 КБ).

Поэтому я решил переключить некоторые биты в изображении . Это делает формат нечитаемым для инструментов изображения (или превью), но довольно легко отменяется при чтении изображений. Для «шифрования» я использую какой-то инструмент C #, строки «расшифровывать» следующие:

public class CustomInputStream extends InputStream {
    private String _fileName;
    private BufferedInputStream _stream;


    public CustomInputStream(String fileName) {
        _fileName = fileName;
    }

    public void Open() throws IOException {
        int len = (int) new File(_fileName).length();
        _stream = new BufferedInputStream(new FileInputStream(_fileName), len);
    }


    @Override
    public int read() throws IOException {
        int value = _stream.read() ^ (1 << 7);
        return value;
    }


    @Override
    public void close() throws IOException {
        _stream.close();

    }

}

Я также пытался перезаписать другие методы (прочитанные более чем одним байтом), но это убивает BitmapFactory - не уверен почему, может быть, я сделал что-то не так. Вот код для создания растрового изображения:

Bitmap bitmap = null;
try {
    InputStream i = CryptoProvider.GetInstance().GetDecoderStream(path);
    bitmap = BitmapFactory.decodeStream(i);
    i.close();
} catch (Exception e1) {
    _logger.Error("Cant load image " + path + " ERROR " + e1);
}
if (bitmap == null) {
    _logger.Error("Image is NULL for path " + path);
}
return bitmap;

Есть ли у вас какие-либо отзывы о выбранном подходе? Любой способ оптимизировать его или совершенно другой подход для устройств Android?

1 Ответ

0 голосов
/ 22 декабря 2011

Вы можете попробовать XORing потока байтов с выходом быстрого PRNG. Просто используйте разные семена для каждого файла, и все готово.

примечание: как уже отмечалось в вопросе, такие методы тривиальны для обхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...