第二题
#include <stdio.h>
#include <openssl/evp.h>
int main() {
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len;
int i;
// 初始化 OpenSSL
OpenSSL_add_all_algorithms();
// 创建一个 SM3 摘要对象
md = EVP_sm3();
// 创建摘要上下文
mdctx = EVP_MD_CTX_new();
// 初始化摘要上下文
EVP_DigestInit_ex(mdctx, md, NULL);
// 更新摘要上下文以包含待计算的数据
EVP_DigestUpdate(mdctx, "20211301", 8);
// 计算摘要值
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
// 打印摘要值
printf("SM3 Digest value: ");
for (i = 0; i < md_len; i++) {
printf("%02x", md_value[i]);
}
printf("\n");
// 释放摘要上下文
EVP_MD_CTX_free(mdctx);
return 0;
}
第三题
#include <stdio.h>
#include <openssl/evp.h>
#define BUFFER_SIZE 1024
int main() {
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len;
int i;
// 初始化 OpenSSL
OpenSSL_add_all_algorithms();
// 创建一个 SM3 摘要对象
md = EVP_sm3();
// 创建摘要上下文
mdctx = EVP_MD_CTX_new();
// 初始化摘要上下文
EVP_DigestInit_ex(mdctx, md, NULL);
// 打开文件
FILE *fp = fopen("all.der", "rb");
if (fp == NULL) {
printf("无法打开文件\n");
return 1;
}
// 读取文件并更新摘要上下文
unsigned char buffer[BUFFER_SIZE];
size_t bytes_read;
while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
EVP_DigestUpdate(mdctx, buffer, bytes_read);
}
// 关闭文件
fclose(fp);
// 计算摘要值
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
// 打印摘要值
printf("SM3 Digest value: ");
for (i = 0; i < md_len; i++) {
printf("%02x", md_value[i]);
}
printf("\n");
// 释放摘要上下文
EVP_MD_CTX_free(mdctx);
return 0;
}
标签:md,mdctx,MD,摘要,SM3,OpenSSL,value,测试,EVP
From: https://www.cnblogs.com/pengqiqi/p/18143486