EVP_get_cipherbyname
是 OpenSSL 库中的一个函数,用于通过名称获取加密算法(cipher)的 EVP_CIPHER
结构指针。这个函数在加密操作(如对称加密、解密)中非常常用。
最常见的原因是传入的算法名称不正确或不支持。
解决方法:
EVP_CIPHER_do_all_sorted
列出所有支持的算法#include <openssl/evp.h>
#include <stdio.h>
static void cipher_cb(const EVP_CIPHER *c,
const char *from, const char *to, void *arg) {
printf("Cipher: %s\n", EVP_CIPHER_name(c));
}
void list_ciphers() {
EVP_CIPHER_do_all_sorted(cipher_cb, NULL);
}
某些算法只在特定版本的 OpenSSL 中支持。
解决方法:
OpenSSL_version(OPENSSL_VERSION)
某些算法需要特定的引擎支持。
解决方法:
#include <openssl/engine.h>
void load_default_engines() {
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
}
在 FIPS 模式下,某些算法不可用。
解决方法:
FIPS_mode()
OpenSSL 需要先初始化。
解决方法:
#include <openssl/evp.h>
#include <openssl/err.h>
void init_openssl() {
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
}
以下是部分常见算法名称(具体取决于 OpenSSL 版本):
aes-128-cbc
aes-256-cbc
des-ede3-cbc
rc4
bf-cbc
(Blowfish)EVP_get_cipherbyname
通常用于:
#include <openssl/evp.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>
void handleErrors(void) {
ERR_print_errors_fp(stderr);
abort();
}
int encrypt_with_cipher(const char *cipher_name) {
EVP_CIPHER_CTX *ctx;
unsigned char key[32], iv[16];
unsigned char plaintext[] = "Hello World!";
unsigned char ciphertext[128];
int len, ciphertext_len;
/* 初始化库 */
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
/* 获取加密算法 */
const EVP_CIPHER *cipher = EVP_get_cipherbyname(cipher_name);
if (!cipher) {
printf("Cipher %s not found\n", cipher_name);
return -1;
}
/* 创建上下文 */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
/* 设置key和iv(实际应用中应从安全源获取) */
memset(key, 0x00, sizeof(key));
memset(iv, 0x00, sizeof(iv));
/* 初始化加密操作 */
if(1 != EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
handleErrors();
/* 执行加密 */
if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen((char *)plaintext)))
handleErrors();
ciphertext_len = len;
/* 完成加密 */
if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
handleErrors();
ciphertext_len += len;
/* 清理 */
EVP_CIPHER_CTX_free(ctx);
printf("Encryption successful. Ciphertext length: %d\n", ciphertext_len);
return 0;
}
int main() {
const char *cipher_name = "aes-256-cbc"; // 修改为你要测试的算法名称
int ret = encrypt_with_cipher(cipher_name);
if (ret != 0) {
printf("Failed to find or use cipher: %s\n", cipher_name);
printf("Available ciphers:\n");
EVP_CIPHER_do_all_sorted([](const EVP_CIPHER *c,
const char *from, const char *to, void *arg) {
printf(" %s\n", EVP_CIPHER_name(c));
}, NULL);
}
return ret;
}
如果问题仍然存在,建议检查 OpenSSL 的安装是否完整,或者尝试更新到最新版本。
没有搜到相关的文章