2012-04-17 49 views
18

Tôi đã cố mã hóa dữ liệu bằng thuật toán AES. Tuy nhiên, với ngoại lệ sau đã xảy ra.java.security.NoSuchAlgorithmException: Không thể tìm thấy bất kỳ nhà cung cấp nào hỗ trợ AES/ECB/PKCS7PADDING

java.security.NoSuchAlgorithmException: 
    Cannot find any provider supporting AES/ECB/PKCS7PADDING 

Ai đó biết giải pháp cho vấn đề này? Phiên bản JDK của tôi là 1.7.

+0

Lưu ý rằng ECB không phải là CPA an toàn, thay vào đó hãy sử dụng CBC (nếu bạn chỉ muốn bảo mật dữ liệu được lưu trữ). –

Trả lời

28

Bạn không muốn chỉ định vùng đệm PKCS # 7 để sử dụng mật mã khối. Bạn muốn chỉ định vùng đệm PKCS # 5. PKCS # 5 được chỉ định để sử dụng với mật mã khối trong khi PKCS # 7 không (nó sử dụng cho các địa điểm khác nhau như trong S/MIME). Tôi sẽ chỉ ra rằng PKCS # 5 và PKCS # 7 thực sự chỉ định chính xác cùng một kiểu đệm (chúng giống nhau!), Nhưng nó được gọi là # 5 khi được sử dụng trong ngữ cảnh này. :)

Vì vậy, thay vì "AES/ECB/PKCS7PADDING", bạn muốn "AES/ECB/PKCS5PADDING". Đây là một triển khai mã hóa mà mọi hoạt động của nền tảng Java được yêu cầu để hỗ trợ. Xem documentation of the Cipher class để biết thêm chi tiết.

+0

cảm ơn rất nhiều vì câu trả lời của bạn. Sau đó nhà cung cấp JCE không hỗ trợ PKCS7PADDING? –

+2

Chính xác. Nó không (tốt, vì # 5 và # 7 là cùng một padding ... Tôi đoán bạn có thể nói nó?). Và, bạn được chào đón. Hãy nhớ chấp nhận câu trả lời nếu bạn hài lòng với nó. :) – jeffsix

+4

Câu trả lời này là không sao, nhưng một chút bối rối vì bạn * làm * muốn sử dụng PKCS # 7 đệm cho một mật mã khối. Chỉ là 'PKCS7Padding' là tên sai, theo [Tên thuật toán chuẩn.] (Http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher) PKCS # 7 sử dụng lược đồ đệm này cho các thư đệm được mã hóa bằng mật mã khối. Không quan trọng ngữ cảnh lớn hơn là gì. – erickson

3

Đối với một lời giải thích rất toàn diện về vấn đề này bao gồm các nội dung của PKCS # 5 và PKCS # 7 tiêu chuẩn mật mã, xin vui lòng hãy xem here.


Đệm PKCS # 5 có nghĩa là đệm 1 đến 8 byte. Bản thân các byte đệm chứa số byte đệm được mã hóa thành một byte. Lớp đệm PKCS # 5 được chỉ định cho DES, nhưng nó sẽ phù hợp với bất kỳ mật mã khối nào có kích thước khối là 8 byte.

Bây giờ, các đặc tả DES và thậm chí đặc tả PKCS # 5 cho mã hóa dựa trên mật khẩu trước và Java trong một thời gian khá dài. AES chỉ được tiêu chuẩn hóa vào năm 2002, lâu sau khi Java và thậm chí cả Java 2 được giới thiệu. Vì vậy, (ba) DES và PKCS # 5 đệm được tích hợp vào Java trước khi AES xuất hiện.

Khi Java - hoặc chính xác hơn, nhà cung cấp Sun JCE - đã đạt được chức năng AES, nó yêu cầu phương pháp đệm cho kích thước khối là 16 byte. PKCS # 7 chỉ định phương thức đệm này là is identical to PKCS#5 padding, ngoại trừ việc nó được xác định cho kích thước khối từ 2 đến 255 byte (giá trị tối đa của một byte nếu nó mã hóa một số nguyên không dấu). Tuy nhiên, phương pháp padding đã có; nó được đặt tên là "PKCS5Padding". Vì vậy, thay vì giới thiệu một tên mới, "PKCS5Padding" chỉ đơn giản là được sử dụng lại.

Hiện giờ nhà cung cấp Sun thực sự cần hỗ trợ "PKCS7Padding" vì đệm PKCS # 5 đơn giản là không chính xác. Nó không chỉ là một vấn đề đặt tên Java, nó là một vấn đề cho bất kỳ nhà phát triển nào cố gắng thực hiện các giao thức mã hóa hoặc các ứng dụng cổng khác tới Java. Tuy nhiên, bây giờ, bạn nên sử dụng "PKCS5Padding" thay vì "PKCS7Padding".

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