节点 JS decipher.final() 抛出 "wrong final block length" 错误

Node JS decipher.final() throws "wrong final block length" error

我正在尝试 encrypt/decrypt。加密工作正常,它将加密数据写入文件。解密时出现长度错误问题。我使用了“utf-8”格式,但错误仍然存​​在。

/ 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'
}

它在 decipher.final() 处抛出错误。如果我传递文本而不是文件作为输入参数,那是错误的。 提前致谢

如果您遇到此错误,很可能是因为您传递了错误的密钥。如果密钥未正确编码到相关文件,就会发生这种情况。

我建议最好的方法是以十六进制格式编码(因为我们在这里使用 JSON)。

这是编码为 .json.enc 文件然后再次解码的完整示例。注意我使用的是 aes-256-cbc,因此如果您更改加密模式,密钥和 iv 长度可能需要更改。

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