2014-03-25 8 views
7

ich dieses Tutorial gefolgt zur Verschlüsselung und einfache Strings in android/java Entschlüsseln:bekommen "EVP_DecryptFinal_ex: falsche letzte Blocklänge" bei der Entschlüsselung

https://stackoverflow.com/questions/4319496/how-to-encrypt-and-decrypt-data-in-java ich eine Cryptography Klasse gemacht:

public class Cryptography { 

    public static SecretKey generateKey() throws NoSuchAlgorithmException { 
     MessageDigest digest = MessageDigest.getInstance("SHA"); 
     digest.update("BhLKTyLoP YroUsRQT".getBytes()); 
     return new SecretKeySpec(digest.digest(), 0, 16, "AES"); 
    } 

    public static byte[] encrypt(String message, SecretKey key) throws NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException { 
     Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     aes.init(Cipher.ENCRYPT_MODE, key); 
     return aes.doFinal(message.getBytes()); 
    } 

    public static String decrypt(byte[] cipherText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 
     Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     aes.init(Cipher.DECRYPT_MODE, key); 
     return new String(aes.doFinal(cipherText)); 
    } 

} 

Ich war Lage Methode zum verschlüsseln und gab mir dies:

Encrypted username: [[email protected] 
Encrypted password: [[email protected] 

aber wenn ich decrypt:

SecretKey secret = Cryptography.generateKey(); 
Log.d("encryption", "Decrypted username: " + Cryptography.decrypt(encryptedUsername.getBytes(),secret) 
           + " Decrypted password: " + Cryptography.decrypt(encyptedPassword.getBytes(),secret)); 

Es gibt mir den Fehler:

03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ java.lang.RuntimeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 
03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.NativeCrypto.EVP_CipherFinal_ex(Native Method) 
03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.OpenSSLCipher.doFinalInternal(OpenSSLCipher.java:398) 
03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:434) 
03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at javax.crypto.Cipher.doFinal(Cipher.java:1111) 
03-25 15:22:23.461 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.sblive.utils.Cryptography.decrypt(Cryptography.java:28) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.sblive.aufschoolbliz.GradeBookFragment$2.onClick(GradeBookFragment.java:99) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.view.View.performClick(View.java:4240) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.view.View$PerformClick.run(View.java:17721) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:730) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5103) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525) 
03-25 15:22:23.465 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
03-25 15:22:23.469 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-25 15:22:23.469 2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 
+0

ECB-Modus in der Regel nur dann sicher ist zu verwenden, wenn die Nachricht kleiner oder gleich 16 Bytes ist. Sobald die Nachricht größer als 16 Bytes wird, leckt der Modus Informationen. Versuchen Sie stattdessen den CBC-Modus. – jww

+0

es geändert, aber es funktioniert nicht .. – danieljohngomez

+1

Scheint, wie '' encryptedUsername' und encyptedPassword' Strings sind und Sie versuchen, sie als Halter für Byte-Arrays zu behandeln. Sie sollten die verschlüsselten Daten als 'byte []' speichern und als 'byte []' übergeben. Oder zumindest zu Base64 und zurück entsprechend konvertieren. –

Antwort

3

Encrypted username: [[email protected]

Encrypted password: [[email protected]

Diese sind zu klein. Angenommen, die Klartext-Nachricht wurde mit weniger als 16 Bytes, sollten diese dann genau 16 Byte aufgrund PKCS padding.

Sie haben eine Codierung Problem irgendwo. Wahrscheinlich null ein eingebettetes, die das Ende des Chiffretextes Scheiben ab, wenn als String interpretiert ...

als eine Angelegenheit der Tatsache, sehen sie aus wie Zeiger gedruckt werden ....

+0

oh ja, ich wurde mit String.valueOf, wenn ich es auf gemeinsame Vorlieben bin zu speichern. Allerdings bekomme ich jetzt unbekannte Zeichen für die Verschlüsselung, etwa so: ") J;] w.6 t" – danieljohngomez

+1

"bekomme jetzt unbekannte Zeichen für die Verschlüsselung ..." - du brauchst wahrscheinlich ein unterschiedliche Strategie für die Art und Weise, wie Sie mit den rohen Bytes umgehen. Vor allem, wenn Sie versuchen, sie wie druckbare Saiten zu behandeln. Sie könnten Hex/Base32/Base64 codieren sie (und dekodieren) sie wie erforderlich. – jww

Verwandte Themen