#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/err.h>
int main() {
FILE *fp;
char buffer[1024];
size_t bytesRead;
EVP_MD_CTX *mdctx = NULL;
unsigned char md_value[32];
int ret;
// 初始化 OpenSSL 错误处理
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
// 打开文件
fp = fopen("sn.txt", "rb");
if (!fp) {
perror("Error opening file");
return EXIT_FAILURE;
}
// 创建一个用于计算 SM3 哈希的上下文
mdctx = EVP_MD_CTX_new();
if (!mdctx) {
perror("Error creating EVP_MD_CTX");
return EXIT_FAILURE;
}
// 初始化 SM3 哈希计算
if (1 != EVP_DigestInit_ex(mdctx, EVP_sm3(), NULL)) {
perror("Error initializing SM3");
return EXIT_FAILURE;
}
// 读取文件并更新哈希计算
while ((bytesRead = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
if (1 != EVP_DigestUpdate(mdctx, buffer, bytesRead)) {
perror("Error updating SM3");
return EXIT_FAILURE;
}
}
// 最终计算哈希值
if (1 != EVP_DigestFinal_ex(mdctx, md_value, NULL)) {
perror("Error finalizing SM3");
return EXIT_FAILURE;
}
// 打印哈希值
printf("SM3 hash: ");
for (int i = 0; i < 32; i++) {
printf("%02x", md_value[i]);
}
printf("\n");
// 清理
EVP_MD_CTX_free(mdctx);
fclose(fp);
return EXIT_SUCCESS;
}
要编译这段代码
gcc -o sm3_hash sm3_hash.c -lcrypto -lssl
然后运行编译出的程序:
./sm3_hash
输出文件 sn.txt
的 SM3 哈希值。