参考文章
SMx
SM3国家标准文档
sm2,sm3,sm4国密算法的纯c语言版本
SM3密码杂凑算法实现及说明
SM3密码杂凑算法源码解析
代码
sm3.h
#ifndef SM3_H
#define SM3_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void out_hex();
void intToString(unsigned char *out_hash);
int SM3(unsigned char *msg, unsigned int msglen, unsigned char *out_hash);
#endif
sm3.c
- 定义三个全局变量
message_buffer存放消息分组
static unsigned char message_buffer[64] = {
0};
static unsigned int hash[8] = {
0};
static unsigned int T[64] = {
0};
- 常数与函数
初始值IV=7380166f 4914b2b9 1724422d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
void SM3_Init(){
init_T();
hash[0] = 0x7380166f;
hash[1] = 0x4914b2b9;
hash[2] = 0x172442d7;
hash[3] = 0xda8a0600;
hash[4] = 0xa96f30bc;
hash[5] = 0x163138aa;
hash[6] = 0xe38dee4d;
hash[7] = 0xb0fb0e4e;
}
常量
int init_T(){
int i = 0;
for (i = 0; i < 16; i++)
T[i] = 0x79cc4519;
for (i = 16; i < 64; i++)
T[i] = 0x7a879d8a