如何通过AES-256-CBC使用密码而不是密钥和iv在openssl库中加密文件?

时间:2017-09-25 14:07:15

标签: c++ openssl

我需要通过AES-256-CBC加密文件,但使用文字密码而不是密钥和iv。我认为,没有办法做到这一点所以我必须将我的文本密码转换为字节数组,以某种方式将其扩展到密钥长度并将其视为密钥,然后......我不知道是什么与初始化向量有关。所以问题是如何正确地做到这一点?

P.S。请注意,我不需要使用命令行openssl,而是使用库。

2 个答案:

答案 0 :(得分:1)

维克多,你的方向正确。在这种情况下,密码只是您可以散列并获取将用于使用AES加密的密钥。 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);

答案 1 :(得分:0)

如果您要做的只是转换文本密码以用于新的createCipher createDecipher API(添加" iv"),那么转换信息就很清楚了(请参阅Wagner的答案)另一个回应)。

但是,原因这些API被弃用对于理解为什么要以不同方式使用它们至关重要。出于这个原因,我建议使用最新的Node API阅读类似这篇关于加密的强文章。简短的文章,但非常清晰而安全的方法。

http://vancelucas.com/blog/stronger-encryption-and-decryption-in-node-js/

我之所以这样说是因为在不了解变更原因的情况下从一个API移动到另一个API看起来很容易,从而失去了预期变更的好处。

在这篇文章和给出的链接中,有问题的平台是Node,但问题在任何平台上都是一样的。您不应将IV视为您提供给用户的模板参数。让它随机。正如我所说,链接中解释了这一点的好处。