2010-12-01 54 views
5

Je fais le chiffrement et le déchiffrement en utilisant l'algorithme AES avec château gonflableErreur J2ME AES déchiffrage (org.bouncycastle.crypto.InvalidCipherTextException: bloc de tampon corrompu)

fonctionne Mon chiffrement et le déchiffrement ok mais il me donne erreur lorsque ma plaine la taille du texte est plus grand

même parfois, il donne des données non déchiffrées

public static boolean setEncryptionKey(String keyText) 
{ 
    byte[] keyBytes = keyText.getBytes(); 

    key = new KeyParameter(keyBytes); 
    engine = new AESFastEngine(); 
    cipher = new PaddedBufferedBlockCipher(engine); 

    return true; 
} 

cryptage:

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; 
    } 

Décryptage:

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; 
    } 

Ce décryptage me donne erreur suivant

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) 

ce qui pourrait être le problème?

Répondre

2

La ligne

String cipherString = new String(cipherBytes); 

est un bug. cipherBytes est un tableau d'octets avec des valeurs arbitraires et ne peut pas être converti en chaîne à l'aide de l'un des décodeurs de chaîne Java. Vous devriez simplement envoyer/enregistrer le chiffrement en tant que tableau d'octets. Si vous devez en faire une chaîne, vous devrez utiliser un encodeur. Les encodeurs Base64 sont souvent utilisés, tout comme Base16 (hex). Vous pouvez utiliser le Apache Commons Codec ou mon favori, le Harder Base64 codec.

+0

Tout codeur base64 qui sort encore des octets au lieu de caractères est un peu idiot à mon avis. Je peux déjà voir l'horreur quand quelqu'un essaie de le diffuser dans un fichier XML UTF-16. En outre, il ne semble pas soutenir d'autres formes de base64 que celle par défaut. Mmm, peut-être que je devrais rendre mon encodeur disponible aussi. –

+0

@owlstead: Je suis d'accord. Le codec Harder produira des chaînes de caractères et supportera le style idiot d'Apache commons. –