如何解决无法在节点js中使用“ aes-256-cbc”算法解密pdf文件
我正在尝试使用节点js解密PDF文件,第三方使用C#加密PDF文件。
我很难过,因为我不断收到此错误:
D:\IMP\DevOps Implementation\New folder (2)> node index1.js
internal/crypto/cipher.js:172
const ret = this[kHandle].final();
^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Decipheriv.final (internal/crypto/cipher.js:172:29)
at Object.AESCrypt.decrypt (D:\IMP\DevOps Implementation\New folder (2)\index1.js:12:18)
at D:\IMP\DevOps Implementation\New folder (2)\index1.js:57:24
at FSReqCallback.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:63:3) {
library: 'digital envelope routines',function: 'EVP_DecryptFinal_ex',reason: 'bad decrypt',code: 'ERR_OSSL_EVP_BAD_DECRYPT'
}
我们正在使用以下代码进行加密(C#)
private void FileEncrypt(string inputFile,string outputfile,string password)
{
byte[] salt = GenerateSalt();
byte[] passwords = Encoding.UTF8.GetBytes(password);
RijndaelManaged AES = new RijndaelManaged();
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwords,salt,50000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.CBC;
AES.Padding = PaddingMode.Zeros;
using (FileStream fsCrypt = new FileStream(inputFile + ".aes",FileMode.Create))
{
fsCrypt.Write(salt,salt.Length);
using (CryptoStream cs = new CryptoStream(fsCrypt,AES.CreateEncryptor(),CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile,FileMode.Open))
{
byte[] buffer = new byte[1048576];
int read;
while ((read = fsIn.Read(buffer,buffer.Length)) > 0)
{
cs.Write(buffer,read);
}
}
}
}
}
我们正在使用以下代码进行解密(Node js)
AESCrypt.encrypt = function(cryptkey,iv,cleardata) {
var encipher = crypto.createCipheriv('aes-256-cbc',cryptkey,iv);
return Buffer.concat([
encipher.update(cleardata),encipher.final()
]);
}
function decrypted(){
var enc;
fs.readFile('./resource/test.pdf',function (err,data) {
if (err) {
return console.log(err);
}
var bufferenc = new Buffer.from(data);
var dec = AESCrypt.decrypt(cryptkey,bufferenc);
console.log(dec);
// var buffer = new Buffer.from(dec);
fs.writeFileSync('./resource/decrypted.pdf',dec);
});
}
无法在节点js中使用“ aes-256-cbc”算法解密pdf文件
解决方法
您可以尝试使用以下代码对pdf数据进行解密,它对C#代码来说对我有用:
const fs = require('fs');
const crypto = require("crypto");
function FileDecrypt(inputFile,outputfile,password)
{
// Read the entire file into the buffer.
let buffer = fs.readFileSync(inputFile);
// Read the first eight bytes as a salt.
let salt = buffer.slice(0,8);
let cipherText = buffer.slice(8);
// use key derivation function to get key and iv.
let derivedBytes = crypto.pbkdf2Sync(password,salt,50000,48,"sha1");
let key = derivedBytes.slice(0,32);
let iv = derivedBytes.slice(32);
let cipher = crypto.createDecipheriv('aes-256-cbc',key,iv);
// Switch off auto padding in this context
cipher.setAutoPadding(false);
let decryptedData = Buffer.concat([cipher.update(cipherText),cipher.final()]);
fs.writeFileSync(outputfile,decryptedData);
}
FileDecrypt("encrypted.pdf","node-decrypted.pdf","password");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。