Sto sviluppando un'app per Android che protegge immagini e video come Vaulty e Keep safe. Sto cercando di utilizzare la tecnica di crittografia/decrittografia AES-128 per archiviare immagini e video. L'ho provato prendendo 3 immagini campione di dimensioni 5.13, 4.76 e 5.31 rispettivamente. Ma il tempo che sta consumando per crittografare è 25s, 22s, 27s rispettivamente e il tempo di decifrare è 31s, 30s, 34s rispettivamente. Lo sto testando su HTC One X.La crittografia/decodifica di file Android AES-128 è molto lenta. Come posso aumentare la velocità
Tale velocità non sarà possibile per la mia app in quanto gli utenti scorreranno e visualizzeranno le immagini rapidamente senza interruzioni. Puoi per favore suggerirmi come posso migliorare le prestazioni (velocità) o dovrei passare ad altri algoritmi? Potete per favore suggerirmi altre tecniche attraverso le quali posso cifrare/decodificare immagini e video rapidamente senza compromettere troppo la sicurezza.
Ho provato Vaulty e Keep safe e sono molto veloci. Si dice che Vaulty utilizzi AES-256, ma è ancora molto veloce e reattivo in termini di crittografia e visualizzazione delle immagini. Com'è possibile che vaulty sia così veloce usando AES-256?
codice che sto usando è:
static void encrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
// Here you read the cleartext.
File extStore = Environment.getExternalStorageDirectory();
startTime = System.currentTimeMillis();
Log.i("Encryption Started",extStore + "/5mbtest/"+filename);
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename);
// This stream write the encrypted text. This stream will be wrapped by
// another stream.
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+filename+".aes", false);
// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, sks);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
// Write bytes
int b;
byte[] d = new byte[8];
while ((b = fis.read(d)) != -1) {
cos.write(d, 0, b);
}
// Flush and close streams.
cos.flush();
cos.close();
fis.close();
stopTime = System.currentTimeMillis();
Log.i("Encryption Ended",extStore + "/5mbtest/"+filename+".aes");
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
}
static void decrypt(String filename) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
File extStore = Environment.getExternalStorageDirectory();
Log.i("Decryption Started",extStore + "/5mbtest/"+filename+".aes");
FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename+".aes");
FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+"decrypted"+filename,false);
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, sks);
startTime = System.currentTimeMillis();
CipherInputStream cis = new CipherInputStream(fis, cipher);
int b;
byte[] d = new byte[8];
while ((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
stopTime = System.currentTimeMillis();
Log.i("Decryption Ended",extStore + "/5mbtest/"+"decrypted"+filename);
Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
fos.flush();
fos.close();
cis.close();
}
Grazie mille @Mike per l'aiuto, l'ho impostato su 10 MB i.e byte [] d = nuovo byte [10 * 1024 * 1024]; Crittografia: 2.624s, 3.61s, 3.983s Decrittografia: 7.63, 7.129, 7.63 Rispettivamente per 1.jpg, 2.jpg e 3.jpg Ma per me la decrittazione è più lenta e dovrebbe essere più veloce. Per i dispositivi attuali, quante dimensioni dell'array dovrei usare per non rovinare l'app? C'è un modo per trovare la dimensione massima del buffer o la dimensione del buffer più fattibile? – svhr
Preferisco andare con qualcosa tra 8 * 1024 o 64 * 1024. I buffer molto grandi di solito non aumentano le prestazioni. – CodesInChaos
"ma oggigiorno è possibile impostarlo realisticamente su pochi MB, anche su Android" non allocare MB di buffer nell'heap anche "oggigiorno" -> come EJP ha scritto: coppia di Kb dovrebbe essere sufficiente – for3st