2012-05-08 6 views
6

Ho un programma di presa di server e client, un server di inviare un messaggio cifrato a cliente, vale a dire il codice lato server:lunghezza ingresso deve essere multiplo di 16, quando decifrare con imbottitura cifra

cipher2 = Cipher.getInstance("AES"); 
secretKeySpec = new SecretKeySpec(decryptedText, "AES"); 
cipher2.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
feedback = "Your answer is wrong".getBytes(); 
cipher2.doFinal(feedback); 
dos.writeInt(feedback.length); 
dos.write(feedback); 

lato client codice:

int result_len = 0; 
result_len = din.readInt();    
byte[] result_Bytes = new byte[result_len]; 
din.readFully(result_Bytes); 
cipher2 = Cipher.getInstance("AES"); 
cipher2.init(Cipher.DECRYPT_MODE, aesKey);    
byte[] encrypt = cipher2.doFinal(result_Bytes); 

Eccezione buttare a byte[] encrypt = cipher2.doFinal(result_Bytes);

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2086) 

qual è il problema?

+0

Viene result_len un multiplo di 16? In caso contrario, assicurarsi che sia, quindi result_Bytes dovrebbe essere la lunghezza giusta. – Ewald

risposta

-3

ho avuto questo problema una volta. In realtà il mio codice era corretto e funzionante quando lo sto eseguendo senza server. L'errore è stato, quando stavo ottenendo il parametro dall'url l'url criptato con il simbolo più (+) cambiato automaticamente nello spazio. Potrebbe essere un problema controllarlo una volta. Ecco la mia logica di crittografia e decodifica con generatore di chiavi, se vuoi puoi usarla anche tu.

public class Anything 
{ 
    private static final String ALGO = "AES"; 
    //generate 128bit key 
    private static final String keyStr = "Z8LSq0wWwB5v+6YJzurcP463H3F12iZh74fDj4S74oUH4EONkiKb2FmiWUbtFh97GG/c/lbDE47mvw6j94yXxKHOpoqu6zpLKMKPcOoSppcVWb2q34qENBJkudXUh4MWcreondLmLL2UyydtFKuU9Sa5VgY/CzGaVGJABK2ZR94="; 

    private static Key generateKey() throws Exception { 
     byte[] keyValue = keyStr.getBytes("UTF-8"); 
     MessageDigest sha = MessageDigest.getInstance("SHA-1"); 
     keyValue = sha.digest(keyValue); 
     keyValue = Arrays.copyOf(keyValue, 16); // use only first 128 bit  
     Key key = new SecretKeySpec(keyValue, ALGO); 
     return key; 
    } 

    public static String encrypt(String Data) throws Exception { 
      Key key = generateKey(); 
      Cipher c = Cipher.getInstance(ALGO); 
      c.init(Cipher.ENCRYPT_MODE, key); 
      byte[] encVal = c.doFinal(Data.getBytes()); 
      String encryptedValue = DatatypeConverter.printBase64Binary(encVal); 
      return encryptedValue; 
    } 

    public static String decrypt(String encryptedData) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGO); 
     c.init(Cipher.DECRYPT_MODE, key);  
     byte[] decordedValue = DatatypeConverter.parseBase64Binary(encryptedData); 
     byte[] decValue = c.doFinal(decordedValue); 
     String decryptedValue = new String(decValue); 
     return decryptedValue; 
    } 
} 
2

So che questo messaggio è vecchio ed è stato molto tempo fa - ma ho avuto anche problemi con con lo stesso identico errore:

il problema che avevo era si riferisce al fatto che il testo cifrato era convertito in stringa e in byte[] durante il tentativo di DECRYPT.

private Key getAesKey() throws Exception { 
    return new SecretKeySpec(Arrays.copyOf(key.getBytes("UTF-8"), 16), "AES"); 
} 

private Cipher getMutual() throws Exception { 
    Cipher cipher = Cipher.getInstance("AES"); 
    return cipher;// cipher.doFinal(pass.getBytes()); 
} 

public byte[] getEncryptedPass(String pass) throws Exception { 
    Cipher cipher = getMutual(); 
    cipher.init(Cipher.ENCRYPT_MODE, getAesKey()); 
    byte[] encrypted = cipher.doFinal(pass.getBytes("UTF-8")); 
    return encrypted; 

} 

public String getDecryptedPass(byte[] encrypted) throws Exception { 
    Cipher cipher = getMutual(); 
    cipher.init(Cipher.DECRYPT_MODE, getAesKey()); 
    String realPass = new String(cipher.doFinal(encrypted)); 
    return realPass; 
} 
+0

Puoi renderlo più chiaro in termini di: se il codice sopra è quello che dà un problema o è l'unico che risolve il problema? – Feng

+0

@Feng è risolto il problema – 2Big2BeSmall

5

Si è verificato un problema simile. Ma è importante capire la causa principale e può variare a seconda dei casi d'uso.

Scenario 1
Si sta cercando di decifrare un valore che non è stato codificato in modo corretto, in primo luogo.

byte[] encryptedBytes = Base64.decodeBase64(encryptedBase64String); 

se la stringa è configurato correttamente per qualsiasi ragione o non è stato codificato correttamente, si dovrebbe vedere l'errore "lunghezza di ingresso deve essere multiplo di 16, quando decifrare con cifrario imbottita"

Scenario 2
Ora, se per caso si utilizza questa stringa codificata in URL (cercando di passare il valore base64Encoded in url, fallirà. si dovrebbe fare URLEncoding e poi passare nel token, funzionerà.

Scenario 3
Per l'integrazione con uno dei venditori, abbiamo scoperto che abbiamo dovuto fare la crittografia di Base64 usando URLEncoder ma poi non ha bisogno di decodificarlo perché è stato fatto internamente dal Venditore

Problemi correlati