gpt4 book ai didi

c - 使用 KEY 的 Openssl/libcrypto AES 128 编码

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:46 25 4
gpt4 key购买 nike

我正在使用 AES-128-ECB 加密某个字符串,然后将结果保存在一个文件中,例如 test.enc这是我进行加密的方法:

int do_crypt(char *outfile) {
unsigned char outbuf[1024];
int outlen, tmplen;
unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char intext[] = "Some Text";
EVP_CIPHER_CTX ctx;
FILE *out;
EVP_CIPHER_CTX_init(&ctx);

EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL);
if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) {
/* Error */
return 0;
}
/* Buffer passed to EVP_EncryptFinal() must be after data just
* encrypted to avoid overwriting it.
*/
if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
/* Error */
return 0;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);
/* Need binary mode for fopen because encrypted data is
* binary data. Also cannot use strlen() on it because
* it wont be null terminated and may contain embedded
* nulls.
*/
out = fopen(outfile, "wb");
fwrite(outbuf, 1, outlen, out);
fclose(out);
return 1;

如您所见, key 是实际密码,为了解码加密文件,应执行以下命令行:

openssl aes-128-ecb -in test.enc -K 000102030405060708090A0B0C0D0E0F -d

“000102030405060708090A0B0C0D0E0F”是我在上面的代码 0123456789191112131415 中使用的十六进制密码表示形式。据我所知,密码也可以使用 MD5 算法加密。

问题是如何使用从密码派生的实际 KEY 来加密数据,而不是使用 libcrypto 的密码本身?

最佳答案

看看EVP_BytesToKey .

我在旧应用程序中的评论告诉我 BytesToKey 已过时,您或许应该考虑查看 PKCS5_v2_PBE_keyivgen 或类似的。但本质上,一种高度简化的方法是从您的密码和合适的盐值中导出您的 key 作为哈希值:

EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)

然后您使用新生成的 key 通过以下方式派生您的 IV:

EVP_DigestInit_ex(...)
EVP_DigestUpdate(...Key...)
EVP_DigestUpdate(...Password...)
EVP_DigestUpdate(...Salt...)
EVP_DigestFinal_ex(...)

浏览 OpenSSL 源代码对于查找此类内容非常有用。

免责声明:我不是 C 程序员(有问题的应用程序是使用 OpenSSL DLL 的 Delphi),也不是安全专家,所以请将这些建议作为起点,阅读正确的文档并尽可能使用正确的函数!!.. .

关于c - 使用 KEY 的 Openssl/libcrypto AES 128 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com