2013-03-21 21 views
11

Dự án tôi đang làm việc có phân khúc yêu cầu mã hóa và giải mã AES. Từ tất cả các nguồn internet có thể mà tôi có thể tra cứu, thật khó để tìm thấy bất kỳ tham chiếu đến mã hóa AES256 mà không cần phải tải xuống và cài đặt các tệp JCE không giới hạn sức mạnh từ Sun's (giờ là trang web của Oracle). Bên cạnh bất kỳ vấn đề pháp lý nào tồn tại với sự phân phối giống nhau, nó không giúp chúng tôi thực tế khi yêu cầu người dùng cuối truy cập vào một trang web cụ thể và tải xuống một số tệp, đặt chúng vào một thư mục rồi thêm mọi thứ vào classpath nếu trên Windows vv!Giải mã mã hóa AES256 có thể thực hiện được trong Java mà không có các tệp JCE sức mạnh không giới hạn không?

Có một số tham chiếu trên internet đến API trọng lượng nhẹ của BountyCastle có thể không yêu cầu tệp JCE, nhưng tôi không thể tra cứu một tài liệu tham khảo hoặc ví dụ có liên quan.

Không chắc chắn, nhưng đây có phải là vấn đề với mọi ngôn ngữ lập trình khác không?

Nếu không thể có mã hóa AES 256 bit mà không có những tệp JCE cụ thể được cài đặt, thì cách tiếp cận JNI có thể trợ giúp không?

Để xây dựng một chút, mã hóa AES 256 có thể được thực hiện trong C/C++ và sau đó tôi có thể gọi những người sử dụng JNI để có kết quả mong muốn không? Việc đóng gói phần mềm (như một tệp tin jar) có phải là một nguyên nhân gây ra mối lo ngại, hoặc có thể có các vấn đề khác không?

Một yếu tố quan trọng khác được đưa ra là dự án sẽ chạy cả Mac và Windows, do đó có thể là hạn chế khi sử dụng C/C++ (phiên bản trình biên dịch/phiên dịch cụ thể hoặc bất kỳ thứ gì)?

Có cách nào khác để xử lý việc này không? Bất kỳ cách tiếp cận nào khác?

+2

Chào mừng bạn đến với [SO]. Tôi đã lấy sự tự do để loại bỏ một số văn bản không thực sự cần thiết. Chúng tôi thích câu hỏi của chúng tôi ngắn gọn và điều này đã được rất nhiều lâu mà không có văn bản ;-) –

+2

Tôi nghĩ rằng bạn có thể tìm thấy một thực hiện AES Java ở đây: https://jce.iaik.tugraz.at/ nhưng tôi nghĩ rằng nó chỉ miễn phí cho nghiên cứu sinh. – HectorLector

+0

Đừng quên để upvote hoặc chấp nhận câu trả lời, Norah ... –

Trả lời

5

Trước hết, không có vấn đề gì với mọi môi trường lập trình. OpenSSL được viết bằng C có hỗ trợ cho các phím lớn chẳng hạn. Từ kinh nghiệm với cả JCE và JNI, tôi sẽ đề nghị bạn tìm cách sử dụng Java thuần túy thay vì tải một thư viện riêng thông qua JNI. Nó dễ dàng hơn rất nhiều.

Một giải pháp thực hiện: là ứng dụng của bạn được cài đặt sử dụng một số loại ứng dụng cài đặt trong khi cài đặt? Nếu có, thì một giải pháp có thể là sử dụng trình cài đặt này để cài đặt JCE.

BouncyCastle không may cũng sử dụng JCE như được nêu trong FAQ của họ.

CẬP NHẬT 1: Tôi tìm thấy thư viện này có thể là những gì bạn đang tìm kiếm. Nó dường như không được duy trì lâu hơn nữa tuy nhiên: http://www.cryptix.org/

UPDATE 2: GNU có một thư viện mà thực hiện AES256: http://www.gnu.org/software/gnu-crypto/.Thông tin thêm về các thuật toán mã hóa có sẵn ở đây: http://www.gnu.org/software/gnu-crypto/manual/Ciphers.html

Mã ví dụ sử dụng GNU-Crypto cho rằng bạn đã có chìa khóa của bạn nạp trong key_bytes:

IBlockCipher cipher = CipherFactory.getInstance("AES"); 
Map attributes = new HashMap(); 
attributes.put(IBlockCipher.CIPHER_BLOCK_SIZE, new Integer(16)); 
attributes.put(IBlockCipher.KEY_MATERIAL, key_bytes); 
cipher.init(attributes); 
int bs = cipher.currentBlockSize(); 

for (int i = 0; i + bs < pt.length; i += bs) 
{ 
    cipher.encryptBlock(pt, i, ct, i); 
} 

for (int i = 0; i + bs < cpt.length; i += bs) 
{ 
    cipher.decryptBlock(ct, i, cpt, i); 
} 

Hãy đảm bảo rằng bạn sử dụng một bộ tạo số ngẫu nhiên mã hóa an toàn như SecureRandom để tạo ra 256 byte của bạn cho phím:

byte[] seed = xxx; // Be sure to get a good new seed on every client machine. 
SecureRandom random = new SecureRandom(seed); 
byte[] key_bytes = new byte[256]; 
random.nextBytes(key_bytes); 
+4

Bouncycastle nhẹ API không * không * sử dụng JCE và do đó không phải chịu sự cần thiết cho các tập tin mật mã pháp lý không giới hạn. –

+0

@GregS đã sử dụng điều này làm cơ sở cho câu trả lời –

+0

Việc trỏ đến thư viện mật mã chưa được duy trì thường kết thúc bằng -1, nhưng tôi sẽ để nó giống như thông tin khác là chính xác. –

6

các hạn chế kích thước quan trọng được thực hiện trong lớp Cipher của Java. Có thể sử dụng bất kỳ lớp học khác nào triển khai AES để nhận chức năng AES-256. Ví dụ: có thể sử dụng API "nhẹ" của Bouncy Castle để sử dụng các kích thước chính của bất kỳ cường độ nào. Trong trường hợp đó, bạn có thể sử dụng org.bouncycastle.crypto.engines.AESFastEngine trực tiếp (và một modepadding của sự lựa chọn của bạn. Nó vẫn còn có thể sử dụng bình thường .jar cho Bouncy Castle, nhưng bạn sẽ không được sử dụng các chức năng JCA của nhà cung cấp BouncyCastle.

này có một số nhược điểm và các ưu điểm: Bouncy Castle API nhẹ có phần thấp hơn so với chức năng JCA được thêm vào các lớp Sun bởi nhà cung cấp "BC". Hơn nữa, rất nhiều thành phần (như lớp SSL trong Java, JSSE hoặc các thư viện mã hóa XML) sử dụng JCA cung cấp chức năng mã hóa cần thiết Các thư viện yêu cầu chức năng JCA sẽ vẫn bị giới hạn ở các kích thước khóa bị hạn chế. Lưu ý rằng việc sử dụng các nhà cung cấp khác sẽ không hoạt động vì chính lớp Cipher sẽ kiểm tra kích thước khóa. Các lớp thực hiện CipherSpi có thể được chứa trong một nhà cung cấp JCA không thể (tích cực) ảnh hưởng đến các kích thước khóa được phép. Bạn chỉ có thể trực tiếp sử dụng các lớp thực hiện.

+0

[link] (http://www.bouncycastle.org/documentation.html) đã giúp – Norah