OpenSSL测试-SM3
0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 1. 使用OpenSSL的命令计算你的8位学号(数字)的摘要值(SM3),提交截图(5') 2. 使用OpenSSL编程对计算"你的8位学号(数字)"SM3摘要值,提交代码和运行结果截图。(10’) 3. 使用OpenSSL编程对计算内容为"所有同学的8位学号(文本)"的文件的SM3摘要值,提交代码和运行结果截图。(选做(10’))
1.echo -n "20211106" | openssl dgst -sm3

2.vi sm3_digest.c
#include <stdio.h>
#include <string.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, i;
OpenSSL_add_all_digests();
md = EVP_sm3();
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, "20211106", 7);
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
printf("SM3 Digest: ");
for (i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("\n");
return 0;
}

3.echo -n "20211101~20211129" > file.txt
vi sm3_file_digest.c
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
int main() {
OpenSSL_add_all_digests();
const EVP_MD *md = EVP_sm3();
if (!md) {
printf("SM3 digest is not available.\n");
exit(1);
}
FILE *f = fopen("file.txt", "rb");
if (!f) {
perror("Failed to open file");
exit(1);
}
EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
EVP_DigestInit_ex(mdctx, md, NULL);
unsigned char buffer[1024];
size_t bytes;
while ((bytes = fread(buffer, 1, sizeof(buffer), f)) > 0) {
EVP_DigestUpdate(mdctx, buffer, bytes);
}
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
fclose(f);
printf("SM3 Digest: ");
for (i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
return 0;
}
gcc -o sm3_file_digest sm3_file_digest.c -lcrypto
./sm3_file_digest


浙公网安备 33010602011771号