2012-02-29 35 views
3

我有这个代码来加密视频文件。加速加密?

public static void encryptVideos(File fil,File outfile) 
{ 
    try{ 
    FileInputStream fis = new FileInputStream(fil); 
    //File outfile = new File(fil2); 
    int read; 
    if(!outfile.exists()) 
     outfile.createNewFile(); 
    FileOutputStream fos = new FileOutputStream(outfile); 
    FileInputStream encfis = new FileInputStream(outfile); 
    Cipher encipher = Cipher.getInstance("AES"); 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    //byte key[] = {0x00,0x32,0x22,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
    SecretKey skey = kgen.generateKey(); 
    //Lgo 
    encipher.init(Cipher.ENCRYPT_MODE, skey); 
    CipherInputStream cis = new CipherInputStream(fis, encipher); 
    while((read = cis.read())!=-1) 
     { 
     fos.write(read); 
     fos.flush(); 
     } 
    fos.close(); 
    }catch (Exception e) { 
    // TODO: handle exception 
    } 
} 

但我使用的文件非常大,使用这种方法需要很多时间。 我该如何加快速度?

+0

Encyrption是资源密集型的。整个想法是,你正在以一种复杂的方式破坏内容。 – mcfinnigan 2012-02-29 11:08:54

+0

你得到什么样的速度?你有没有尝试*映射*文件,并在ByteBuffer的返回(ps不知道,如果这可能为android,忽略标签)执行加密? – 2012-03-01 00:45:26

+0

我是新手我不知道它的可能 – Navdroid 2012-03-01 05:19:46

回答

5

嗯,这看起来开始很慢:

while((read = cis.read())!=-1) 
{ 
    fos.write(read); 
    fos.flush(); 
} 

您正在阅读并一次写入单个字节,并刷新流。做一个缓冲在一个时间:

byte[] buffer = new byte[8192]; // Or whatever 
int bytesRead; 
while ((bytesRead = cis.read(buffer)) != -1) 
{ 
    fos.write(buffer, 0, bytesRead); 
} 
fos.flush(); // Not strictly necessary, but can avoid close() masking issues 

另外请注意,你只关闭fos(不cisfis),并且你应该关闭所有的人都在finally块。

+0

我的文件大约是300MB,这个方法使得它比以前更慢 – Navdroid 2012-02-29 11:20:52

+2

@Navdroid:这比读取和写入单个字节的速度慢*我觉得很难相信。 – 2012-02-29 11:29:30

+0

我是新来的这个先生..我也发现这个令人困惑但是旧的方法比你的方法更快... – Navdroid 2012-02-29 11:32:13

2

您可以使用android NDK使用C++编写应用程序的这一部分,以获得显着的性能提升。这看起来像会从中受益的那种情况。而且NDK可能已经有了类似的东西。