SM3算法的编程实现
【实验目的】
1、理解Hash函数的计算原理和特点;
2、理解SM3算法原理;
3、了解SM3值的生成过程。
【实验环境】
windows虚拟机
在目录C:\Program Files\Microsoft Visual Studio\MyProjects\SM3 下打开SM3.dsw,在VC6.0环境下编译代码。
【实验预备知识点】
设消息m的长度为l bit,首先将bit"1"添加到消息末尾,再加k个“0”,k是满足l+1+k =448 mod 512的最小非负整数。然后再添加一个64bit串,该串是l的二进制表示,填充后的消息m’长度为512的整数倍。填充过后,再经迭代压缩,最后经过散列运算即可得到结果。
- 主流程图
图 1主流程图
- 程序调用层次图
图 2程序调用关系图.
- 程序调用关系图
图 3程序调用关系图.
【实验内容】
SM3算法是国家密码管理局2010年12月颁布的密码杂凑算法,适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成。SM3算法对于长度小于264位的消息,产生一个256位的消息摘要。算法以512位分组来处理输入的信息,每一分组又被划分为132个32位子分组,经过一系列的处理后,算法的输出由八个32位分组组成,将这些32位分组级联后产生一个256位的散列值。
【实验步骤】
以下是程序的关键代码:
//SM3.C
void sm3_starts( sm3_context *ctx )
{
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x7380166F;
ctx->state[1] = 0x4914B2B9;
ctx->state[2] = 0x172442D7;
ctx->state[3] = 0xDA8A0600;
ctx->state[4] = 0xA96F30BC;
ctx->state[5] = 0x163138AA;
ctx->state[6] = 0xE38DEE4D;
ctx->state[7] = 0xB0FB0E4E;
}
static void sm3_process( sm3_context *ctx, unsigned char data[64] )
{
unsigned long SS1, SS2, TT1, TT2, W[68],W1[64];
unsigned long A, B, C, D, E, F, G, H;
unsigned long T[64];
unsigned long Temp1,Temp2,Temp3,Temp4,Temp5;
int j;
for(j = 0; j < 16; j++)
T[j] = 0x79CC4519;
for(j =16; j < 64; j++)
T[j] = 0x7A879D8A;
GET_ULONG_BE( W[ 0], data, 0 );
GET_ULONG_BE( W[ 1], data, 4 );
GET_ULONG_BE( W[ 2], data, 8 );
GET_ULONG_BE( W[ 3], data, 12 );
GET_ULONG_BE( W[ 4], data, 16 );
GET_ULONG_BE( W[ 5], data, 20 );
GET_ULONG_BE( W[ 6], data, 24 );
GET_ULONG_BE( W[ 7], data, 28 );
GET_ULONG_BE( W[ 8], data, 32 );
GET_ULONG_BE( W[ 9], data, 36 );
GET_ULONG_BE( W[10], data, 40 );
GET_ULONG_BE( W[11], data, 44 );
GET_ULONG_BE( W[12], data, 48 );
GET_ULONG_BE( W[13], data, 52 );
GET_ULONG_BE( W[14], data, 56 )<