2012-08-12 42 views
6

Tôi đang phát triển một ứng dụng cần mã hóa một số tệp nhỏ (nhỏ hơn 1MB) và lớn (khoảng 500MB).
Làm cách nào để mã hóa tệp và lưu phiên bản được mã hóa ở đâu đó trên đĩa một cách hiệu quả (tức là nhanh)?
Tôi có thể có tiến trình mã hóa nếu mất thời gian không?Mã hóa hiệu quả các tệp bằng AES trong java

+0

bao nhiêu an ninh nào bạn yêu cầu? Nói chung mã hóa càng yếu thì tốc độ càng nhanh và ngược lại. –

+1

Bạn có thể sử dụng API 'BouncyCastel'. –

+0

@NoxHarmonium: Tôi nên đo lường bằng cách nào? ;-) Tôi cần tệp càng an toàn càng tốt. Tôi không quan tâm đến việc mã hóa được làm chậm Tôi chỉ muốn nó làm việc ở mức tối đa nó có thể đi. (Tôi có nghĩa là một cái gì đó giống như bản sao tập tin bằng cách sử dụng 'java.io' và' java.nio') – RYN

Trả lời

6

Giả sử bạn có khóa AES và một số luồng đầu ra, dưới đây là cách bạn có thể thêm trình trang trí mã hóa vào luồng.

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

Điều này thêm IV vào phần đầu của văn bản mật mã; khi giải mã, bạn cần phân tích cú pháp đó để khởi tạo mật mã.

Một giải pháp tốt hơn, lâu dài hơn, là sử dụng thư viện triển khai Cú pháp thông báo mật mã, cơ sở cho S/MIME. Điều này ghi lại siêu dữ liệu về các thuật toán và các khóa có thể được sử dụng để giải mã.

Tôi cũng khuyên bạn nên sử dụng chế độ AEAD như GCM hoặc CCM nếu nhà cung cấp của bạn triển khai chế độ này. (SunJCE không.) Những điều này sẽ xác minh rằng tệp được giải mã chính xác và không bị hỏng.

+0

@owlstead Tôi biết API hiện có cho GCM và dự kiến ​​SunJCE sẽ cung cấp cho nó, nhưng khi tôi kiểm tra, tôi không thể tìm thấy đề cập đến nó [trong tài liệu.] (Http://docs.oracle. com/javase/7/docs/technotes/guides/security/SunProviders.html) Bạn có biết bất kỳ cam kết nào của Oracle để cung cấp cho nó thông qua một nhà cung cấp JCE được bao gồm không? – erickson

+1

Rất tiếc, tôi có thể đã sử dụng đường dẫn xây dựng không chuẩn ở đó. Từ nguồn: "* Java SE đã định nghĩa các giao diện AEAD/GCM trong JDK 7. Trong JDK 8, các nhà cung cấp JCA/JCE sẽ triển khai các giao diện AEAD/GCM này. Chúng tôi cũng có khả năng thêm một số cơ chế bổ sung cho PKCS11, nếu tiêu chuẩn PKCS11 hiện tại hỗ trợ nó. * " –

+0

Tất nhiên, API Bouncy Castle có chứa triển khai thực hiện chế độ GCM. Tôi sẽ cố gắng và xây dựng nó vào nhà cung cấp sau khi kết thúc lớp học mật mã đại học Standford của tôi. –

2

Như Bhavik đã đề cập ở trên, BouncyCastle sẽ là một cách tốt để đi, trọng lượng nhẹ và trưởng thành của nó. Bạn chắc chắn có thể thấy sự tiến bộ của mã hóa khi bạn có thể kiểm soát bao nhiêu để đọc và viết cùng một lúc. Bạn có thể đọc các byte từ một tệp, mã hóa chúng và ghi lại một tệp khác trong một đường dẫn.

Một ví dụ về điều này được đề cập trong câu hỏi này: How to encrypt a string/stream with bouncycastle pgp without starting with a file

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