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) {
Je travaille sur Android si ne fonctionnera pas de l'analyseur, mais j'ai modifié ma question pour inclure plus d'informations –