2012-01-29 45 views
6

Tôi đang thực hiện một số công việc liên quan đến mã hóa tệp. Tôi có thể mã hóa/giải mã các tệp nhưng phải đối mặt với một vấn đề hiệu suất lớn. Khi tôi chỉ đọc/ghi một tệp video có dung lượng 700 MB, mã của tôi hoạt động vào khoảng 27-28 MB/s. Nhưng khi tôi thực hiện mã hóa (tôi hiện đang sử dụng PBEWithMD5AndDES, mà tôi sẽ thay đổi sau này) mã cho thấy tốc độ 9 MB/s. Vui lòng cho biết tôi có thể cải thiện ở đâu.Tư vấn về hiệu suất mã hóa tệp trong Java

Đoạn mã:

int c = 0, BUF_SIZE = 8192; 
    byte[] b = new byte[BUF_SIZE]; 
    FileInputStream fis; 
    DataInputStream dis; 
    FileOutputStream fos; 
    DataOutputStream dos; 
    CipherOutputStream cos; 


    try { 
     // Create PBE parameter set 
     pbeParamSpec = new PBEParameterSpec(salt, iterationCount); 

     // Create PBE Cipher 
     Cipher pbeCipher = Cipher.getInstance(algorithm); 

     // get key 
     key = generateKeyFromPassword(password); 

     // Initialize PBE Cipher with key and parameters 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec); 

     fis = new FileInputStream(inFile); 
     dis = new DataInputStream(fis); 
     fos = new FileOutputStream(outFile); 
     dos = new DataOutputStream(fos); 
     cos = new CipherOutputStream(fos, pbeCipher); 


     while ((c = dis.read(b)) > 0) { 
      cos.write(b); 
      //dos.write(b); 
     } 

     fis.close(); 
     dis.close(); 
     //dos.close(); 
     cos.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Thống kê mà không cần mã hóa:
Speed ​​là khoảng 27,97 MB/s
chính xác Thời gian = 25.02 giây
Kích File = 700 MB

Thống kê với mã hóa:
Tốc độ là khoảng 9. 69 MB/s
chính xác Thời gian = 72,171 giây
Kích File = 700 MB

+0

Bạn đã thử một cypher khối khác, chẳng hạn như AES? – CodesInChaos

+0

Bạn có loại CPU nào? Khi thực hiện đúng mã hóa AES sẽ vượt quá 30MB/s ngay cả trên phần cứng cũ hơn. – CodesInChaos

+0

Tôi đang làm việc trên CPU: intel i3 @ 2,27 GHz Hệ điều hành: Ubuntu 10.10 – ketan

Trả lời

0

Encryption chỉ là CPU chuyên sâu. Có lẽ bạn có thể tìm thấy một thực hiện hiệu quả hơn và cạo một vài% thời gian chạy, hoặc sử dụng một công cụ phần cứng chuyên dụng và có được hiệu suất tốt hơn cho một vài đô la.

Điều đầu tiên tôi đảm bảo là ứng dụng của bạn có thể đối phó với thực tế là việc này sẽ mất một lúc. Điều này có nghĩa là đưa mật mã vào hoạt động nền, chuẩn bị nội dung trước khi sử dụng và các cân nhắc thiết kế tương tự.

+0

10MB/s rất chậm, ngay cả khi mã hóa. Sử dụng đa luồng và AES i3 2.6 GHz của tôi quản lý 200MB/s. Nhưng tôi không quen thuộc với các đặc tính hiệu suất của DES. – CodesInChaos

+0

@thinksteep "cạo một vài%" âm thanh như tiếng Anh hợp lệ cho tôi. Không cần phải sửa chữa. – CodesInChaos

+0

@CodeInChaos, Nếu đúng, tôi xin lỗi! – kosa

2

Hãy thử gói luồng đầu vào dữ liệu bằng luồng đầu vào được đệm cho người mới bắt đầu. Đồng thời kiểm tra điều này link để so sánh hiệu suất của các thuật toán khác nhau trong java. AES thực sự sẽ mang lại kết quả nhanh hơn đáng kể so với DES.

4

Thứ nhất: nếu có thể, đừng tự làm điều này. Mã hóa là rất (rất!) Dễ dàng để mess lên trong những cách mà dẫn đến kết quả là không an toàn. Nếu có thể, hãy sử dụng một thành phần hoặc thư viện bên ngoài để thực hiện nhiều công việc mã hóa như là thực tế.

Thứ hai, nếu bạn định tự làm điều này như hiện tại, đừng sử dụng DES. DES không còn là một thuật toán mã hóa đủ mạnh. Triple-DES là OK, nhưng những gì bạn thực sự muốn sử dụng là AES. Nó được coi là an toàn, CPU hiện đại đã được lưu giữ trong thiết kế của nó, bạn có được một sự lựa chọn của độ dài quan trọng để cân bằng an ninh chống lại hiệu suất và CPU hiện đại có tăng tốc phần cứng cho AES (AES-NI). (Tôi không biết liệu Java có sử dụng điều này hay không, nhưng nếu không, nó chắc chắn có thể bắt đầu trong tương lai, trong khi đó cơ hội cho Triple-DES bằng không.)

Thứ ba, bạn đang đọc và viết một byte tại một thời điểm. Trong khi mã hóa sẽ là CPU-chuyên sâu trong bất kỳ sự kiện, làm nó như bạn đang ở thời điểm này sẽ chậm hơn cần thiết. Đọc và viết thông qua một byte[] của 4kB hoặc như vậy sẽ thấy hiệu suất tốt hơn nhiều.

0

Bạn đã thử sử dụng BouncyCastle làm phương án thay thế? Ở khắp mọi nơi tôi đã nhìn thấy mật mã Java được sử dụng, nó được sử dụng thay cho các API dựng sẵn.

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