【发布时间】:2021-03-17 13:05:03
【问题描述】:
我正在尝试使用 C 解密文件(但我可以更改为 C++),但我不知道如何正确使用 EVP 库。
我要复制的控制台命令是:
openssl enc -rc2-ecb -d -in myfile.bin -iter 1 -md sha1 -pbkdf2 -pass pass:'Yumi'
我使用 EVP 的实际 C 代码是:
unsigned char salt[8] = "Salted__";
ctx=EVP_CIPHER_CTX_new();
PKCS5_PBKDF2_HMAC_SHA1("Yumi", -1,
salt, 8, 1,
EVP_MAX_KEY_LENGTH, key);
EVP_DecryptInit(ctx, EVP_rc2_ecb(), key, iv);
pt = (unsigned char *)malloc(sz + EVP_CIPHER_CTX_block_size(ctx) + 1);
EVP_DecryptUpdate(ctx, pt, &ptlen, ciphertext, sz);
if (!EVP_DecryptFinal(ctx,&pt[ptlen],&tmplen)) {
printf("Error decrypting on padding \n");
} else {
printf("Succesful decryption\n");
}
我想这不起作用,因为我必须声明一些东西来使用 SHA1 而不是 SHA256(rc2-ecb 上的默认值),但我不知道该怎么做。
任何帮助将不胜感激
【问题讨论】:
-
openssl 不是基于那个库吗?您可以简单地查看源代码。
-
在两种代码中都使用了不同的算法(RC2/
-rc2-ecbvs. Blowfish/EVP_bf_ecb())。在 OpenSSL 语句中,密钥是使用 PBKDF2/HMAC/SHA1 派生的。在 C/C++ 代码中似乎没有密钥派生。 OpenSSL 为此提供了PKCS5_PBKDF2_HMAC或PKCS5_PBKDF2_HMAC_SHA1。您应该首先仔细查看openssl enc 文档。 -
通常在密文前面有一个 8 字节的标头,后跟一个 8 字节的盐(虽然我不确定 PBKDF2 是否使用相同的盐大小)。我完全错过了您的代码中的盐处理。
-
谢谢大家。我检查了你提到的事实并做了一些改进,但仍然没有工作。
标签: c++ c encryption openssl evp-cipher