EVP MD

本文提供了一个使用OpenSSL库进行SHA1哈希计算的简单示例代码。该示例展示了如何初始化上下文、更新数据并最终获取到SHA1摘要。

Easy, nothing more to say.

Sample code:

    const EVP_MD *md = EVP_sha1();

    EVP_MD_CTX ctx;

    unsigned char md_buf[EVP_MAX_MD_SIZE];

    unsigned int mdLen = 0;

 

    EVP_MD_CTX_init(&ctx);

 

    if (!EVP_DigestInit_ex(&ctx,md, NULL))

       return 0;

    EVP_DigestUpdate(&ctx,data,datal);

    EVP_DigestFinal_ex(&ctx,&(md_buf[0]),&mds);

 

    EVP_MD_CTX_cleanup(&ctx);

int verify_signature(const char *pubkey_path, const unsigned char *data, int data_len, const unsigned char *sig, int sig_len) { FILE *fp = NULL; EVP_PKEY *pkey = NULL; EVP_MD_CTX *md_ctx = NULL; unsigned char hash[SHA256_DIGEST_LENGTH]; int ret = 0; // 1. 打开公钥文件 fp = fopen(pubkey_path, "r"); if (!fp) { fprintf(stderr, "Error: Cannot open public key file '%s'\n", pubkey_path); goto cleanup; } // 2. 使用 PEM_read_PUBKEY 读取通用公钥(支持 RSA/EC 等) pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL); fclose(fp); fp = NULL; if (!pkey) { fprintf(stderr, "Error: Failed to read public key from '%s'\n", pubkey_path); goto cleanup; } // 3. 检查是否为 EC 类型密钥 if (EVP_PKEY_id(pkey) != EVP_PKEY_EC) { fprintf(stderr, "Error: Public key is not an EC key\n"); goto cleanup; } // 4. 计算 SHA-256 哈希 if (!SHA256(data, data_len, hash)) { fprintf(stderr, "Error: SHA256 digest failed\n"); goto cleanup; } // 5. 创建并初始化 EVP MD 上下文 md_ctx = EVP_MD_CTX_new(); if (!md_ctx) { fprintf(stderr, "Error: EVP_MD_CTX_new failed\n"); goto cleanup; } // 6. 初始化验证:指定摘要算法和公钥 if (EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey) <= 0) { fprintf(stderr, "Error: EVP_DigestVerifyInit failed\n"); goto cleanup; } // 7. 提供待验证的数据(原始数据或哈希均可,这里传原始数据) if (EVP_DigestVerifyUpdate(md_ctx, data, data_len) <= 0) { fprintf(stderr, "Error: EVP_DigestVerifyUpdate failed\n"); goto cleanup; } cleanup: if (md_ctx) EVP_MD_CTX_free(md_ctx); if (pkey) EVP_PKEY_free(pkey); if (fp) fclose(fp); return 1; // 成功返回 1,否则返回 0cleanup: }此函数用什么条件判断是否成功
最新发布
10-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值