我正在尝试加密一个巨大的.txt文件,问题是解密非常慢,我尝试了不同模式的AES、DES、3DES、BlowFish算法,但解密仍然很慢
这是我的代码:
static
{
try
{
//ciphers initialization
SecretKey secretKey = THE_KEY;
//Decryption cipher
Cipher dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] ivDec = new byte[dec.getBlockSize()];
IvParameterSpec ivparDec = new IvParameterSpec(ivDec);
dec.init(Cipher.DECRYPT_MODE, secretKey,ivparDec);
//Encryption cipher
Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[enc.getBlockSize()];
IvParameterSpec ivpar = new IvParameterSpec(iv);
enc.init(Cipher.ENCRYPT_MODE, secretKey,ivpar);
}
catch (Exception e){e.printStackTrace();}
}
这是加密/解密方法:
public static String encrypt (String data)
{
String encData = null;
byte [] arr = null;
try
{
arr = enc.doFinal(data.getBytes("UTF-8"));
//convert to base 64
String base64 = Base64.encodeBase64String(arr);
encData = base64;
}
catch(Exception e){e.printStackTrace();}
return encData;
}
public static String decrypt (String data)
{
String decData = null;
byte [] arr = null;
try
{
//convert base64 to bytes[]
byte[] base64 = Base64.decodeBase64(data);
arr = dec.doFinal(base64);
decData = new String(arr,Charset.forName("UTF-8"));
}
catch(Exception e){e.printStackTrace();}
return decData;
}
如何提高此代码的性能?
最佳答案
首先,您应该尝试流式传输您的数据,或者 - 更好 - 使用 java.nio
使用 Cipher.update
映射您的文件。然后您可以直接加密/解密二进制数据。如果数据不适合可用 RAM,则读取内存中的所有内容可能会导致磁盘损坏,甚至出现内存不足错误。
将明文转换为 String
会让事情变得更糟,特别是因为 Oracle 的 Java(9 之前)在内部使用 16 位字符作为 ASCII。如果您首先要将其存储为二进制文件,则不需要将其编码为 Base 64。 Base 64 会增加更多的内存开销。
您的运行时间会带来很大的不同。 Oracle 提供的最新运行时具有大量性能改进,因此请确保运行最新的服务器 VM,以便可以使用 AES-NI 内在函数等功能。
关于java加密性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39497369/