OpenSSL测试-SM3

OpenSSL测试-SM3
本次作业分值 25 分|
老师 评分
 
任务详情
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

 

posted @ 2024-04-08 09:33  20211106隋吉达  阅读(112)  评论(0)    收藏  举报