Tôi đang phát triển một ứng dụng Android có chứa hình ảnh và video như Vaulty và Keep safe. Tôi đang cố gắng sử dụng kỹ thuật mã hóa/giải mã AES-128 để lưu trữ hình ảnh và video. Tôi đã thử nó bằng cách lấy 3 hình ảnh mẫu có kích thước 5,13, 4,76 và 5,31 tương ứng. Nhưng thời gian tiêu thụ để mã hóa lần lượt là 25, 22, 27 và thời gian giải mã là 31, 30, 34 tương ứng. Tôi đang thử nghiệm trên HTC One X.Mã hóa/giải mã AES-128 của Android rất chậm. Làm thế nào tôi có thể tăng tốc độ
Tốc độ như vậy sẽ không khả thi cho ứng dụng của tôi khi người dùng sẽ cuộn và xem hình ảnh nhanh chóng mà không bị gián đoạn. Bạn có thể đề nghị tôi làm thế nào tôi có thể cải thiện hiệu suất (tốc độ) hay tôi nên chuyển sang các thuật toán khác? Bạn có thể gợi ý cho tôi bất kỳ kỹ thuật nào khác thông qua đó tôi có thể mã hóa/giải mã hình ảnh và video một cách nhanh chóng mà không ảnh hưởng đến bảo mật quá nhiều.
Tôi đã thử Vaulty và Keep safe và chúng rất nhanh. Vaulty được cho là đang sử dụng AES-256, nhưng nó vẫn còn rất nhanh và đáp ứng về mặt mã hóa và xem hình ảnh. Làm thế nào là nó có thể là vaulty là nhanh chóng bằng cách sử dụng AES-256?
Mã Tôi đang sử dụng là:
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();
}
Cảm ơn rất nhiều @Mike để được trợ giúp, tôi đã đặt nó thành 10MB tức là byte [] d = byte mới [10 * 1024 * 1024]; Mã hóa: 2.624s, 3.61s, 3.983s Giải mã: 7.63, 7.129, 7.63 Tương ứng với 1.jpg, 2.jpg và 3.jpg Nhưng với tôi giải mã chậm hơn và nó sẽ nhanh hơn. Đối với các thiết bị hiện tại có bao nhiêu kích thước mảng tôi nên sử dụng mà sẽ không sụp đổ các ứng dụng? Có cách nào tôi có thể tìm thấy kích thước bộ đệm tối đa hoặc kích thước bộ đệm khả thi nhất? – svhr
Tôi muốn đi với một cái gì đó giữa 8 * 1024 hoặc 64 * 1024. Bộ đệm rất lớn thường không tăng hiệu suất. – CodesInChaos
"nhưng ngày nay bạn thực tế có thể đặt nó thành một vài MB, ngay cả trên Android" không phân bổ MBs bộ đệm trong heap thậm chí "ngày nay" -> như EJP đã viết: vài Kb nên đủ – for3st