HMAC_MD5

HMAC_MD5

1、实验要求:

编写基于md5sha1HMAC程序。要求Md5sha1算法的源码使用实验系统中提供的代码。程序的功能是给定密钥计算任意长度的文件的HMAC值,验证一个文件的HMAC值是否是一个给定值。程序的使用接口不限,HMAC的计算和验证功能在一个单独的程序中实现,实验每个人独立完成,实验报告附主要源码。 

 

2、实验原理:

HMAC(K,mH((K  opad)  H((K  ipad)  m)).

K为密钥,m为要计算摘要的消息

opad外部填充,ipad内部填充,H()为哈希函数MD5sha1

HMAC(K,m)为对消息m用密钥K产生的摘要

HMAC_MD5

上图是sha1的示意图,对于HMAC_MD5key 16字节,产生的摘要16字节。

 

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

// 功能:输入输出字节拷贝

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值