3

通常のエンドユーザーが一部のファイルに簡単にアクセスできないように、単純な種類の暗号化を行う必要があります。

FileInputStream によって読み取られるファイルは、html ファイル、png、jpeg、およびさまざまな単純なテキスト ファイル (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 MB を超えるビットマップについて話します)。

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 を使用しているため、書き込み中に大量のメモリを使用しています。

必要なメモリ量を減らしたい場合は、ByteArrayOutputStream ではなく FileOutputStream に直接書き込むことをお勧めします。そのため、InputStream から DEFAULT_BUFFER_SIZE を読み取るときに、暗号化してディスクに書き込みます。

于 2011-09-27T18:58:10.200 に答える