node crypto - dechipher文件通过openssl编码

时间:2016-10-14 12:08:37

标签: node.js encryption openssl cryptography

节点6.3.1上的

我正在尝试让节点解密最初通过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;
};

问题:

  1. 我想使用decipher.setAutoPadding(false)吗?如果我没有设置这个,我不断得到错误数字包络例程:EVP_DecryptFinal_ex:与此处描述的类似的解密错误:https://github.com/nodejs/node/issues/2794
    如果我设置了这个,我没有得到错误,但文件是乱码。我可以将decryptedKey设置为任何东西,它仍然会破译并返回乱码。

  2. 为什么我无法解密文件?我错过了什么?

0 个答案:

没有答案