2014-10-23 16 views
7
public class AES { 

    public String getEncrypt(String pass){ 
     String password = encrypt(pass); 
     return password; 
    } 

    public String getDecrypt(String pass){ 
     String key = "AesSEcREtkeyABCD"; 
     byte[] passwordByte = decrypt(key,pass); 
     String password = new String(passwordByte); 
     return password; 
    } 

    private byte[] decrypt(String key, String encrypted) { 
     try { 
      SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(skeySpec.getEncoded(), "AES")); 
      //getting error here 
      byte[] original = cipher.doFinal(encrypted.getBytes()); 
      return original; 
     } catch (IllegalBlockSizeException ex) { 
      ex.printStackTrace(); 
     } catch (BadPaddingException ex) { 
      ex.printStackTrace(); 
     } catch (InvalidKeyException ex) { 
      ex.printStackTrace(); 
     } catch (NoSuchAlgorithmException ex) { 
      ex.printStackTrace(); 
     } catch (NoSuchPaddingException ex) { 
      ex.printStackTrace(); 
     } 
     return null; 
    } 

    private String encrypt(String value) { 
     try { 
      byte[] raw = new byte[]{'A', 'e', 's', 'S', 'E', 'c', 'R', 'E', 't', 'k', 'e', 'y','A','B','C','D'}; 
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
      byte[] encrypted = cipher.doFinal(value.getBytes()); 
      System.out.println("encrypted string:" + (new String(encrypted))); 
      return new String(encrypted); 
     } catch (NoSuchAlgorithmException ex) { 
      ex.printStackTrace(); 
     } catch (IllegalBlockSizeException ex) { 
      ex.printStackTrace();  
     } catch (BadPaddingException ex) { 
      ex.printStackTrace(); 
     } catch (InvalidKeyException ex) { 
      ex.printStackTrace(); 
     } catch (NoSuchPaddingException ex) { 
      ex.printStackTrace(); 
     } 
     return null; 
    } 

** Tôi có một con trỏ rỗng bất cứ khi nào tôi giải mã. đôi khi nó mang lại cho tôi mật khẩu được giải mã chính xác nhưng đôi khi nó mang lại cho tôi một con trỏ rỗng. không thể đoán vấn đề là gì ở đây **java aes javax.crypto.BadPaddingException: Cho khối cuối cùng không được đệm đúng cách

Trả lời

8

Bạn đang trộn các chuỗi và mảng byte. Đó không phải luôn luôn là một điều tốt để làm. Ít nhất là chỉ định bộ ký tự nào bạn đang sử dụng cho chuyển đổi byte sang char. Thậm chí sau đó nó không phải là 100% an toàn. Tốt hơn để xử lý chuỗi như chuỗi và mảng byte dưới dạng mảng byte.

Nếu điều đó không giải quyết được thì có nhiều điều có thể gây ra lỗi "Lỗi đệm". Về cơ bản bất cứ điều gì gây ra sự kết thúc của khối cuối cùng không phù hợp với padding dự kiến ​​sẽ ném lỗi. Nguyên nhân có thể bao gồm: cài đặt đệm không chính xác, khóa không chính xác, cyphertext bị hỏng và các thứ khác.

Để thử và chẩn đoán sự cố, hãy đặt bên giải mã thành NoPadding. Điều này sẽ chấp nhận mọi thứ và cho phép bạn kiểm tra kết quả đầu ra:

  • hoàn thành rác: bạn có thể gặp lỗi trong cài đặt khóa hoặc chế độ khác.

  • đổ rác khối đầu tiên: bạn có thể gặp lỗi chính hoặc lỗi IV.

  • rác khối cuối cùng: có thể kết thúc bị hỏng đối với tệp tin cyphertext.

  • giải mã đúng với một số byte lạ ở cuối: các byte lạ là phần đệm.

Nếu nó thực sự chỉ là đệm, sau đó đặt chức năng giải mã để mong đợi loại đệm đó. Nếu không, hãy kiểm tra rằng khóa/IV/cyphertext là byte-cho-byte giống nhau cho cả mã hóa và giải mã.

Đó là quan trọng mà bạn đặt chế độ đệm sau khi chẩn đoán. NoPadding không an toàn.

+0

'" NoPadding "' không an toàn cho RSA. '" NoPadding "' là hơi * nhiều hơn * an toàn hơn padding cho mật mã đối xứng như padding oracles là không thể nữa. Tất nhiên, một chế độ như CBC ít chức năng hơn nhiều mà không cần đệm. –

+0

'NoPadding' cũng không an toàn đối với một số dạng truyền tải tham nhũng. Bất kỳ lỗi truyền nào trong hoặc truyền đến, khối cuối cùng sẽ kích hoạt 'BadPaddingException' nếu một số hình thức đệm được mong đợi. 'NoPadding' sẽ bỏ qua tất cả các ngoại lệ như vậy. Bạn trả tiền của bạn và bạn có sự lựa chọn của bạn. – rossum

+0

Chúng tôi sẽ ở lại bất đồng ở đây tôi đoán. Nhưng tôi đã bỏ phiếu và phần còn lại của câu trả lời đã xuất hiện để làm hài lòng Allen, vì vậy đó là OK :) –

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