2010-10-31 13 views
5

Tôi đang thực hiện một bài tập về sử dụng blowfish để thực hiện mã hóa & giải mã trong java.Cách giải quyết javax.crypto.IllegalBlockSizeException: dữ liệu không chặn kích thước liên kết

Tôi đã thêm nhà cung cấp và nhận ví dụ "Blowfish/ECB/NoPadding", nhưng tôi vẫn gặp lỗi này khi tôi thực hiện mã hóa.

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

ví dụ .:

public static byte[] encrypt(byte to_encrypt[], byte strkey[]) { 
    try {   
     SecretKeySpec key = new SecretKeySpec(strkey, "Blowfish"); 
     Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     return cipher.doFinal(to_encrypt); // <=========== error 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

dẫn đến

javax.crypto.IllegalBlockSizeException: data not block size aligned 
    at org.bouncycastle2.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:686) 
    at javax.crypto.Cipher.doFinal(Cipher.java:1171) 

Cảm ơn bạn.

+0

Đã sử dụng công việc đệm cho bạn, bạn có thể vui lòng chia sẻ mã cố định không? – Shivam657

Trả lời

9

Bạn đã yêu cầu một cách rõ ràng cho nhà cung cấp không thực hiện đệm (thông báo NoPadding trong tên mẫu). Do đó, đầu vào của bạn sẽ không được đệm.

Hơn nữa, đây là mật mã khối, do đó, đầu vào phải là bội số của độ dài khối. Với nhà cung cấp mật mã không làm đệm, bạn cần đảm bảo rằng đầu vào của bạn là bội số của kích thước khối, nếu không mã hóa/giải mã sẽ không thể thực hiện được và bạn sẽ gặp phải lỗi này.

Vì vậy bạn có hai lựa chọn để giải quyết này:

  1. Pad đầu vào chính mình để một bội số của kích thước khối.
  2. Chọn nhà cung cấp có đệm (ví dụ: PKCS5Padding), nếu bạn không muốn thực hiện theo cách thủ công. Do tính chất của câu hỏi của bạn, đây có thể là lựa chọn tốt nhất.
+0

Bạn có thể chia sẻ mã cố định và đang hoạt động không? – Shivam657

+0

@ Shivam657: Không có "mã". Câu hỏi này là về những lý do cơ bản của ngoại lệ, và tôi đã giải thích ý nghĩa của nó trong câu trả lời này. Giả sử bạn đang gặp vấn đề tương tự, bạn cần lưu ý thông tin ở trên và tích hợp nó vào mã của bạn theo cấu trúc hiện tại của nó. –

+0

OK, đã hiểu, nhưng bạn có thể giải thích làm cách nào để tìm kích thước khối chuẩn, tôi cần phải tìm ra điều đó để chèn đầu vào vào một bội số của kích thước khối. – Shivam657

3

Bạn đang sử dụng NoPadding và kích thước của dữ liệu đầu vào của bạn không phải phù hợp với kích thước khối của thuật toán mã hóa, vì vậy một IllegalBlockSizeException đang được ném. Nếu bạn sử dụng NoPadding, bạn cần đảm bảo rằng đầu vào của bạn là bội số của 8 byte.

Thử chỉ định sơ đồ đệm. Thay đổi thành Blowfish/CBC/PKCS5Padding và nó sẽ hoạt động.

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