2009-02-25 36 views
13

Chúng tôi có một yêu cầu để thực hiện một số phát triển Rijndael trong Java.Hỗ trợ Rijndael trong Java

Bất kỳ đề xuất nào cho bài viết, thư viện, v.v. sẽ giúp chúng tôi?

Bất kỳ con trỏ nào để bảo trì kho khóa và cách lưu trữ khóa một cách an toàn?

Chỉnh sửa:

Nó sẽ cần phải là nguồn mở. Về cơ bản, nó chỉ là mã hóa/giải mã dữ liệu tiêu chuẩn bằng Rijndael.

+0

Rijndael == AES – lImbus

Trả lời

21

Java bao gồm AES ra khỏi hộp. Rijndael là AES. Bạn không cần bất kỳ thư viện bên ngoài nào. Bạn chỉ cần một cái gì đó như thế này:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post 
byte[] iv = null ; //Ditto 
byte[] plaintext = null; //Whatever you want to encrypt/decrypt 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
//You can use ENCRYPT_MODE or DECRYPT_MODE 
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); 
byte[] ciphertext = cipher.doFinal(plaintext); 

Và đó là mã hóa/giải mã. Nếu bạn đang xử lý một lượng lớn dữ liệu thì tốt hơn bạn nên đọc khối là bội số của 16 byte và gọi cập nhật thay vì doFinal (bạn chỉ cần gọi doFinal trên khối cuối cùng).

+7

Rijndael không bằng AES, nhưng thay vào đó là AES với một số hạn chế - kích thước khối cố định là 128 bit và một số chế độ mã hóa không được hỗ trợ. Mọi triển khai AES đầy đủ đều có thể sử dụng được như Rijndael. – Cheeso

+14

Điều này hoàn toàn ngược lại, AES là một tập con của Rijndael –

+3

@ BrunoRohée là chính xác. AES là tập hợp con của Rijndael, hãy kiểm tra http://stackoverflow.com/questions/748622/differences-between-rijndael-and-aes – tony9099

1

javax.crypto đã hỗ trợ AES: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

Đối với lưu trữ chủ chốt an toàn, phương pháp thông thường là để lấy được một khóa mã hóa từ người dùng nhập vào (một cụm từ mật khẩu) sử dụng một hàm băm mật mã, và sử dụng phím nguồn gốc để mã hóa keychain. Hoặc, nếu bạn chỉ cần một khóa, bạn có thể sử dụng chính khóa dẫn xuất.

Luôn ghi nhớ rằng bảo mật của hệ thống có liên quan trực tiếp đến cường độ của hàm băm được sử dụng. Sử dụng hàm băm mật mã an toàn, cùng với một muối nếu có thể, và băm nhiều lần (ví dụ hàng trăm lần).

Điều đó đang được nói, câu hỏi rất mơ hồ.

+0

cũng đáng lưu ý rằng 'javax.crypto' sử dụng phiên bản AES được tối ưu hóa rất nhanh và khá nhanh. – tony9099

5

Để có thư viện miễn phí tuyệt vời, tôi khuyên bạn nên BouncyCastle. Nó được chủ động duy trì, chất lượng cao và có một loạt các ví dụ mã. Để có tài liệu tham khảo, bạn sẽ phải dựa nhiều hơn vào số chung JCE docs.

Tôi không thể nói thư viện nào chúng tôi sử dụng để đáp ứng các yêu cầu chứng nhận FIPS. Nhưng có nhiều lựa chọn thay thế cho CryptoJ, rẻ hơn rất nhiều.

Nói chung, tôi khuyên bạn nên tạo khóa mới cho mỗi thư bạn mã hóa bằng mật mã đối xứng như Rijndael và sau đó mã hóa khóa đó bằng thuật toán không đối xứng như RSA. Các khóa riêng này có thể được lưu trữ trong kho khóa dựa trên phần mềm được bảo vệ bằng mật khẩu như PKCS # 12 hoặc "JKS" của Java hoặc để bảo mật tốt hơn, trên mã thông báo phần cứng "thẻ thông minh" hoặc mô-đun phần cứng crypto khác.

3

Khi công ty của tôi mới phát hiện ra, AES không hoàn toàn là Rijndael. AES có giới hạn rằng các phím PHẢI là 128, 192 hoặc 256 bit - tuy nhiên, Rijndael cũng cho phép các khóa là 160 và 224.

Như được chỉ ra bởi erickson ở trên, BouncyCastle cung cấp đối tượng Rijndael có hỗ trợ thêm độ dài khóa: 128/160/192/224/256 bit. Cụ thể, hãy xem API nhẹ.

Gnu-crypto là một thư viện nguồn mở khác - tuy nhiên, nó cũng KHÔNG cung cấp hỗ trợ cho các khóa bit 160 và 224.

Vì vậy, nếu bạn đang tìm kiếm đầy đủ hỗ trợ Rijndael, thì BouncyCastle là người duy nhất tôi tìm thấy cho đến nay.

+1

Nếu bạn cần sử dụng java cho android phát triển (mặc dù câu hỏi không nói rằng, nó là đáng chú ý rằng Bounty Castle có một người anh em bây giờ, cho phép linh hoạt hơn trên Android được gọi là Spongy Castle, đó là một đạo hàm .. và khá tốt thực sự) – tony9099

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