SM3杂凑算法是我国自主设计的密码杂凑算法

SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。

在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。

完整源码下载地址:https://download.csdn.net/download/guoggn/18439171

一、 处理过程

1、分组

512bit为一组,

2、填充

不够512bit进行填充,假设消息m 的长度为l 比特。首先将比特“ 1”添加到消息的末尾,再添加k 个“ 0”, k是满
足l + 1 + k ≡ 448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进
制表示。填充后的消息m′ 的比特长度为512的倍数

3、消息扩展

4、迭代压缩

二、c51代码

/* 压缩函数 */
void CF(u8 *arr)
{u32 j;u32 A, B, C, D, E, F, G, H;u32 SS1, SS2, TT1, TT2;#ifdef _DEBUGprintf("message = \n");for (j = 0; j < 64; j++)printf("%b02x", arr[j]);printf("\n\n");
#endif/* 消息扩展 */for (j = 0; j < 16; j++){W[j] = (u32)arr[j * 4 + 0] << 24 | (u32)arr[j * 4 + 1] << 16 | (u32)arr[j * 4 + 2] << 8 | (u32)arr[j * 4 + 3];}for (j = 16; j < 68; j++){W[j] = P_1(W[j - 16] ^ W[j - 9] ^ (rotate_left(W[j - 3], 15))) ^ (rotate_left(W[j - 13], 7)) ^ W[j - 6];}
#ifdef _DEBUGprintf("W[] = \n");for (j = 0; j < 68; j++)printf("%l08x, ", W[j]);printf("\n\n");
#endiffor (j = 0; j < 64; j++){W_1[j] = W[j] ^ W[j + 4];}
#ifdef _DEBUGprintf("W_1[] = \n");for (j = 0; j < 64; j++)printf("%l08x, ", W_1[j]);printf("\n\n");
#endif/* 消息压缩 */A = hash[0];B = hash[1];C = hash[2];D = hash[3];E = hash[4];F = hash[5];G = hash[6];H = hash[7];for (j = 0; j < 64; j++){#ifdef _DEBUGprintf("A_[%l02d]  = %l08x, %l08x, %l08x, %l08x, %l08x, %l08x, %l08x, %l08x \n", j, A,B,C,D,E,F,G,H);#endifSS1 = rotate_left((rotate_left(A, 12)) + E + (rotate_left(T[j], j)), 7);SS2 = SS1 ^ (rotate_left(A, 12));TT1 = FF(A, B, C, j) + D + SS2 + W_1[j];TT2 = GG(E, F, G, j) + H + SS1 + W[j];D = C;C = rotate_left(B, 9);B = A;A = TT1;H = G;G = rotate_left(F, 19);F = E;E = P_0(TT2);}
#ifdef _DEBUGprintf("A_[%l02d]  = %l08x, %l08x, %l08x, %l08x, %l08x, %l08x, %l08x, %l08x \n", j, A,B,C,D,E,F,G,H);
#endifhash[0] = (A ^ hash[0]);hash[1] = (B ^ hash[1]);hash[2] = (C ^ hash[2]);hash[3] = (D ^ hash[3]);hash[4] = (E ^ hash[4]);hash[5] = (F ^ hash[5]);hash[6] = (G ^ hash[6]);hash[7] = (H ^ hash[7]);
}
void SM3(u8 *msg, u32 msglen, u8 *out_hash)
{u32 i, bitLen, remainder;/* 初始化上下文 */SM3_Init();/* 消息分组处理 */for(i = 0; i < msglen/64; i++){memcpy(message_buffer, msg + i * 64, 64);CF(message_buffer);}/* 分组信息部分不够64字节,填充消息,并处理 */bitLen  = msglen * 8;remainder  = msglen % 64;memcpy(message_buffer, msg + i * 64, remainder);memset(&message_buffer[remainder], 0, 64 - remainder);    message_buffer[remainder] = 0x80;/* 信息部分小于55字节,填充部分大于8字节 */if(remainder <= 55){/* 长度按照大端法占8个字节,消息块为64字节,故填充的长度高 4 个字节恒为 0 */memcpy(message_buffer + 60, &bitLen, 4);CF(message_buffer);}/* 信息部分大于55字节,填充部分不够8字节 ,将长度串放入下一分组进行压缩*/else{CF(message_buffer);memset(message_buffer, 0, 64);memcpy(message_buffer + 60, &bitLen, 4);CF(message_buffer);}/* 返回结果 */memcpy(out_hash, hash, 32);#ifdef _DEBUG printf("hash[] = \n");for (i = 0; i < 32; i++)printf("%b02x", out_hash[i]);printf("\n");
#endif
}
void sm3test(void)
{s32 i,len;u8 Hash[32]={0};s8 str[]="abc";//66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0s8 str2[] = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd";//debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732printf("in = \"%s\"\r\n",str);len=strlen(str);SM3(str, len, Hash);  printf("out = ");for (i = 0; i < 32; i++)printf("%b02x", Hash[i]);printf("\n\n");  printf("in = \"%s\"\r\n",str2);len=strlen(str2);SM3(str2, len, Hash);printf("out = ");for (i = 0; i < 32; i++)printf("%b02x", Hash[i]);printf("\n");}

下载全部源码

https://download.csdn.net/download/guoggn/18439171

参考

https://blog.csdn.net/a344288106/article/details/80094878?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

https://blog.csdn.net/weixin_48203710/article/details/106409587

国密SM3的C语言代码C51移植到8051相关推荐

  1. php 国密 签名,关于php国密SM3签名算法

    推荐:<PHP视频教程> php国密SM3签名算法 代码地址 github.com/lizhichao/sm 安装 composer require lizhichao/one-sm 使用 ...

  2. C++安全方向(三):3.7 使用openssl_evp接口完成SHA3和国密SM3

    EVP接口 ·EVP系列函数主要封装了加密,摘要,编码三大类型的算法. ·EVP_MD_CTX摘要上下文 ·EVP_MD_CTX_new() ·EVP_MD_CTX_free() ·EVP_MD 摘要 ...

  3. 实现基于国密SM3的密钥派生(KDF)功能

    实现基于国密SM3的密钥派生(KDF) 前言 KDF 标准 基于SM3的kdf实现 前言 密钥派生函数(KDF):密钥派生函数是指从一个共享的秘密比特串中派生密钥数据,在密钥协商过程中,密钥派生函数作 ...

  4. php 国密,PHP关于国密SM3加密的处理

    这几天对接中国联通物联网IoT Gateway门户API系统,其中用到国密SM3,其提供的token需使用国密SM3对源串进行加密处理,网上搜索也没找到什么函数之类的,只有c和java语言写的,看来要 ...

  5. 国密SM3密码杂凑算法原理及实现(附源码)

    相关文章: 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理及实现(附源码) MD2哈希算法原理及实现(附源码) M ...

  6. Java实现MD5和国密SM3摘要算法

    一.JDK提供的默认MD5算法工具 MD5算法类型枚举 /*** JDK提供的默认摘要算法.** @author linzp* @date 2022/2/8 16:46*/ public enum D ...

  7. 国密SM3加密算法工具类(非对称)

    /*** 国密SM3,消息摘要** @author Luke*/ @Slf4j public class SM3Util {private static char[] chars = {'0', '1 ...

  8. 使用OpenSSL_EVP接口完成SHA3和国密SM3散列生成

    unsigned char data[128] = "测试EVP SHA3 国密SM3";int data_size = strlen((char*)data);//初始化EVP上 ...

  9. 嵌入式设备中支持国密算法的方法(三)——移植Openssl库的步骤说明

    本篇文章是介绍国密算法在嵌入式设备中应用方法系列文章的第三篇,介绍移植openssl库到嵌入式设备中的具体方法,当然最终的目的还是使我们的设备能支持国密算法.同上一篇文章中介绍的miracl密码库相比 ...

最新文章

  1. springboot-mysql-email集成
  2. micropython esp8266+ssd1306(OLED) 显示中文(示例)
  3. Notepad++格式化JSON
  4. android js gps定位,Android中的定位Demo
  5. 2.设计模式-桥接模式
  6. 【EOS】2.3 深入理解ABI文件
  7. Linux双网卡bonding举例
  8. 【200个】电子病历系统(EMR)精华资料汇总【HC3i年终盘点】
  9. 数据库发展的三个阶段及特点
  10. three相机在模型上_threejs学习心得(场景的搭建+运动模型导入)
  11. Python开发【项目】:生产环境下实时统计网站访问日志信息
  12. 1024程序员节?我们整点AI绘图玩玩吧,一文教你配置stable-diffusion
  13. 未来教育的趋势:线上网校和线下教育相结合
  14. 地图下载软件(持续更新)
  15. c语言出现开头结尾多空格,C语言除去字符串开头和末尾空格之trim()函数的实现...
  16. 《Solar Energy》期刊介绍(SCI 2区)
  17. 加密芯片ATSHA204之使用
  18. 爱码物联SaaS一物一码_化妆品二维码防伪溯源系统
  19. 物联网概论(IoT)_Chp7 物联网数据与计算/Google大数据/云计算
  20. centos 怎么退出init 3_CentOS 7.3:LAMP 动静分离部署

热门文章

  1. range python float_自定义支持 float 的 range 函数
  2. 谈谈如何理解“大数据”
  3. 解决pandas TypeError: bad operand type for unary ~: 'float'
  4. 【计算机视觉】图像分割与特征提取——频域增强(低通滤波高通滤波)
  5. 我也要加油了,博客记录生活点滴。
  6. 空气净化器十大名牌,负离子空气净化器十大品牌推荐
  7. html网页制作.css属性,网页设计中的CSS样式
  8. 移动端开发之混合开发模式优劣势综述
  9. 微型客车设计 英文资料翻译
  10. Spring.Net框架学习错误集锦1