Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AES加密的Android内存不足异常_Java_Android_Encryption - Fatal编程技术网

Java 使用AES加密的Android内存不足异常

Java 使用AES加密的Android内存不足异常,java,android,encryption,Java,Android,Encryption,以下是我的源代码: public static byte[] encrypt(byte[] Data) throws Exception { Log.i("Debug", "initial data is" + java.util.Arrays.toString(Data)); Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.ENCRYPT_MODE, key

以下是我的源代码:

public static byte[] encrypt(byte[] Data) throws Exception {
    Log.i("Debug", "initial data is" + java.util.Arrays.toString(Data));

    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGO);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(Data);

    Log.i("Debug", "encrypted data is" + java.util.Arrays.toString(encVal));
     ;
    return Base64.encode(encVal,0);
   }
当byte[]数据的数据长度大约为800 kb时,我会继续接收

     java.lang.OutOfMemoryError

您能帮助我如何更改代码以避免此问题吗?我必须使用base64编码,以避免解密时出现不完整块的错误。

一个问题是您正在进行的日志记录-通过将数据转换为字符串,您可能每个字节最多使用5个字符,每个字符为2个字节,因此每个原始字节的内存使用量为10个字节。然后使用字符串连接,因此所需的内存量(由于复制)增加了一倍

因此,我怀疑仅仅是日志记录语句就占用了大约16MB的内存。记录完整的800KB阵列对您真的有用吗


如果删除日志语句会发生什么情况?

谢谢,我将尝试删除它们,我只是记录日志以确保初始数组和解密数组相同。避免这种情况的最佳方法是使用经过身份验证的加密模式,如GCM(如果可用,请尝试Bouncy Castle库)。这增加了密文的完整性。或者,您可以记录并比较加密前后数据上的SHA-256结果。通过这种方式,您可以在不泄露纯文本的情况下进行比较(除非纯文本与以前的纯文本相同)。