HASH熟悉的人可直接叫哈希算法又称散列算法,这种算法是不可逆破解的,设计思想来源于MD4,将任意长度的数据压缩映射成固定长度的数据,此数据概率极低被其他数据所碰撞,HC32F460中的HASH算法仅支持HASH256,算法步骤如下所示:
首先填充消息使其长度恰好为一个比512的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前),使消息长度恰好是512位的整数倍。
其次将A、B、C、D、E、F、G和H共 8个32位变量,用十六进制初始化。然后开始算法的主循环,一次处理512位消息,循环次数是消息中512位分组的数目。
主循环一共进行64次操作,此操作称为压缩函数。每次操作都包含移位、循环移位、逻辑运算、模232加等,运算的过程见下图 32-2。最后的输出由A、B、C、D、E、F、G、H级联而成。其中Wt为由512位消息得到的第t步所用的临时值,Kt为第t步所用的常数值,t(0≤t≤63)是64步循环中的一步。
1.实验目标
本实验使用哈希算法,使用串口助手查看字符串“adcde”的哈希值。
2.实验准备
硬件搭建:ZW-HC32F460-BZ标准版开发板1套
软件搭建:MDK5.22
3.库函数说明
【HASH初始化函数】
函数原型:void HASH_Init(void)
输 入:无;
输 出:无;
功 能:初始化HASH;
举 例:HASH_Init();
【HASH启动函数】
函数原型:en_result_t HASH_Start(const uint8_t *pu8SrcData,
uint32_t u32SrcDataSize,
uint8_t *pu8MsgDigest,
uint32_t u32Timeout)
输 入:
pu8SrcData:指向映射源数据的指针;
SrcDataSize:映射源数据大小;
pu8MsgDigest:指向映射数据的指针;
u32Timeout:超时时间;
输 出:操作成功返回OK;
功 能:启动HASH映射;
举 例:HASH_Start((uint8_t *)m_su8SrcData, strlen(m_su8SrcData),m_au8HashMsgDigest, TIMEOUT_VAL);;
4.主流程图
5.实验过程
【第一步:新建/配置工程】
将工程模板复制到实验目录下,将工程名改为HASH。
勾选FWLibCfg.h配置中的CLK_EN、EFM_EN、GPIO_EN、PWC_EN、SRAM_EN、UTILITY_EN、HASH_EN选项
【第二步:初始化编程】
1)HASH初始化函数
在main.c文件中创建HashConfig()函数。
static void HashConfig(void){/* 1. Enable HASH peripheral clock. */PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_HASH, Enable);/* 2. Initialize HASH. */HASH_Init();}
2)创建映射源数据和映射数据数组
在main.c文件中创建两个数组
static uint8_t m_au8HashMsgDigest[32];const static char *m_su8SrcData = "abcde";
【第三步:获取映射后的数据】
在主循环中,使用HASH_Start()函数获取映射后的数据。
while (1u){/* Use HASH. */HASH_Start((uint8_t *)m_su8SrcData, strlen(m_su8SrcData), \m_au8HashMsgDigest, TIMEOUT_VAL);DDL_Printf("String \"%s\" message digest:\n", m_su8SrcData);for (uint8_t i = 0u; i < sizeof(m_au8HashMsgDigest); i++){DDL_Printf("%.2x ", m_au8HashMsgDigest[i]);}DDL_Printf("\n");/* Main loop cycle is 500ms. */Ddl_Delay1ms(500u);}
【第四步:下载验证】
连接好硬件,编译下载运行该程序,通过查看映射后的数据。