2017-04-04 2 views
2

Es gibt viele Threads auf Stack-Überlauf mit diesem Thema, und immer die gleichen Lösungen, aber das funktioniert nicht für mich. Ich suche nach einer Möglichkeit, den Wert byte[] verschlüsselt zu entschlüsseln und byte[] decodiertBytes zurückzugeben.Verschlüsselungsfunktionen: WRONG FINAL BLOCK LÄNGE Android Studio

Mit der Methode AESCrypt. Ich benutze compile 'com.scottyab:aescrypt:0.0.1'

private void testAES() { 
    try { 

     final byte[] encrypted = Base64.decode("R3JhbmRlIFZpY3RvaXJlICE=", Base64.NO_WRAP); 

     byte[] keyBytes = Base64.decode("L/91ZYrliXvmhYt9FKEkkDDni+PzcnOuV9cikm188+4=", Base64.NO_WRAP); 
     final byte[] ivBytes = Base64.decode("gqjFHI+YQiP7XYEfcIEJHw==".getBytes(), Base64.NO_WRAP); 

     final SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 

     byte[] decodedBytes = AESCrypt.decrypt(keySpec, ivBytes, encrypted); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Mit dem Wert Cipher, ich benutze es so.

private static byte[] testCipher() { 

    try { 

     final byte[] encrypted = Base64.decode("R3JhbmRlIFZpY3RvaXJlICE=", Base64.NO_WRAP); 

     byte[] keyBytes = Base64.decode("L/91ZYrliXvmhYt9FKEkkDDni+PzcnOuV9cikm188+4=", Base64.NO_WRAP); 
     byte[] ivBytes = Base64.decode("gqjFHI+YQiP7XYEfcIEJHw==".getBytes(), Base64.NO_WRAP); 

     final IvParameterSpec ivSpecForData = new IvParameterSpec(ivBytes); 

     SecretKeySpec decodedKeySpec = new SecretKeySpec(keyBytes, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, decodedKeySpec, ivSpecForData); 

     byte[] decodedBytes = cipher.doFinal(encrypted); // I have the error here // 

     return decodedBytes; 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

Was immer ich tue, habe ich durchweg den gleichen Fehler:

error:1e06b07b:Cipher functions:EVP_DecryptFinal_ex:WRONG_FINAL_BLOCK_LENGTH

Ich versuche in Cipher.getInstance (AES/CBC/NoPadding, AES/CBC/PKCS5Padding, AES/setzen CBC/PKCS7Padding) aber nichts ändert sich. Hast du eine Idee, mir zu helfen?

+1

Willkommen bei Stack Overflow! Ein Füllfehler kann eine beliebige Anzahl von Dingen bedeuten: falscher Schlüssel, falsche Kodierung, unvollständiger/überfüllter Chiffretext. Sie sollten den Verschlüsselungscode anzeigen und die von Ihnen verwendeten Beispielwerte angeben. Ansonsten wäre es einfach zu erraten, was mit diesem Code (oder dem Verschlüsselungscode) falsch ist. Kurz gesagt, erstellen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve). –

Antwort

1

"R3JhbmRlIFZpY3RvaXJlICE=" entschlüsselt zu 17 Hex-Bytes 4772616E646520566963746F6972652021 das ist der ASCII-Text: "Grande Victoire!".

17 Bytes ist keine gültige Größe für AES, die eine Blockchiffre ist, die verschlüsselte Daten ein Vielfaches der Blockgröße von 16 Bytes erfordert.

Es gibt keine Verschlüsselung nur Base64-Codierung.

+0

Danke. Ich dachte wirklich, dass die AES/CBC/PKCS5Padding die Bytes Hash-und konnte den letzten Block direkt füllen. Ich habe im Grunde den gleichen Code in IOS, aber es funktioniert und ich weiß nicht warum. Wenn Sie den Unterschied zwischen diesen beiden wissen, sagen Sie mir, wenn Sie können, denn ich bin immer noch in meinem Entschlüsselungscode stecken. –