HMAC_MD5
1、实验要求:
编写基于md5和sha1的HMAC程序。要求Md5和sha1算法的源码使用实验系统中提供的代码。程序的功能是给定密钥计算任意长度的文件的HMAC值,验证一个文件的HMAC值是否是一个给定值。程序的使用接口不限,HMAC的计算和验证功能在一个单独的程序中实现,实验每个人独立完成,实验报告附主要源码。
2、实验原理:
HMAC(K,m)
K为密钥,m为要计算摘要的消息
opad外部填充,ipad内部填充,H()为哈希函数MD5或sha1
HMAC(K,m)为对消息m用密钥K产生的摘要
上图是sha1的示意图,对于HMAC_MD5,key
3、主要的实验源码
//md5.h程序
void md5_digest( void const *strContent, unsigned int iLength, unsigned char output[16] );
//md5.c程序
#include <stdio.h>
#include <string.h>
#include "md5.h"
//! 定义MD5状态数据结构类型
typedef struct{
unsigned long int state[4]; // 初始链接变量;保存16字节摘要
unsigned long int count[2]; // 明文位数
unsigned char PADDING[64]; // 填充位,最大64*8位
unsigned char buffer[64]; // 输入缓冲
}MD5_State;
//! MD5转换常量
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
//! F, G, H and I 基本MD5函数
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
//! 将x循环左移n位
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
//! 4轮运算中FF(第1轮), GG(第2轮), HH(第3轮), and II(第4轮)转换
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (unsigned long int)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (unsigned long int)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (unsigned long int)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (unsigned long int)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
// 名称:MD5_memcpy
// 功能:输入输出字节拷贝