2015-01-07 11 views
5

Ho un meccanismo di crittografia/decrittografia per i file scaricati nella mia app.Impossibile decifrare il file crittografato in Android lollipop

Questo meccanismo funziona in tutti i dispositivi Android e versioni precedenti ad Android 5.0-lollipop.

Ecco processo di decodifica:

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; 

cifratura e la chiave sono stati generati prima e sono utilizzati in tutto l'app:

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

Quando ho decifrare un file con circa 200.000 byte in Android 5.0, j (variabile prima del ritorno) è circa 8000 che è molto inferiore a 200000, mentre nelle versioni precedenti di Android è esattamente uguale alla lunghezza del file decrittografato.

Ho scoperto che il problema è nella decrittografia. Perché posso crittografare un file in Android 5.0 e decrittarlo nelle vecchie versioni di Android, ma non viceversa. Tuttavia mi distacco processo di crittografia:

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); 
} 

Grazie in anticipo

+0

tuo flusso il trattamento sembra piuttosto strano per me. La creazione di un buffer della dimensione del file non significa che tutti quei byte siano effettivamente letti. E non sembra che il flusso venga chiuso esplicitamente durante la crittografia (ma forse non è incluso). –

+0

@ MaartenBodewes-owlstead Sì, li ho chiusi. Il problema esiste ancora. –

+0

Puoi assicurarti che venga letta anche la giusta quantità di byte, leggendo i byte finché 'j' è' -1'? –

risposta

2

mio esempio Cipher (L):

AppPath è String alla mia directory aplication su scheda 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

Grazie Michal. Ora funziona! :-) –

Problemi correlati