我需要通过 AES-256-CBC
加密文件,但使用 textual密码而不是键和iv。我认为,没有任何方法可以这样做,因此我必须将文本密码转换为字节数组,以某种方式将其扩展到密钥长度并将其作为钥匙将其视为。与初始化向量。所以问题是如何正确执行此操作?
P.S。请注意,我需要使用命令行OpenSSL,而是使用库。
victor,您的方向正确。在这种情况下,密码只是您可以进行的,并获得将用于与AE进行加密的密钥。IV(初始化向量)是可以公开的,并且不是密码的一部分。该函数EVP_EncryptInit_ex()
具有一个参数。将是这样的:
EVP_CIPHER_CTX cryptContext;
EVP_CIPHER_CTX_init(&cryptContext);
EVP_EncryptInit_ex(&cryptContext, EVP_aes_256_cbc(), 0, key, iv);
EVP_EncryptUpdate(&cryptContext, output, &outputLength, input, inputLength);
EVP_CIPHER_CTX_cleanup(&cryptContext);
使用该函数EVP_BytesToKey()
来将密码"转换"到键:
uint8_t key[AES_256_CBC_KEY_SIZE];
uint8_t iv[AES_256_CBC_IV_SIZE];
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha256(), salt, password, passwordLength, 1, key, iv);
如果您要做的就是将文本密码转换为与新的CreateCipher createCipher API一起使用(添加" IV"),则清楚转换信息(请参阅Wagner的答案)其他响应)。
但是,原因这些API被弃用对于理解为什么要以不同的方式使用它们。因此,我建议您使用最新节点API阅读有关加密的强大文章。简短的文章,但非常清晰但很安全。
http://vancelucas.com/blog/stronger-encryption-and-decryption-in-node-js/
我之所以这么说,是因为它可以很容易地从一个API转移到另一个API而不理解变化的原因,因此失去了预期更改的好处。
在这篇文章和给出的链接中,相关平台是节点,但是任何平台上的问题都是相同的。您不应将IV视为您赠送给用户的模板参数。使其随机。正如我所说,链接中的好处是在链接中解释的。