2009-07-27 7 views
4

Je décrypte un fichier XML à partir du système de fichiers à l'aide de Bouncy Castle. Je publie le texte déchiffré et obtient une erreur fatale SAXParseException sur le tout dernier octet de données. Voici ma méthode de décryptage et la configuration de l'objet chiffré. J'ai d'abord utilisé des flux chiffrés, et tout a fonctionné parfaitement (le code commenté était mon flux). En raison des fichiers de politique et des utilisateurs finaux n'ayant pas les versions 256 bits illimitées, j'ai besoin d'utiliser le château gonflable.BouncyCastle Last Byte Decrypt Problème

Des idées pour lesquelles l'octet final ne passe pas?

De Constructor:

keyParam = new KeyParameter(key); 
engine = new AESEngine(); 
paddedBufferedBlockCipher = 
    new PaddedBufferedBlockCipher(new CBCBlockCipher(engine)); 

Décrypter Méthode:

public void decrypt(InputStream in, OutputStream out) { 
    try 
    { 
     paddedBufferedBlockCipher.init(false, 
      new ParametersWithIV(keyParam, _defaultIv)); 
//   cipher.init(Cipher.DECRYPT_MODE, secretKey, ivs); 
//   CipherInputStream cipherInputStream 
//      = new CipherInputStream(in, cipher); 

     byte[] buffer = new byte[4096]; 
     byte[] outBuffer = new byte[4096]; 

     for (int count = 0; (count = in.read(buffer)) != -1;) { 
      paddedBufferedBlockCipher.processBytes(buffer, 0, 
       count, outBuffer, 0); 
      out.write(outBuffer, 0, count);   
     } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

[Fatal Error] :40:23: Element type "Publi" must be followed by either attribute specifications, ">" or "/>". 
org.xml.sax.SAXParseException: Element type "Publi" must be followed by either attribute specifications, ">" or "/>". 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:264) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292) 
+0

Que je ne suis pas sûr de, je n'ai jamais eu à vérifier avec l'option de flux. Comme je fais cela dans la boucle, je n'ai pas besoin du doFinal() et je suppose que cela fonctionnerait bien. Je vais faire un System out pour la variable "count" et voir quel est le dernier numéro imprimé –

+0

Wrong: "Traite le dernier bloc dans le buffer Si le buffer est actuellement plein et ** le padding doit être ajouté ** un appel toFinal produira 2 * getBlockSize() octets. " – akarnokd

Répondre

2

Appelez-vous doFinal() avec le morceau final de données?

public void decrypt(InputStream in, OutputStream out) { 
    try 
    { 
     paddedBufferedBlockCipher.init(false, 
      new ParametersWithIV(keyParam, _defaultIv)); 
     byte[] buffer = new byte[4096]; 
     byte[] outBuffer = new byte[4096]; 

     for (int count = 0; (count = in.read(buffer)) != -1;) { 
      int c2 = paddedBufferedBlockCipher.processBytes(buffer, 0, 
       count, outBuffer, 0); 
      out.write(outBuffer, 0, c2);      
     } 
     count = paddedBufferedBlockCipher.doFinal(outBuffer, 0); 
     out.write(outBuffer, 0, count);      
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

L'ajout de ces deux lignes à la fin rend la sortie correcte. Je reçois le fichier XML entier. Mais toujours obtenir la même SAXParseException comme ci-dessus, même si le fichier semble bon –

+0

J'essaye de désérialiser le XML à un objet juste après le décryptage est terminé –

+0

J'ai en fait deux fichiers XML j'ai essayé. On donne l'exception ci-dessus. L'autre fichier donne "Un caractère XML non valide (Unicode: 0x0) a été trouvé dans le contenu de l'élément du document." –