如何通过AES-256-CBC使用密码代替密钥和IV加密文件



我需要通过 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视为您赠送给用户的模板参数。使其随机。正如我所说,链接中的好处是在链接中解释的。

最新更新