C/C++教程

使用 OpenSSL 时调用EVP_MD_CTX_new() 报错并显示为红色什么原因?-icode9专业技术文章分享

本文主要是介绍使用 OpenSSL 时调用EVP_MD_CTX_new() 报错并显示为红色什么原因?-icode9专业技术文章分享,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

通常是因环境配置问题或 OpenSSL 版本不匹配导致的。以下是一些常见的解决方案和检查步骤:

1. 检查 OpenSSL 版本

确保你使用的 OpenSSL 版本支持 EVP_MD_CTX_new()。该函数是在 OpenSSL 1.1.0 中引入的。如果你使用的是旧版本,可能需要升级 OpenSSL。

2. 包含所需的头文件

确保包含了必要的头文件,并且没有遗漏。

#include <openssl/evp.h>  // 包含必要的 OpenSSL 头文件

C

3. 链接正确的库

确保在构建脚本中正确链接了 OpenSSL 库。如果你使用的是 CMakeLists.txt 文件,请确保路径和库名正确。

使用 CMakeLists.txt

例如,在 CMake 中链接 OpenSSL 库:

cmake_minimum_required(VERSION 3.4.1)

add_library(your_module_name SHARED
            main.c)

find_library(log-lib
             log)

find_library(ssl-lib
             NAMES ssl libssl)

find_library(crypto-lib
             NAMES crypto libcrypto)

target_link_libraries(your_module_name
                      ${log-lib}
                      ${ssl-lib}
                      ${crypto-lib})

CMake

使用 Android.mk

如果使用 Android.mk,请确保正确设置库路径:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := your_module_name
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -L/path/to/openssl/lib -lssl -lcrypto

include $(BUILD_SHARED_LIBRARY)

Makefile

4. 示例代码

以下是更新后的示例代码,以确保正确的头文件和函数调用:

#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <string.h>
#include <stdio.h>

void handleErrors(void) {
    printf("An error occurred\n");
    exit(1);
}

void print_bytes(const char *label, const unsigned char *buf, int length) {
    printf("%s: ", label);
    for (int i = 0; i < length; i++) {
        printf("%02x", buf[i]);
    }
    printf("\n");
}

// 加密函数
int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;

    // 创建并初始化上下文
    if (!(ctx = EVP_CIPHER_CTX_new()))
        handleErrors();

    // 初始化加密操作
    if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, key, iv))
        handleErrors();

    // 提供要加密的数据,并获得加密后的输出
    if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
        handleErrors();
    ciphertext_len = len;

    // 完成加密
    if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
        handleErrors();
    ciphertext_len += len;

    // 清理
    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

// 使用 SHA-256 进行哈希运算
void sha256(const char *data, size_t data_len, unsigned char *output) {
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
    EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);
    EVP_DigestUpdate(ctx, data, data_len);
    EVP_DigestFinal_ex(ctx, output, NULL);
    EVP_MD_CTX_free(ctx);
}

int main() {
    // 明文数据
    unsigned char plaintext[] = "Hello, NDK!";
    print_bytes("Plaintext", plaintext, strlen((char *)plaintext));

    // 生成随机密钥
    unsigned char key[32]; // 256 bit key
    if (!RAND_bytes(key, sizeof(key))) {
        handleErrors();
    }
    print_bytes("Key", key, sizeof(key));

    // 初始化向量
    unsigned char iv[16]; // IV should be 16 bytes for AES
    if (!RAND_bytes(iv, sizeof(iv))) {
        handleErrors();
    }
    print_bytes("IV", iv, sizeof(iv));

    // 加密
    unsigned char ciphertext[128];
    int ciphertext_len = encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext);
    print_bytes("Ciphertext", ciphertext, ciphertext_len);

    // 进行 SHA-256 哈希运算
    unsigned char hash_output[SHA256_DIGEST_LENGTH];
    sha256((char *)plaintext, strlen((char *)plaintext), hash_output);
    print_bytes("SHA256", hash_output, SHA256_DIGEST_LENGTH);

    return 0;
}

C

调试提示

如果你仍然遇到红色错误提醒,尝试以下调试步骤:

  1. 确认 OpenSSL 的安装路径和版本。
  2. 确认编译器的 Include 路径和库路径配置正确。
  3. 检查 IDE 中是否有配置错误或缓存问题(重启 IDE,或者清理和重建项目)。

标签: 来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

这篇关于使用 OpenSSL 时调用EVP_MD_CTX_new() 报错并显示为红色什么原因?-icode9专业技术文章分享的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!