【问题标题】:Node JS decipher.final() throws "wrong final block length" errorNode JS decipher.final() 抛出“错误的最终块长度”错误
【发布时间】:2020-07-09 11:34:17
【问题描述】:

我正在尝试加密/解密。加密工作正常,它将加密数据写入文件。解密时出现长度错误。我使用了“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() 处抛出错误。如果我传递文本而不是文件作为输入参数,那就错了。 提前致谢

【问题讨论】:

    标签: node.js encryption node-crypto


    【解决方案1】:

    如果您收到此错误,很可能是您传入了错误的密钥。如果密钥被错误地编码到相关文件中,就会发生这种情况。

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

    这是一个完整的编码到 .json.enc 文件的例子,然后再次解码。注意我使用的是aes-256-cbc,所以如果你改变加密模式,key和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"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多