0

6 MB バイト [] を復号化する必要があります。

Cipher pbeCipher = Cipher.getInstance("AES/CTS/NoPadding");
// Initialize cipher
pbeCipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
doFinal(data);

このコードは Galaxy 2 では問題なく動作しますが、ヒープが 16 MB しかない HTC レジェンドで実行すると、OutOfMemory 例外が発生します。

そこで、データをチャンクに分割することにしましたが、このコードが機能しないため、おそらく何か間違ったことをしているのでしょう。私が間違っていることを見つけるのを手伝ってもらえますか?

byte[] result = null;

      while (data.length> offset )
      {               
         concatenateByteArrays(result, cipher.update(Arrays.copyOfRange(data, offset, offset+MB)));      
         offset+=MB;
      }
 return  concatenateByteArrays(result,cipher.doFinal());
4

1 に答える 1

1

データ長がMBの倍数でない場合、コードはデータの処理を忘れると思います。このバージョンは正しく機能します(私のコードが簡潔でない場合は申し訳ありませんが、明確であることを願っています):

int inputLen = cipher.getBlockSize();
int inputOffset = 0;
byte[] output;
ByteArrayOutputStream outputArray = new ByteArrayOutputStream();

while(inputOffset + inputLen < input.length) {
    output = cipher.update(input, inputOffset, inputLen);
    inputOffset += inputLen;
    outputArray.write(output);
}

output = cipher.doFinal(input, inputOffset, input.length - inputOffset);
outputArray.write(output);
byte[] result = outputArray.toByteArray();
于 2013-01-31T16:29:21.083 に答える