Encryptage avec Java Cipher / Décryptage en NodeJS
Bonjour,
Je migre une application Java en NodeJS. Dans mon code Java, j'encrypte des fichiers avant de les stocker sur un cloud. J'utilisait javax.crypto.Cipher pour encrypter et décrypter les fichiers.
Aujourd'hui, j'ai besoin de développer les deux mêmes méthodes en NodeJS, pour pouvoir décrypter des fichiers cryptés par le code Java ou encrypter de nouveaux fichiers.
Voici mon code Java, qui fonctionne très bien :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private static byte[] encrypt(byte[] plainData) {
byte[] encryptedData = new byte[0];
try {
byte[] cle = (new String(PASSWORD)).getBytes();
SecretKey key = new SecretKeySpec(cle, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedData = cipher.doFinal(plainData);
} catch (Exception ex) {
//Log Error
}
return encryptedData;
}
private static void decrypt(InputStream in, OutputStream out) {
try {
// Cipher INIT
byte[] cle = (new String(PASSWORD)).getBytes();
SecretKey key = new SecretKeySpec(cle, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
// Decrypt
CipherInputStream cis = new CipherInputStream(in, cipher);
byte[] block = new byte[8];
int i;
while ((i = cis.read(block)) != -1) {
out.write(block, 0, i);
}
out.close();
} catch (IOException ex) {
//Log Error
}
} |
Après plusieurs jours à galérer, je commence à avoir un code qui s'approche, je pense, de ce qu'il faut faire. Dans l’état, le code décrypte (en tout cas aucune exception n'est levée). Cependant, le fichier retourné reste illisible.
Je pense qu'il peut s'agir d'un problème d'encodage, de padding, ou de n'importe quoi d'autre..
Voici le code NodeJS que j'essaye d'écrire pour décrypter :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| public static decrypt(encryptedData: Buffer): any {
var decipher = crypto.createDecipher('aes-128-ecb', process.env.CYPHER_PASSWORD);
decipher.setAutoPadding(false);
var s;
try {
s = Buffer.concat([decipher.update(encryptedData, 'base64'), decipher.final()]);
}
catch(e){
console.log(e);
}
return s;
} |
Comme je disais, ce code compile, tourne et renvoie un fichier illisible. Savez-bous ce qui pourrait être la cause de ce mauvais décryptage / decodage ?
Merci d'avance pour votre aide.
Solution trouvée mais pas comprise
J'ai finalement trouvé la solution en testant toutes les combinaisons possibles des 4 variables que j'ai identifié : Algorithme, Padding, Encoding de la clef, createDecipher vs createDecipheriv.
Je ne comprend toujours pas c'est cette configuration qui fonctionne et pas une autre. Si quelqu'un sait expliquer ce serait super =)
Si personne ne répond d'ici quelques jours à ce sujet, je mettrai cette question comme résolue.
Voici le code qui fonctionne :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public static decrypt(encryptedData: Buffer): Buffer {
var decipher = crypto.createDecipheriv(process.env.CYPHER_ALGO, process.env.CYPHER_PASSWORD, "");
var s;
try {
var b1: Buffer = decipher.update(encryptedData);
var b2: Buffer = decipher.final();
s = Buffer.concat([b1, b2]);
}
catch (e) {
console.log(e);
}
return s;
}
// ALGO : 'aes-128-ecb' |