通常是因环境配置问题或 OpenSSL 版本不匹配导致的。以下是一些常见的解决方案和检查步骤:
确保你使用的 OpenSSL 版本支持 EVP_MD_CTX_new()
。该函数是在 OpenSSL 1.1.0 中引入的。如果你使用的是旧版本,可能需要升级 OpenSSL。
确保包含了必要的头文件,并且没有遗漏。
#include <openssl/evp.h> // 包含必要的 OpenSSL 头文件
确保在构建脚本中正确链接了 OpenSSL 库。如果你使用的是 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})
如果使用 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)
以下是更新后的示例代码,以确保正确的头文件和函数调用:
#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; }
如果你仍然遇到红色错误提醒,尝试以下调试步骤:
标签: 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。