。
我正在尝试让节点解密最初通过openssl加密的文件
这是文件“blah.txt”的加密方式。最后一部分只是为了确认我们能够使用私钥解密。
# ---------------
# Prep
#
# create private key
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# generate public key from our private key
openssl rsa -pubout -in private_key.pem -out public_key.pem
# create random key
openssl rand -base64 128 -out key.bin
# ---------------
# Encryption
#
# encrypt data using random key
openssl enc -aes-256-cbc -salt -in blah.txt -out blah.txt.enc -pass file:./key.bin
# encrypt random key using public key
openssl pkeyutl -encrypt -in key.bin -pubin -inkey public_key.pem -out key.bin.enc
# ---------------
# DECRYPTION
#
# decrypt random key using private key
openssl pkeyutl -decrypt -inkey private_key.pem -in key.bin.enc -out key.bin.decrypted
# decrypt data using decrypted random key
openssl enc -d -aes-256-cbc -in blah.txt.enc -out decrypted.txt -pass file:./key.bin.decrypted
然后我有一个简单的表单,将文件提交给节点服务器。有一个辅助函数,旨在使用私钥文件解密加密的随机密钥,而后者又用于解密文件。
我可以确认随机密钥文件是按私钥的预期解密的。 我的问题是我无法使用密钥成功解密加密文件。我得到一个错误(见下面的问题1)或者我在文件中得到了胡言乱语。
节点中的辅助功能代码:
var decryptFileWithRsaPrivateKey = function(relativeOrAbsolutePathToEncryptedFile, relativeOrAbsolutePathToEncryptedKey, relativeOrAbsolutePathToPrivateKey) {
var absolutePathToPrivateKey= path.resolve(relativeOrAbsolutePathToPrivateKey);
var privateKey = fs.readFileSync(absolutePathToPrivateKey, "utf8");
var absolutePathToEncryptedKey = path.resolve(relativeOrAbsolutePathToEncryptedKey);
var encryptedKeyBuffer = fs.readFileSync(absolutePathToEncryptedKey);
var options = {
key: privateKey,
//padding: crypto.constants.RSA_NO_PADDING
padding: crypto.constants.RSA_PKCS1_PADDING
//padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
}
var decryptedKey = crypto.privateDecrypt(options, encryptedKeyBuffer).toString('binary');
//decryptedKey = 'abcdef'
//var decryptedKey = fs.readFileSync(absolutePathToEncryptedKey).toString('binary');
logger.info('decryptedKey', util.inspect(decryptedKey));
var absolutePathToEncryptedFile = path.resolve(relativeOrAbsolutePathToEncryptedFile);
var encryptedFileBuffer = fs.readFileSync(absolutePathToEncryptedFile);
// one of openssl list-cipher-algorithms
var algorithm = 'AES-256-CBC';
var decipher = crypto.createDecipher(algorithm, decryptedKey);
decipher.setAutoPadding(false)
logger.info('type of', util.inspect(encryptedFileBuffer))
var decryptedBuffer = decipher.update(encryptedFileBuffer);
decryptedBuffer += decipher.final();
logger.info('horay: ', util.inspect(decryptedBuffer));
return decryptedBuffer;
};
问题:
我想使用decipher.setAutoPadding(false)吗?如果我没有设置这个,我不断得到错误数字包络例程:EVP_DecryptFinal_ex:与此处描述的类似的解密错误:https://github.com/nodejs/node/issues/2794
如果我设置了这个,我没有得到错误,但文件是乱码。我可以将decryptedKey设置为任何东西,它仍然会破译并返回乱码。
为什么我无法解密文件?我错过了什么?