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
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). –
@ MaartenBodewes-owlstead Sì, li ho chiusi. Il problema esiste ancora. –
Puoi assicurarti che venga letta anche la giusta quantità di byte, leggendo i byte finché 'j' è' -1'? –