2015-01-18 24 views
5

Tôi đang phát triển một ứng dụng Android có chứa hình ảnh và video như VaultyKeep 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ử VaultyKeep 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(); 
} 

Trả lời

8

Một điều đó là làm cho mã chạy của bạn chậm là kích thước của bộ đệm của bạn:

byte[] d = new byte[8]; 

Bạn nên bump nó lên bởi một vài đơn đặt hàng của nếu bạn muốn nó chạy nhanh. Với kích thước tệp của bạn, tôi khuyên bạn nên sử dụng ít nhất 1 MB nhưng ngày nay bạn có thể đặt nó thành một vài MB ngay cả trên Android. Hãy thử thay đổi nó thành:

byte[] d = new byte[1024 * 1024]; 

và cho chúng tôi biết nó đã cải thiện tốc độ bằng bao nhiêu.

+0

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

+1

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

+0

"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

5

Sử dụng bộ đệm lớn hơn theo đề xuất của @MikeLaren và cũng quấn FileOutputStream trong một BufferedOutputStream. Khi giải mã, hãy bọc FileInputStream trong một BufferedInputStream. Hoặc làm cả hai trong cả hai trường hợp: không làm hại.

Không cần kích thước bộ đệm anh hùng như megabyte: 8k hoặc 32k là đủ.

+0

Ok Cảm ơn bạn :) – svhr

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