我有一个加密和解密代码,用于加密和解密视频文件(mp4)。我正在尝试加快解密过程,因为加密的过程与我的情况不太相关。这是我拥有的用于解密过程的代码:
private static void decryptFile() throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException
{
//int blockSize = cipher.getBlockSize();
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
System.out.println("outputsize: " + outputSize);
byte[] inBytes = new byte[blockSize];
byte[] outBytes = new byte[outputSize];
in= new FileInputStream(inputFile);
out=new FileOutputStream(outputFile);
BufferedInputStream inStream = new BufferedInputStream(in);
int inLength = 0;;
boolean more = true;
while (more)
{
inLength = inStream.read(inBytes);
if (inLength == blockSize)
{
int outLength
= cipher.update(inBytes, 0, blockSize, outBytes);
out.write(outBytes, 0, outLength);
}
else more = false;
}
if (inLength > 0)
outBytes = cipher.doFinal(inBytes, 0, inLength);
else
outBytes = cipher.doFinal();
out.write(outBytes);
}
我的问题是如何在这段代码中加速解密过程。我尝试过解密一个10MB的mp4文件,它在6-7秒内就能解密。然而,我的目标是<1秒。我想知道的另一件事是,我对FileOutputStream输出的写入是否真的减慢了解密过程,而不是解密过程本身。关于如何在这里加快速度的任何建议。
我正在使用AES进行加密/解密。
在找到解决方案之前,我将使用一个ProgressDialog,它告诉用户等待视频被解密(显然,我不会使用单词: decrypted)。
发布于 2011-10-10 21:28:26
为什么只按blockSize
增量解密数据?您没有显示cipher
是什么类型的对象,但我猜这是一个javax.crypto.Cipher
实例。它可以处理任意长度的数组上的update()
调用,如果使用更长的数组,开销会小得多。您应该按块处理数据,比方说,8192字节(这是缓冲区的传统长度,它与CPU内部缓存的交互相当好)。
发布于 2015-10-16 21:22:24
通过饼干,你的问题给了我过去6天来一直在尝试的答案。我只是稍微修改了一下你的代码,我的52MB视频文件在4秒内就被解密了。之前的解密技术花了45秒,这是一个不同的逻辑(不是你的)。这是45秒到4秒的巨大差异。无论我在哪里做了修改,我都会放入//修改过的注释行。我敢肯定,如果你的视频是10mb的视频,它肯定会在1秒内被解密。试着应用这个,它应该会起作用的。
private static void decryptFile() throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException
{
//int blockSize = cipher.getBlockSize();
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
System.out.println("outputsize: " + outputSize);
byte[] inBytes = new byte[blockSize*1024]; //modified
byte[] outBytes = new byte[outputSize * 1024]; //modified
in= new FileInputStream(inputFile);
out=new FileOutputStream(outputFile);
BufferedInputStream inStream = new BufferedInputStream(in);
int inLength = 0;;
boolean more = true;
while (more)
{
inLength = inStream.read(inBytes);
if (inLength/1024 == blockSize) //modified
{
int outLength
= cipher.update(inBytes, 0, blockSize*1024, outBytes);//modified
out.write(outBytes, 0, outLength);
}
else more = false;
}
if (inLength > 0)
outBytes = cipher.doFinal(inBytes, 0, inLength);
else
outBytes = cipher.doFinal();
out.write(outBytes);
}
发布于 2011-10-10 21:36:50
我建议您使用android sdk中提供的分析工具。它会告诉你你在哪里花费的时间最多(例如:文件写入或解码)。
请参阅http://developer.android.com/guide/developing/debugging/debugging-tracing.html
这在仿真器和实际设备上都有效。
https://stackoverflow.com/questions/7713166
复制相似问题