2010-12-01 7 views
5

Ich mache die Verschlüsselung und Entschlüsselung mit AES-Algorithmus mit HüpfburgJ2ME AES Decryption Fehler (org.bouncycastle.crypto.InvalidCipherTextException: pad Block beschädigt)

Meine Verschlüsselung und Entschlüsselung funktioniert ok, aber es gibt mir eine Fehlermeldung, wenn meine Ebene Textgröße ist größer

sogar manchmal ist es nicht entschlüsselten Daten geben

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 könnte das Problem sein?

Antwort

2

Die Linie

String cipherString = new String(cipherBytes); 

ist ein Fehler. cipherBytes ist ein Byte-Array mit beliebigen Werten und kann nicht mit einem der Java-String-Decoder in eine Zeichenfolge konvertiert werden. Sie sollten die Chiffre nur als Byte-Array senden/speichern. Wenn Sie eine Zeichenfolge erstellen müssen, müssen Sie einen Encoder verwenden. Häufig werden Base64-Encoder verwendet, ebenso Base16 (Hex). Sie können die Apache Commons Codec oder meine Lieblings, die Harder Base64 codec verwenden.

+0

Jeder Base64-Coder, der immer noch Bytes anstelle von Zeichen ausgibt, ist meiner Meinung nach etwas idiotisch. Ich kann bereits den Horror sehen, wenn jemand versucht, es in eine UTF-16-XML-Datei zu streamen. Es scheint auch keine anderen Formen von base64 als die Standardversion zu unterstützen. Mmm, vielleicht sollte ich meinen Encoder auch zur Verfügung stellen. –

+0

@owlstead: Ich stimme zu. Der Harder-Codec wird Strings ausgeben und den idiotischen Apache-Commons-Stil unterstützen. –

Verwandte Themen