J2ME AES Decryption Fehler (org.bouncycastle.crypto.InvalidCipherTextException: pad Block beschädigt)
-
29-09-2019 - |
Frage
Ich mache die Verschlüsselung und Entschlüsselung mit AES-Algorithmus mit Hüpfburg
Meine Verschlüsselung und Entschlüsselung funktioniert ok, aber es gibt mir Fehler, wenn meine Klartextgröße größer ist
sogar manchmal es gibt nicht entschlüsselten Daten
public static boolean setEncryptionKey(String keyText)
{
byte[] keyBytes = keyText.getBytes();
key = new KeyParameter(keyBytes);
engine = new AESFastEngine();
cipher = new PaddedBufferedBlockCipher(engine);
return true;
}
Verschlüsselung:
public static String encryptString(String plainText)
{
byte[] plainArray = plainText.getBytes();
cipher.init(true, key);
byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)];
int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0);
cipher.doFinal(cipherBytes, cipherLength);
String cipherString = new String(cipherBytes);
return cipherString;
}
Decryption:
public static String decryptString(String encryptedText)
{
byte[] cipherBytes = encryptedText.getBytes();
cipher.init(false, key);
byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)];
int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0);
cipher.doFinal(decryptedBytes, decryptedLength);
String decryptedString = new String(decryptedBytes);
int index = decryptedString.indexOf("\u0000");
if (index >= 0)
{
decryptedString = decryptedString.substring(0, index);
}
return decryptedString;
}
Diese Entschlüsselung gibt mir folgende Fehler
org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(+30)
at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(+190)
at com.NewCrypto.decryptString(NewCrypto.java:103)
at com.New_Midlet.startApp(New_Midlet.java:23)
at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:44)
at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:375)
at com.sun.midp.main.Main.runLocalClass(Main.java:477)
at com.sun.midp.main.Main.main(+80)
, was das Problem sein könnte?
Lösung
Die Zeile
String cipherString = new String(cipherBytes);
Das ist ein Fehler. cipherBytes
ist ein Byte-Array mit beliebigen Werten und kann nicht in eine Zeichenfolge jede des Java-String-Decoders unter Verwendung überführt werden. Sie sollten nur senden / speichern Chiffre als Byte-Array. Wenn Sie es einen String machen muss dann werden Sie einen Encoder verwenden. Base64-Geber häufig verwendet werden, sind als Base16 (hex). Sie können die Apache Commons Codec verwenden oder mein Favorit, die Härtere Base64-Codec .