2015-01-07 20 views
5

Tôi có cơ chế mã hóa/giải mã cho các tệp đã tải xuống trong ứng dụng của mình.Không thể giải mã tập tin được mã hóa trong android lollipop

Cơ chế này hoạt động trên tất cả các thiết bị và phiên bản Android trước Android 5.0-lollipop.

Đây là quá trình giải mã:

cipher.init(Cipher.DECRYPT_MODE, key); 
fileInputStream = new FileInputStream(file); 
cipherInputStream = new CipherInputStream(fileInputStream, cipher); 
byte[] fileByte = new byte[(int) file.length()]; 
int j = cipherInputStream.read(fileByte); 
return fileByte; 

mật mã và chìa khóa đã được tạo ra trước và được sử dụng trong toàn bộ ứng dụng:

key = new SecretKeySpec(keyValue, "AES"); 
try { 
    cipher = Cipher.getInstance("AES"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Khi tôi giải mã một tập tin với khoảng 200.000 byte trong android 5.0, j (biến trước khi trở về) là khoảng 8000 mà là thấp hơn nhiều so với 200000, trong khi trong phiên bản Android cũ nó là chính xác bằng độ dài tập tin giải mã.

Tôi thấy rằng sự cố đang được giải mã. Bởi vì tôi có thể mã hóa một tập tin trong Android 5.0 và giải mã nó trong các phiên bản Android cũ hơn, nhưng không phải ngược lại. Tuy nhiên tôi gửi bài quá trình mã hóa:

cipher.init(Cipher.ENCRYPT_MODE, AESutil.key); 
cipherOutputStream = new CipherOutputStream(output, cipher); 
byte data[] = new byte[1024]; 
int count; 
while ((count = input.read(data)) != -1) { 
    cipherOutputStream.write(data, 0, count); 
} 

Cảm ơn trước

+0

dòng của bạn xử lý có vẻ khá thú vị với tôi. Việc tạo một bộ đệm có kích thước của tệp không có nghĩa là tất cả các byte đó thực sự được đọc. Và bạn dường như không đóng một cách rõ ràng luồng trong quá trình mã hóa (nhưng có thể điều đó không được bao gồm). –

+0

@ MaartenBodewes-owlstead Có tôi đã đóng chúng. Vấn đề vẫn tồn tại. –

+0

Bạn có thể đảm bảo rằng số byte đúng cũng được đọc, bằng cách đọc byte cho đến khi 'j' là' -1'? –

Trả lời

2

dụ Cipher của tôi (L):

APPPATH là String vào thư mục aplication tôi trên thẻ sd

static void encrypt(File file, String pass) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 


     FileInputStream fis = new FileInputStream(file); 


     FileOutputStream fos = new FileOutputStream(APPPATH+"/E_"+file.getName()); 


     SecretKeySpec sks = new SecretKeySpec(pass.getBytes(), "AES"); 

     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, sks); 

     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

     int b; 
     byte[] d = new byte[8]; 
     while((b = fis.read(d)) != -1) { 
      cos.write(d, 0, b); 
     } 

     cos.flush(); 
     cos.close(); 
     fis.close(); 


    } 



    static void decrypt(File file, String pass) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 

      FileInputStream fis = new FileInputStream(file); 

      FileOutputStream fos = new FileOutputStream(APPPATH+"/D_"+file.getName()); 
      SecretKeySpec sks = new SecretKeySpec(pass.getBytes(), "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.DECRYPT_MODE, sks); 
      CipherInputStream cis = new CipherInputStream(fis, cipher); 
      int b; 
      byte[] d = new byte[8]; 
      while((b = cis.read(d)) != -1) { 
       fos.write(d, 0, b); 
      } 
      fos.flush(); 
      fos.close(); 
      cis.close(); 
     } 
+0

Cảm ơn Michal. Nó hoạt dộng bây giờ! :-) –

Các vấn đề liên quan