2016-07-02 7 views
0

I Verschlüsselung/Entschlüsselung in Android mit Code versuchen zur Verfügung gestellt hier: http://iamvijayakumar.blogspot.com/2013/10/android-example-for-encrypt-and-decrypt.htmlBadPaddingException: pad Block in Android 5.0 beschädigt, während AES incryption/Entschlüsselung versucht

Der Code für das Gerät arbeitet, die Android 4.1 läuft aber tut scheint nicht in einem Android 5.0.1 Gerät zu laufen

Das Fehlerprotokoll wird unten zur Verfügung gestellt.

AESHelper Klasse:

package com.myapplication; 



import javax.crypto.KeyGenerator; 

    import java.security.SecureRandom; 

    import javax.crypto.Cipher; 
    import javax.crypto.KeyGenerator; 
    import javax.crypto.SecretKey; 
    import javax.crypto.spec.SecretKeySpec; 

public class AESHelper { 

public static String encrypt(String seed, String cleartext) throws Exception { 
    byte[] rawKey = getRawKey(seed.getBytes()); 
    byte[] result = encrypt(rawKey, cleartext.getBytes()); 
    return toHex(result); 
} 

public static String decrypt(String seed, String encrypted) throws Exception { 
    byte[] rawKey = getRawKey(seed.getBytes()); 
    byte[] enc = toByte(encrypted); 
    byte[] result = decrypt(rawKey, enc); 
    return new String(result); 
} 

private static byte[] getRawKey(byte[] seed) throws Exception { 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 
    sr.setSeed(seed); 
    kgen.init(128, sr); // 192 and 256 bits may not be available 
    SecretKey skey = kgen.generateKey(); 
    byte[] raw = skey.getEncoded(); 
    return raw; 
} 


private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] encrypted = cipher.doFinal(clear); 
    return encrypted; 
} 

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
    byte[] decrypted = cipher.doFinal(encrypted); 
    return decrypted; 
} 

public static String toHex(String txt) { 
    return toHex(txt.getBytes()); 
} 
public static String fromHex(String hex) { 
    return new String(toByte(hex)); 
} 

public static byte[] toByte(String hexString) { 
    int len = hexString.length()/2; 
    byte[] result = new byte[len]; 
    for (int i = 0; i < len; i++) 
     result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue(); 
    return result; 
} 

public static String toHex(byte[] buf) { 
    if (buf == null) 
     return ""; 
    StringBuffer result = new StringBuffer(2*buf.length); 
    for (int i = 0; i < buf.length; i++) { 
     appendHex(result, buf[i]); 
    } 
    return result.toString(); 
} 
private final static String HEX = "ABCDEF"; 
private static void appendHex(StringBuffer sb, byte b) { 
    sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); 
} 


} 

MainActivity Calss:

package com.myapplication; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.TextView; 
import android.widget.Toast; 



public class MainActivity extends Activity { 

String seedValue = "This Is MySecure"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    String normalText = "ABCD"; 
    String normalTextEnc; 
    try { 
     normalTextEnc = AESHelper.encrypt(seedValue, normalText); 
     String normalTextDec = AESHelper.decrypt(seedValue, normalTextEnc); 
     TextView txe = new TextView(this); 
     txe.setTextSize(14); 
     txe.setText("Normal Text ::"+normalText +" \n Encrypted Value :: "+normalTextEnc +" \n Decrypted value :: "+normalTextDec); 
     setContentView(txe); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.e("MYAPP", "exception", e); 
    } 



} 

Log:

07-02 21:06:45.545 11608-11608/com.myapplication E/MYAPP: exception 
                     javax.crypto.BadPaddingException: pad block corrupted 
                      at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:854) 
                      at javax.crypto.Cipher.doFinal(Cipher.java:1340) 
                      at com.dhungana.aditya.myapplication.AESHelper.decrypt(AESHelper.java:54) 
                      at com.dhungana.aditya.myapplication.AESHelper.decrypt(AESHelper.java:27) 
                      at com.dhungana.aditya.myapplication.MainActivity.onCreate(MainActivity.java:27) 
                      at android.app.Activity.performCreate(Activity.java:5933) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:147) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5253) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:948) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743) 

Antwort

0

Sie wahrscheinlich ein padding-Algorithmus erklären müssen, wenn Sie Ihre Eingabe nicht ein genaues Vielfaches von ist die Schlüssellänge.

Versuchen Sie, die Chiffre mit "AES/CBC/PKCS5Padding" instanziiert

+0

änderte ich die ** Cipher Cipher = Cipher.getInstance ("AES"); ** bis ** Cipher Cipher = Cipher.getInstance (“ AES/CBC/PKCS5Padding "); ** aber jetzt gibt es mir ** javax.crypto.BadPaddingException: Fehler: 06065064: digitale Envelope-Routinen: EVP_DecryptFinal_ex: schlecht entschlüsseln ** – AD1TYA

+0

Hast du es auch zur Verschlüsselung hinzugefügt? – Heri

+0

Ja, ich habe es sowohl zur Verschlüsselung als auch zur Entschlüsselung hinzugefügt. – AD1TYA