Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'essaie de faire un chiffrement/déchiffrement avec nodeJS. Pour cela, je crée une clé et un IV et l'algo de chifrement sera AES128 (alias pour "AES-128-CBC"). Je tourne sur Windows 7 avec Node 10. Ce qui m'oblige à utiliser certaines méthodes, les autres étant devenues obsolètes.

Mon programme actuel possède 2 fichiers:
Le premier est un fichier test.js qui me sert à lancer l'application. Voici le code:

//test.js
const sessionManager = require('./SessionManager');

let key = Buffer.from("6cc20a4dc5a6522703a7465e84c33438", "hex");
let iv = Buffer.from("02f5c4a9d6c9f460d70367ee0e2b944b", "hex");
let text = "hello world !";
let algo = "aes128";

let cipher = sessionManager.getEncryptedText(text, algo, key, iv);
console.log("cipher: " + cipher);
console.log("=================");
let decipher = sessionManager.getDecryptedText(cipher, algo, key, iv);
console.log("text:" + decipher);

Le seconde fichier est celui qui contient toute la logique de mon programme:

//SessionManager.js

const crypto = require('crypto');

module.exports.getEncryptedText = function(text, algo, key, iv = crypto.randomBytes(16)){
    console.log("Key cipher: " + key.toString("hex"));
    console.log("IV cipher: " + iv.toString("hex"));
    let cipher = crypto.createCipheriv(algo, key, iv);
    let tmp = Buffer.concat([cipher.update(Buffer.from(text)),cipher.final()]);
    console.log("Core cipher: " + tmp.toString("hex"));
    let encrypt = Buffer.concat([iv ,tmp]);
    encrypt = encrypt.toString("hex");
    return encrypt;
};

module.exports.getDecryptedText = function(text, algo, key){
    console.log("Key decipher: " + key.toString("hex"));
    let iv = Buffer.from(text.slice(0,32), "hex");
    console.log("IV decipher: " + iv.toString("hex"));
    let encryptedText = Buffer.from(text.slice(32), "hex");
    console.log("Core decipher: " + encryptedText.toString("hex"));
    let decipher = crypto.createDecipher(algo, key, iv);
    let decrypt = Buffer.concat([decipher.update(encryptedText), decipher.final()]);
    return decrypt.toString("utf-8");
};

Ce que je veux

Ce que j'aimerais, c'est obtenir à la fin de l'exécution de test.js un log avec text:hello world !. Bref, j'aimerais juste que le déchiffrement fonctionne.

Ce que j'obtiens

Actuellement, le programme plante à l'appel de decipher.final() et envoie l'erreur suivante dans mes logs:

Key cipher: 6cc20a4dc5a6522703a7465e84c33438
IV cipher: 02f5c4a9d6c9f460d70367ee0e2b944b
Core cipher: 46e31d8c13af5ea442a9fa3720bca49e
cipher: 02f5c4a9d6c9f460d70367ee0e2b944b46e31d8c13af5ea442a9fa3720bca49e
=================
Key decipher: 6cc20a4dc5a6522703a7465e84c33438
IV decipher: 02f5c4a9d6c9f460d70367ee0e2b944b
Core decipher: 46e31d8c13af5ea442a9fa3720bca49e
internal/crypto/cipher.js:145
  const ret = this._handle.final();
                           ^

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Decipher.final (internal/crypto/cipher.js:145:28)
    at Object.module.exports.getDecryptedText (E:\GitHub\memoryless\app\SessionManager.js:21:75)
    at Object.<anonymous> (E:\GitHub\memoryless\app\test.js:11:31)
    at Module._compile (internal/modules/cjs/loader.js:678:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)
    at Module.load (internal/modules/cjs/loader.js:589:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:528:12)
    at Function.Module._load (internal/modules/cjs/loader.js:520:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:719:10)
    at startup (internal/bootstrap/node.js:228:19)

J'ai un peu fouillé sur le web pour savoir ce que signifiait cette erreur. D'après ce que j'ai lu, cela signifie généralement que la clé ou l'IV ne sont pas les mêmes entre le chifffrement et le déchiffrement. Or, ici, les logs montrent bien que c'est le cas. Si quelqu'un pouvait m'aider, ce sera sympa, merci :)

2 réponses


Huggy
Réponse acceptée

vu que tu utilises un vecteur d'initialisation
createDecipher -> createDecipheriv

Key cipher: 6cc20a4dc5a6522703a7465e84c33438
IV cipher: 02f5c4a9d6c9f460d70367ee0e2b944b
Core cipher: 46e31d8c13af5ea442a9fa3720bca49e
cipher: 02f5c4a9d6c9f460d70367ee0e2b944b46e31d8c13af5ea442a9fa3720bca49e
=================
Key decipher: 6cc20a4dc5a6522703a7465e84c33438
IV decipher: 02f5c4a9d6c9f460d70367ee0e2b944b
Core decipher: 46e31d8c13af5ea442a9fa3720bca49e
text:hello world !

Oh ! La vilaine erreur qui m'aura rendu fou pendant des heures xD Un grand merci, car j'aurais encore pu chercher pendant trèèèès longtemps ^^