2010-10-12 6 views
2

J'ai été chargé de décrypter un fichier en Java qui a été chiffrée en utilisant les critères suivants:problème Java AES Décryptage

algorithme de chiffrement AES avec une clé de 128 bits, le mode de la BCE et le rembourrage PKCS7. Le format de fichier crypté est: - premier octet est hexadécimal 0x31 - méthode de chiffrement spécifiant utilisé (1 pour AES) - suivi par les octets chiffrés du fichier d'entrée

Je dois aussi télécharger le fichier, donc voici mon essayer jusqu'à présent:

le code de téléchargement, je saute le premier octet ici car il est pas nécessaire et n'est pas crypté:


final String PATH = "/sdcard/" + IMEI + ".xml"; //put the downloaded file here 
     try { 
      URL url = new URL(context.getString(R.string.xml_feed) + IMEI + ".xml"); 
      enc_File = new File(PATH); 
      long startTime = System.currentTimeMillis(); 

      /* Open a connection to that URL. */ 

      URLConnection ucon = url.openConnection(); 

      /* 
      * Define InputStreams to read from the URLConnection. 
      */ 
      InputStream is = ucon.getInputStream(); 

      BufferedInputStream bis = new BufferedInputStream(is); 

      /* 
      * Read bytes to the Buffer until there is nothing more to read(-1).    */ 

      ByteArrayBuffer baf = new ByteArrayBuffer(50); 

      int current = 0; 
      bis.skip(1); 
      while ((current = bis.read()) != -1) { 

       baf.append((byte) current); 

      } 

      /* Convert the Bytes read to a String. */ 

      FileOutputStream fos = new FileOutputStream(enc_File); 
      fos.write(baf.toByteArray()); 
      fos.close(); 

     } catch (IOException e) { 

     } 

    } 

Cela me donne le fichier crypté téléchargé, je puis essayer de décrypter ce fichier en utilisant le code suivant:


  String bytes = toHex("the 16 bit key"); 
      Key skeySpec = new SecretKeySpec(toByte(bytes), "AES"); 
      Cipher c = Cipher.getInstance("AES/ECB/PKCS7Padding"); 

      byte[] buf = new byte[1024]; 


      // Bytes read from in will be decrypted 

      InputStream inCipher = new FileInputStream(enc_File); 
      OutputStream outCipher = new FileOutputStream(cipherFile); 
      c.init(Cipher.DECRYPT_MODE, skeySpec); 
      inCipher = new CipherInputStream(inCipher, c); // Read in the decrypted bytes and write the cleartext to out 
      int numRead = 0;    

        while ((numRead = inCipher.read(buf)) >= 0) { 
          outCipher.write(buf, 0, numRead); 
       } 
       outCipher.close(); 

ci-dessus doivent me donner les données decryted dans un nouveau fichier.

Et voici les méthodes de util utilisées dans ce code pour créer la clé au format octet pour le SecretKeySpec


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

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

Cependant, cela me donne actuellement l'exception suivante:

10-12 11:19:26.337: WARN/System.err(5376): java.io.IOException: last block incomplete in decryption 

Le fichier chiffré se télécharge correctement, le decrytption s'exécute mais j'obtiens l'exception ci-dessus et je vérifie le fichier Ce qui devrait être décrypté révèle que la première ligne du fichier a été déchiffrée correctement, puis de petites parties des deux lignes suivantes, puis elle renvoie la poubelle pour le reste.

Je suis bloqué à cela maintenant ne sachant pas où chercher le problème, quelqu'un peut-il aider? Ou pointez-moi dans la direction de ce qui peut causer l'exception?

Informations complémentaires:

10-12 15:30:37.291: WARN/System.err(6898):  at com.mypackage.net.SettingsProvisioner.getRoutingDoc(SettingsProvisioner.java:217) 

La ligne ci-dessus est de l'exception dans le chat log (stacktrace)

Et il montre que l'exception est INTERVENUES à cette ligne de code:

while ((numRead = inCipher.read(buf)) >= 0) { 

Répondre

1

Sans la pile complète il est difficile de déboguer nous aurions à recompiler votre code, si vous ne pouvez pas le poster ici pour secu raisons rité (évidente) essayer un analyseur de stacktrace comme le stackanalyzer IBM ou lady4j

L'analyseur fonctionne pour everykind du développement (Android inclus)

+0

Je travaille sur Android si ne fonctionnera pas de l'analyseur, mais j'ai modifié ma question pour inclure plus d'informations –

Questions connexes