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; 
    } 

** Ho un puntatore nullo quando decifro. a volte mi dà la password decrittografata corretta ma a volte mi dà un puntatore nullo. non riesco a indovinare quale sia il problema qui **java aes javax.crypto.BadPaddingException: blocco finale Dato non adeguatamente imbottito

risposta

8

Stai mescolando stringhe e array di byte. Non è sempre una buona cosa da fare. Per lo meno, specifica quale set di caratteri stai usando per la conversione da byte a carattere. Anche allora non è sicuro al 100%. Meglio trattare le stringhe come stringhe e array di byte come matrici di byte.

Se ciò non risolve, ci sono molte cose che possono causare un errore "Bad Padding". Fondamentalmente qualsiasi cosa che fa si che la fine dell'ultimo blocco non corrisponda al padding atteso genererà l'errore. Le possibili cause includono: impostazione padding errata, chiave errata, testo cifrato corrotto e altri.

Per provare a diagnosticare il problema, impostare il lato di decrittografia su NoPadding. Questo accetterà qualsiasi cosa, e ti permettono di esaminare l'output:

  • completa spazzatura: probabilmente avete un errore nelle impostazioni della modalità chiave o differenti.

  • rifiuto del primo blocco: è possibile che si sia verificato un errore chiave o un errore IV.

  • spazzatura ultimo blocco: probabilmente una fine corrotta al file del testo cifrato.

  • una decrittazione corretta con alcuni strani byte alla fine: gli strani byte sono il riempimento.

Se in realtà è solo il padding, quindi impostare la funzione di decifrazione per prevedere quel tipo di riempimento. In caso contrario, verificare che la chiave/IV/testo cifrato sia byte per byte uguale per la crittografia e la decrittografia.

È vitale che si imposta una modalità di riempimento dopo la diagnosi. NoPadding non è sicuro.

+0

'" NoPadding "' non è sicuro per RSA. '" NoPadding "' è leggermente * più * sicuro del padding per i cifrari simmetrici come gli oracoli di padding non sono più possibili. Naturalmente, una modalità come CBC è molto meno funzionale senza padding. –

+0

'NoPadding' è anche insicuro contro alcune forme di corruzione della trasmissione. Qualsiasi errore di trasmissione o propagazione nell'ultimo blocco attiverà un 'BadPaddingException' se è prevista una forma di riempimento. 'NoPadding' ignorerà tutte queste eccezioni. Paghi i tuoi soldi e tu fai la tua scelta. – rossum

+0

Qui resteremo in disaccordo, immagino. Ma ho già votato e il resto della risposta sembra soddisfare Allen, quindi va bene :) –