I am trying to encrypt/decrypt. Encryption works fine and it writes encrypted data to file. While decrypting I am getting an error of length issue. I have used "utf-8" format but error continues.
/ A decrypt function
function decrypt(file) {
let data = JSON.parse(fs.readFileSync(file));
let iv = Buffer.from(data.iv, 'hex');
let encryptedText =
Buffer.from(data.encryptedData, 'hex');
// Creating Decipher
let decipher = crypto.createDecipheriv(
algorithm, Buffer.from(key), iv);
// Updating encrypted text
let decrypted = decipher.update(encryptedText);
let decrypted = Buffer.concat([decrypted, decipher.final()]);
// // returns data after decryption
return decrypted.toString();
}
//run
// Decrypts output
console.log(decrypt('./file.json.enc'));
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipheriv.final (internal/crypto/cipher.js:170:29)
at decrypt (/Users/chandrasekarareddy/Documents/projects/encrypt/final.js:48:22)
at Object.<anonymous> (/Users/chandrasekarareddy/Documents/projects/encrypt/final.js:64:13)
at Module._compile (internal/modules/cjs/loader.js:959:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.Module._load (internal/modules/cjs/loader.js:727:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
at internal/main/run_main_module.js:17:11 {
library: 'digital envelope routines',
function: 'EVP_DecryptFinal_ex',
reason: 'wrong final block length',
code: 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH'
}
Its throwing error at decipher.final(). Instead of file as input param if I pass text it's wrong fine. Thanks in advance
If you're getting this error, it's likely that you're passing in the wrong key. This can happen if the key is encoded incorrectly to the file in question.
I'd suggest the best approach is to encode in hex format (since we're using JSON here).
Here's a complete example of encoding to a .json.enc file, then decoding again. Note I'm using aes-256-cbc, so if you change the mode of encryption, the key and iv length may have to change.
const crypto = require("crypto");
const fs = require("fs");
function encrypt(buffer, algorithm, key, iv) {
const cipher = crypto.createCipheriv(algorithm, key, iv);
return Buffer.concat([cipher.update(buffer, null), cipher.final()]);
}
function decrypt(buffer, algorithm, key, iv) {
const decipher = crypto.createDecipheriv(algorithm, key, iv);
return Buffer.concat([decipher.update(buffer), decipher.final()]);
}
function encryptToJsonFile(buffer, filePath, algorithm, key, iv) {
let encryptedData = encrypt(buffer, algorithm, key, iv);
let fileData = { encryptedData: encryptedData.toString("hex"), iv: iv.toString("hex") };
fs.writeFileSync(filePath, JSON.stringify(fileData), "utf8");
return fileData;
}
function decryptJsonFile(filePath, algorithm, key) {
let fileData = JSON.parse(fs.readFileSync(filePath, "utf8"));
let encryptedData = Buffer.from(fileData.encryptedData, "hex");
let iv = Buffer.from(fileData.iv, "hex");
return decrypt(encryptedData, algorithm, key, iv);
}
const filePath = "./test.json.enc";
const EncryptionAlgorithm = "aes-256-cbc";
const key = Buffer.from("70ac30ae736068d90467beec0aedd75f3714cfe1e83b030c67911bb649316be0", "hex");
const iv = Buffer.from("3d4be42df33cc6a030aa54df2e144920", "hex");
const textToEncrypt = "My secrets are here";
const bufferToEncrypt = Buffer.from(textToEncrypt, "utf8");
console.log("Encrypted:", encryptToJsonFile(bufferToEncrypt, filePath, EncryptionAlgorithm, key, iv));
console.log("Decrypted:", decryptJsonFile(filePath, EncryptionAlgorithm, key).toString("utf8"));