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

问题描述:

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

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

+0

既然你不在C中工作,你需要命令帮助... Stack Overflow是编程和开发问题的网站。这个问题似乎是无关紧要的,因为它不是关于编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://*.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。 – jww

+0

@jww你在读什么?我问的是问题中的C++ openssl用法,而不是命令行。 –

+0

*“你在读什么?” - 你对瓦格纳答案的评论。 – jww

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

谢谢你的不满!但事实证明,我也必须知道如何通过命令行openssl(我必须通过cmd进行加密并通过库中的相同密码进行解密)来执行此操作。 'openssl -enc aes-256-cbc -pass'确实是这样吗? –

+1

我已经找到了上面我的小问题的答案。是的,它完全是这样的(根据源代码和'openssl -p'输出,而不是'sha256'消化它使用'EVP_md5'(如果你没有明确指定))。再次感谢你。 –

+0

真棒。我不知道命令行。但我相信有一种方法可以通过命令行确定相同的(和其他组合)。 OpenSSL在其命令行选项中很详细。我只会说:“我不知道,但肯定有一种方法”;-) –

如果你想要做的是转换中使用的文字密码使用新的createCipher createDecipher API(添加了“iv”),那么转换信息就很清楚了(请参阅Wagner在其他响应中的回答)。

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

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

我这样说是因为它可以似乎很容易从一个API移动到另一个不理解为变化的原因,因此,失去预期变化的好处。

在这篇文章和给出的链接中,有问题的平台是Node,但问题在任何平台上都是一样的。你不应该把IV作为你给用户的模板参数。随意制作。正如我所说的,链接解释了这一点的好处。