3

我需要进行一种简单的加密,以使普通最终用户无法轻松访问某些文件。

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;
}

内存占用很大,因为我的内存中有完整的字节数组(我们谈论内存中大于 2mb 的位图)。

我想我可以简单地扩展 FileInputStream 类并在读取文件内容时进行字节操作。这将减少内存使用量,因为我可以使用Bitmap.decodeStream(inputstream)而不是创建一个字节数组来从中获取位图......但在这里我完全被卡住了。read()和方法是本readBytes(...)机的,所以我不能覆盖它们。

请在我的黑暗中传播光明...

4

2 回答 2

2

流被设计为包装。这就是为什么你经常看到这样的行:

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

因此,创建一个DecryptingInputStream进行解密的InputStream.

话虽如此,这并不难破解,因为任何反编译您的应用程序的人都可以轻松确定您的解密密钥和算法。

于 2011-09-27T18:25:17.813 回答
0

FileInputStream 不是你的问题。read() 函数在每次调用时读取的内容不会超过 DEFAULT_BUFFER_SIZE。这是您对 ByteArrayOutputStream 的使用,它在您写入时占用了大量内存。

如果您想减少所需的内存量,那么我建议您直接写入 FileOutputStream 而不是 ByteArrayOutputStream。因此,当您从 InputStream 中读取 DEFAULT_BUFFER_SIZE 时,请加密并写入磁盘。

于 2011-09-27T18:58:10.200 回答