2012-12-04 30 views
2

我有一個應用程序,我正在使用該代碼來解密已加密的文件。文件位置是「/mnt/sdcard/myfolder/test.mp4」。 test.mp4文件大小約爲20MB。如何在android中加密大視頻文件

當我使用下面的代碼來解密小尺寸的加密文件時,這些文件被成功解密,但是當我試圖解密大視頻文件時,發生了outOfMemoryException的異常。

下面是代碼:

FileOutputStream fos = new FileOutputStream(outFilePath); 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     byte[] keyBytes= new byte[16]; 
     //byte[] b= key.getBytes(Charset.forName("UTF-8")); 
     byte[] b= key.getBytes("UTF-8"); 
     Log.i("b",""+b); 
     int len= b.length; 
     Log.i("len",""+len); 
     if (len > keyBytes.length) len = keyBytes.length; 
     System.arraycopy(b, 0, keyBytes, 0, len); 
     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
     IvParameterSpec ivSpec = new IvParameterSpec(keyBytes); 
     cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec); 

     byte[] results = new byte[cipher.getOutputSize(abc.length)]; 

     try 
     { 
      Log.i("output size:", ""+cipher.getOutputSize(abc.length)); 
      ***results = cipher.doFinal(abc);*** 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
      Log.e("EXCEPTION:", e.getMessage()); 
     } 
     fos.write(results); 

注:byte[] abc = new byte[64];包含輸入字節數組。

+0

很明顯,這不是真正的代碼。 –

+0

此代碼創建問題:results = cipher.doFinal(abc); – Maddy

回答

1

從你的問題,或者至少從你發佈的代碼,沒有什麼會促成OutOfMemoryException,特別是因爲abc只有64字節長。但是你說你在處理大文件時會遇到異常。所以我的推論,

你的代碼中的某個地方(而不是張貼部分),你試圖讀取完整的文件到任何數組,或試圖將其保存在數組中。 Android對應用程序施加了內存限制(大多數設備爲16 MB),這個限制包括用於UI元素的內存。所以你沒有太多的記憶可供你玩。

現在,理想情況下,您應該做的是創建一個解密塊,該解碼塊適用於流。 CipherInputStream看起來很有希望。和this stackoverflow線程,如果你正在考慮使用CipherInputStream可能會感興趣。

+0

你可以告訴我,如果有任何解決方案嗎? – Maddy

+0

@Maddy再次,您的發佈代碼中沒有任何內容會導致OutOfMemory異常。如果你想讀一個大的視頻文件並解密,你唯一的選擇就是使用流。您無法從文件中讀取整個字節並將其存儲在數組中。你見過我發佈的堆棧溢出線程嗎?在那裏,他們正在讀解密後創建一個位圖..你可能需要做這樣的事情.. – Krishnabhadra

+2

是啊..,我明白了..你是否想說這樣的話:這個鏈接對你有幫助嗎?http: //sackoverflow.com/questions/9496447/encryption-of-video-files – Maddy