You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac M1环境编译SHA-3加密程序遇OpenSSL头文件缺失问题求助

问题描述

在MacBook Pro M1的iTerm bash环境下开发文本转MD5/SHA-3加密的程序,编译时出现头文件找不到的错误:

  • SHA-3Encrypter.c:4:10: fatal error: 'openssl/evp.h' file not found
  • fatal error: openssl/md5.h file not found

已执行brew install libsolv-dev,但问题仍未解决,程序代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>

void sha3_encrypt(const char *input, unsigned char *output, unsigned int *output_len) {
    EVP_MD_CTX *mdctx;
    const EVP_MD *md = EVP_sha3_256(); // Use SHA3-256, can change to SHA3-224, 384, or 512

    if ((mdctx = EVP_MD_CTX_new()) == NULL) {
        fprintf(stderr, "Error: Failed to create context.\n");
        exit(EXIT_FAILURE);
    }

    if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) {
        fprintf(stderr, "Error: Failed to initialize digest.\n");
        exit(EXIT_FAILURE);
    }

    if (1 != EVP_DigestUpdate(mdctx, input, strlen(input))) {
        fprintf(stderr, "Error: Failed to update digest.\n");
        exit(EXIT_FAILURE);
    }

    if (1 != EVP_DigestFinal_ex(mdctx, output, output_len)) {
        fprintf(stderr, "Error: Failed to finalize digest.\n");
        exit(EXIT_FAILURE);
    }

    EVP_MD_CTX_free(mdctx);
}

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

int main() {
    char input[256];
    unsigned char output[EVP_MAX_MD_SIZE];
    unsigned int output_len;

    printf("Enter text to hash (max 255 characters): ");
    if (fgets(input, sizeof(input), stdin) == NULL) {
        fprintf(stderr, "Error reading input.\n");
        return 1;
    }

    // Remove newline character from input if present
    size_t len = strlen(input);
    if (len > 0 && input[len - 1] == '\n') {
        input[len - 1] = '\0';
    }

    sha3_encrypt(input, output, &output_len);

    printf("SHA-3 (256-bit) hash:\n");
    print_hex(output, output_len);

    return 0;
}
问题根源与解决方法

根源分析

  1. 安装库错误:libsolv-dev是包依赖解析库,和OpenSSL加密库完全无关,不是你需要的依赖。
  2. 路径未配置:M1 Mac上Homebrew安装的OpenSSL头文件和库不在系统默认搜索路径,编译时需手动指定路径。

解决步骤

  1. 安装正确的OpenSSL库
    执行命令安装OpenSSL:

    brew install openssl
    
  2. 获取OpenSSL安装路径
    查看Homebrew安装的OpenSSL位置:

    brew --prefix openssl
    

    M1 Mac下输出通常为/opt/homebrew/opt/openssl@3。

  3. 编译时指定路径与链接库
    使用gcc或clang编译时,通过-I指定头文件目录,-L指定库目录,-l链接OpenSSL的crypto库:

    gcc SHA-3Encrypter.c -o SHA-3Encrypter -I$(brew --prefix openssl)/include -L$(brew --prefix openssl)/lib -lcrypto
    
  4. (可选)配置环境变量简化编译
    若不想每次编译都输入长命令,可将OpenSSL路径加入bash环境变量:

    echo 'export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"' >> ~/.bash_profile
    echo 'export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"' >> ~/.bash_profile
    echo 'export LD_LIBRARY_PATH="$(brew --prefix openssl)/lib:$LD_LIBRARY_PATH"' >> ~/.bash_profile
    source ~/.bash_profile
    

    之后直接编译即可:

    gcc SHA-3Encrypter.c -o SHA-3Encrypter -lcrypto
    
  5. 扩展支持MD5功能
    若需添加MD5加密,可新增md5_encrypt函数(复用EVP接口逻辑):

    void md5_encrypt(const char *input, unsigned char *output, unsigned int *output_len) {
        EVP_MD_CTX *mdctx;
        const EVP_MD *md = EVP_md5();
    
        if ((mdctx = EVP_MD_CTX_new()) == NULL) {
            fprintf(stderr, "Error: Failed to create context.\n");
            exit(EXIT_FAILURE);
        }
    
        if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) {
            fprintf(stderr, "Error: Failed to initialize digest.\n");
            exit(EXIT_FAILURE);
        }
    
        if (1 != EVP_DigestUpdate(mdctx, input, strlen(input))) {
            fprintf(stderr, "Error: Failed to update digest.\n");
            exit(EXIT_FAILURE);
        }
    
        if (1 != EVP_DigestFinal_ex(mdctx, output, output_len)) {
            fprintf(stderr, "Error: Failed to finalize digest.\n");
            exit(EXIT_FAILURE);
        }
    
        EVP_MD_CTX_free(mdctx);
    }
    

    在main函数中调用该函数即可输出MD5哈希值。

内容的提问来源于stack exchange,提问作者Delta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:42:08