0

我需要解密 6 MB 字节 []。

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

这段代码在我的 Galaxy 2 上运行良好,但是当我在只有 16mb 堆的 HTC Legend 上运行它时,我得到了 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 回答