首页
学习
活动
专区
圈层
工具
发布

EVP_get_cipherbyname始终返回null

EVP_get_cipherbyname 返回 null 问题分析

基础概念

EVP_get_cipherbyname 是 OpenSSL 库中的一个函数,用于通过名称获取加密算法(cipher)的 EVP_CIPHER 结构指针。这个函数在加密操作(如对称加密、解密)中非常常用。

可能原因及解决方案

1. 算法名称错误

最常见的原因是传入的算法名称不正确或不支持。

解决方法

  • 检查算法名称拼写是否正确
  • 使用 EVP_CIPHER_do_all_sorted 列出所有支持的算法
代码语言:txt
复制
#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);
}

2. OpenSSL 版本不支持

某些算法只在特定版本的 OpenSSL 中支持。

解决方法

  • 检查 OpenSSL 版本:OpenSSL_version(OPENSSL_VERSION)
  • 查阅对应版本的文档确认算法支持情况

3. 引擎未加载

某些算法需要特定的引擎支持。

解决方法

代码语言:txt
复制
#include <openssl/engine.h>

void load_default_engines() {
    ENGINE_load_builtin_engines();
    ENGINE_register_all_complete();
}

4. FIPS 模式限制

在 FIPS 模式下,某些算法不可用。

解决方法

  • 检查 FIPS 模式状态:FIPS_mode()
  • 如果需要,可以禁用 FIPS 模式(注意安全影响)

5. 库未正确初始化

OpenSSL 需要先初始化。

解决方法

代码语言:txt
复制
#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 通常用于:

  • 配置加密通信协议
  • 实现数据加密/解密功能
  • 开发需要加密功能的应用程序

完整示例代码

代码语言:txt
复制
#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 的安装是否完整,或者尝试更新到最新版本。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券