专栏首页Pou光明国密算法SM3与SM4简介与应用

国密算法SM3与SM4简介与应用

一、国密SM3与SM4

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用公开的SM2、SM3、SM4三类算法,分别是非对称算法、哈希算法和对称算法。不懂也没关系,以后别人说SM2、SM3、SM4知道它们是干啥的就行。这次主要和大家从简单的SM3、SM4说起。

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

里面的一些术语不知道也没关系,以后会再梳理的......

二、信息摘要(SM3)一些特性

消息摘要或者哈希函数以任意消息(任意内容或者任何长度)作为输入,然后产生一个固定长度大小的哈希值作为结果输出。具体来说,该函数具有以下特性:

· 对于任意给定的消息,生成哈希值很简单

· 从任意给定的哈希值去计算出一条消息是不可行的(即函数是单向的)

· 修改消息而不修改哈希值是不可行的

· 找到两条具有相同哈希值的消息是不可行的

三、开源程序使用举例

测试文件结构如图:

测试源码:

#include <SM3.h>#include <stdio.h>#include <stdlib.h>#include <string.h>
# define EVP_MAX_MD_SIZE                 32#define ALLOC_OBJ(type, size) (type *)calloc(1, (sizeof(type)*size))
int main(){        unsigned char msgbuf[] = "abc";        unsigned char msgbuf1[] = "abc";  unsigned char dgst[EVP_MAX_MD_SIZE];  unsigned int dgstlen = (unsigned int)sizeof(dgst);
  SM3_state *ctx = ALLOC_OBJ(SM3_state, 1);  SM3_Init(ctx);  SM3_Update(ctx, msgbuf, sizeof(msgbuf)-1);  SM3_Final(dgst, dgstlen, ctx, sizeof(msgbuf)-1);
   printf("Digest1 is: ");   for (int i = 0; i < dgstlen; i++)          printf("%02x", dgst[i]);   printf("\n");
        // second use   SM3_Hash(msgbuf1 , sizeof(msgbuf1)-1, dgst, dgstlen);   printf("Digest2 is: ");   for (int i = 0; i < dgstlen; i++)     printf("%02x", dgst[i]);   printf("\n");

   free(ctx);  return 0;}

测试效果:

SM4简单举例:

int main(){    unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};    unsigned char iv[] = {1,2,3,4,5,6,7,8};    unsigned char plain_text[] = "hello world!";    unsigned char out_plain_text[sizeof(plain_text)];    unsigned char cipher_text[16];
    SM4_EncCBC(key, iv, plain_text, cipher_text, sizeof(plain_text)-1);
    SM4_DecCBC(key, iv, cipher_text, out_plain_text, sizeof(plain_text)-1);    printf("%s\n",cipher_text);

    printf("%s\n",out_plain_text);
  return 0;}

四、小结与资源链接

①国密C语言实现的git链接:

https://github.com/JulongChain/julongchain-csp-sdt

②相关术语链接:

http://gmssl.org/docs/evp-api.html

③纯初学入门,为了快速应用。最开始用的GmSSL,这个文档相对全一些,对初学者会友好一些,但是还是需要一点儿密码学的基础,我是两个结合一起看的。

本文分享自微信公众号 - Pou光明(pou0230),作者:PouG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pymodbus使用介绍

    当我们写程序写的多一些时,自然就会使用第三方库,在使用过程中注意规避掉一些坑即可。

    用户5908113
  • Linux下Qt程序打包发布并设置图标

    之前整理过一篇文章是关于Windows下Qt打包发布与设置环境变量的,那篇文章里面Qt发布的程序是没有设置应用程序图标的,之后会再整理一篇文章的,顺便测试下使用...

    用户5908113
  • 借助qt creator创建属于自己的共享库

    在 Windows 上,共享库由 .dll 表示;在 Linux 上,由 .so 表示。

    用户5908113
  • Hanlp自然语言处理工具的使用演练

    Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。Hanlp具备功能完善、性能高效、架构清洗、语料时新、可自定义的特点;提供...

    IT小白龙
  • 一年去雾算法研究的总结。

      从最开始的Crimm Imageshop中最简单的去雾功能开始,到前不久为止研究的诸多去雾算法,再到近日和一些朋友的关于去雾经验的交流,感觉自己对这个方面的...

    用户1138785
  • 第一章(1.2) 机器学习算法工程师技能树

    两只橙
  • 机器学习的5种“兵法"

    在研究机器学习中,理论在其整个自上而下方法中试用于哪里呢? 在传统的机器学习教学中,丰富的数学理论知识对于理解机器学习是至关重要的,我的机器学习教学方法通常是教...

    CDA数据分析师
  • 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列

        在本篇我们会讨论HMM模型最后一个问题的求解,即即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。在阅读本篇前,建议先阅读这个...

    刘建平Pinard
  • 机器学习的5种“兵法”;

    大数据文摘
  • 运筹学教学 | 十分钟快速掌握最大流算法(附C++代码及算例)

    —“运筹教科书到底能给你啥?” —“算法和实现离教科书有多远?” —“问题解决能力到底从哪来?” 今天刚起床就接到了BOSS的 提·问·三·连 小编表示 收到直...

    用户1621951

扫码关注云+社区

领取腾讯云代金券