通过位切换混淆JPG-Android上的读取性能

通过位切换混淆JPG-Android上的读取性能,android,performance,image-processing,Android,Performance,Image Processing,摘要: 从文件中读取图像 通过切换位使预览工具无法使用 无法使用加密,需要的电量太大 我可以优化下面的代码,还是有更好的方法 详细描述: 我正在努力改进我的代码,也许您对以下情况有一些想法或改进。请注意,我既不想打败中情局,也不在乎是否有人“刹车”加密 背景很简单:我的应用程序将一堆图像从服务器加载到SD卡上的文件夹中我不希望图像是简单的JPG文件,因为在这种情况下,媒体索引器会在库中列出它们,用户只需将整个文件夹复制到硬盘上即可 显而易见的方法是加密。但是全面的AES或其他加密是没有意义的

摘要:

  • 从文件中读取图像
  • 通过切换位使预览工具无法使用
  • 无法使用加密,需要的电量太大
  • 我可以优化下面的代码,还是有更好的方法
详细描述:

我正在努力改进我的代码,也许您对以下情况有一些想法或改进。请注意,我既不想打败中情局,也不在乎是否有人“刹车”加密

背景很简单:我的应用程序将一堆图像从服务器加载到SD卡上的文件夹中我不希望图像是简单的JPG文件,因为在这种情况下,媒体索引器会在库中列出它们,用户只需将整个文件夹复制到硬盘上即可

显而易见的方法是加密。但是全面的AES或其他加密是没有意义的,原因有两个:我必须将密钥存储在应用程序中,这样任何人都可以通过一些努力获得密钥。而且动态解密图像的价格太高了(我们指的是一个拥有30张200kB图片的画廊)

所以我决定在图像中切换一些位。这使得图像工具(或预览)无法读取该格式,但在读取图像时很容易撤消。对于“加密”,我使用一些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();

    }

}

你对所选择的方法有什么反馈吗?有没有办法对其进行优化,或者对Android设备采用完全不同的方法?

您可以尝试使用快速PRNG的输出对ByTestStream进行XORing。只需为每个文件使用不同的种子,您就完成了


注意:正如问题中已经提到的,这种方法很容易绕过。

您可以尝试使用快速PRNG的输出对ByTestStream进行XORing。只需为每个文件使用不同的种子,您就完成了


注意:正如问题中已经提到的,这种方法很容易绕过。

老实说,如果您需要在中执行所有操作,请确保它没有索引,并且在没有文件扩展名的情况下存储它。否则,每次强制应用程序从外部服务器下载。抱歉,不可能。总下载量为150MB,超过1000张图片。没有文件扩展名这么简单,普通用户只需进行批量重命名即可-好的,只有5%的用户知道这一点,但仍然如此。在图片上稍微切换一下,99.99%的用户无法使用这些图片-程序员可以解决这个问题,但他们无论如何可以通过反编译应用程序-我只是想找到合适的“版权保护级别”-这很糟糕,但你必须赚些钱:-)也许你的问题是超过150MB的图片。。。这是一个真正的问题,它的目的是:-)这是一个有1000多张高质量图片的口述记录,应该可以脱机工作。如果只有几个,我不在乎有没有人复制它们。但是我们为这些图片付费,所以我们至少需要对它们进行一点保护——不像Fort Knox那样——但是简单的复制和重命名应该不起作用。老实说,如果你需要做的只是确保它没有索引,请将其存储在没有文件扩展名的情况下。否则,每次强制应用程序从外部服务器下载。抱歉,不可能。总下载量为150MB,超过1000张图片。没有文件扩展名这么简单,普通用户只需进行批量重命名即可-好的,只有5%的用户知道这一点,但仍然如此。在图片上稍微切换一下,99.99%的用户无法使用这些图片-程序员可以解决这个问题,但他们无论如何可以通过反编译应用程序-我只是想找到合适的“版权保护级别”-这很糟糕,但你必须赚些钱:-)也许你的问题是超过150MB的图片。。。这是一个真正的问题,它的目的是:-)这是一个有1000多张高质量图片的口述记录,应该可以脱机工作。如果只有几个,我不在乎有没有人复制它们。但是我们为这些图片付费,所以我们至少需要对它们进行一点保护——不像诺克斯堡那样——但简单的复制和重命名应该不起作用。我不理解这种方法。这会加快速度吗?或者让它更难“破解”——总是在第一个位置切换可能不太安全,但我想更快。如前所述,如果你想打败这种加密,那是小菜一碟。但我说的是一个只知道“文件”而不知道“字节”的人——所以如果我以某种方式阻止他的JPG(在每个字节上切换第1位),这就足够了。只有一个想法,也许它足够切换前10个字节中的第一位,然后保持原样。可能会加快速度,但计数器检查可能比简单的“全部切换”更昂贵。使用FF D8方法。工作很好,只需将整个图像作为字节数组读取,纠正两个断开的字节,然后将其交给BitmapFactory即可。谢谢你的主意。我不懂这个方法。这会加快速度吗?或者让它更难“破解”——总是在第一个位置切换可能不太安全,但我想更快。如前所述,如果你想打败这种加密,那是小菜一碟。但我说的是一个只知道“文件”而不知道“字节”的人——所以如果我以某种方式阻止他的JPG(在每个字节上切换第1位),这就足够了。只有一个想法,也许它足够切换前10个字节中的第一位,然后保持原样。可能会加快速度,但计数器检查可能比简单的“全部切换”更昂贵。使用FF D8方法。工作很好,只需将整个图像作为字节数组读取,纠正两个断开的字节,然后将其交给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;