课上测试20191217

  1. 使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图(5’)
  2. 使用OpenSSL编程对计算"你的8位学号"SM3摘要值,提交代码和运行结果截图。(10’)
  3. 使用OpenSSL编程对计算内容为"所有同学的8位学号"的文件的SM3摘要值,提交代码和运行结果截图。(选做(10’))
    在openeuler下实现的:
    1.直接利用openssl命令
    在这里插入图片描述

2.利用openssl编程计算
在这里插入图片描述

可见结果是一样的。
代码:

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
void tDigest()
{
        unsigned char sm3_value[EVP_MAX_MD_SIZE];       //保存输出的摘要值的数组
        int sm3_len, i;
        EVP_MD_CTX *sm3ctx;                                                     //EVP消>息摘要结构体
        sm3ctx = EVP_MD_CTX_new();
        char msg1[] = "20191217";                               //待计算摘要的消息

        EVP_MD_CTX_init(sm3ctx);                                        //初始化摘要结构EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL);     //设置摘要算法和密码算法引擎,这
里密码算法使用MD5,算法引擎使用OpenSSL默认引擎即软算法
        EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1));//调用摘要UpDate计算msg1的摘要
        EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len);//摘要结束,输出摘要值
        EVP_MD_CTX_reset(sm3ctx);                                               //释放内printf("原始数据%s的摘要值为:\n",msg1);
        for(i = 0; i < sm3_len; i++)
        {
printf("0x%02x ", sm3_value[i]);
        }
        printf("\n");
}
int main()
{
        OpenSSL_add_all_algorithms();
        tDigest();
        return 0;
}

3.全部学号放在num.txt
在这里插入图片描述

在这里插入图片描述

可以看到编程实现和直接openssl命令实现结果一样。
代码:

//计算所有同学的八位学号的sm3摘要值
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
void tDigest()
{
        unsigned char sm3_value[EVP_MAX_MD_SIZE];    
        int sm3_len, i;
        EVP_MD_CTX *sm3ctx;                                                     
        sm3ctx = EVP_MD_CTX_new();
        char msg1[10000] = "";                         
        FILE *file;
        char line[32];
        char *ret;
        file = fopen("num.txt", "r");           // 打开文件
        if (!file) {                                            // 判断文件是否打开失败
                printf("文件打开失败!\n");
                return 1;
        }

       

        while (ret = fgets(line, sizeof(line), file)) {     
                strcat(msg1,line);
                
        }

    printf("num.txt中的内容为\n%s\n",msg1);
        fclose(file);

        EVP_MD_CTX_init(sm3ctx);EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL);    
        EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1));

        EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len);
        EVP_MD_CTX_reset(sm3ctx);                                             

        printf("原始文件num.txt的摘要值为:\n");
         for(i = 0; i < sm3_len; i++)
        {
                printf("0x%02x ", sm3_value[i]);
        }
        printf("\n");
}
int main()
{
        OpenSSL_add_all_algorithms();
        tDigest();
        return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值