1、简介
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value) 用于确保信息传输完整一致。MD5作为一种常用的摘要算法,其具有以下几个重要的特点
输入任意长度信息,输出长度固定:MD5 可输入任意长度的信息,其输出均为128位(bit)固定长度的二进制数据。
运算速度快:MD5的运算均为32位 与、或、非、位移等位运算,因此其运算速率快,几乎不消耗CPU时间。
不可逆:根据MD5的的散列结果,无法计算出原始数据(查字典除外)。
碰撞性:原始数据与其MD5散列结果并非一一对应,存在多个原始数据的MD5结果相同的可能性。
以下使用STM32内置硬件Hash完成MD5计算,开发板为STM32U5-Nucleo
2、CubeMX设置
![1745033466808510.png ]X%$NY){NI[P7NLX{{}B$9T.png](http://uphotos.eepw.com.cn/1709346044/pics/1745033466808510.png)
创建待加密数据
/* USER CODE BEGIN PV */
#include "string.h"
#define INPUT_TAB_SIZE ((uint32_t) 4)
__ALIGN_BEGIN const uint8_t aInput[INPUT_TAB_SIZE] __ALIGN_END={0x54,0x68,0x65,0x20} ;//待加密数据
__ALIGN_BEGIN static uint8_t aMD5Digest[16] __ALIGN_END;//存储MD5加密结果,大小为16字节
__ALIGN_BEGIN static uint8_t aExpectMD5Digest[16] __ALIGN_END = {0xF3,0xF1,0x26,0xDA,0xE6,0x39,0x29,0x0B,0x17,0x96,0x1E,0x93,0xB3,0x57,0x14,0x3D};
/* USER CODE END PV */调用STM32MD5库函数,执行MD5计算
/* USER CODE BEGIN 2 */
//HAL_GPIO_WritePin(LED31_GPIO_Port, LED31_Pin,GPIO_PIN_SET);
if (HAL_HASH_MD5_Start(&hhash, (uint8_t *)aInput, INPUT_TAB_SIZE, aMD5Digest, HAL_MAX_DELAY) != HAL_OK)
{
Error_Handler();
}
printf("cal data:\n");
for(uint8_t i=0;i<INPUT_TAB_SIZE;i++){
printf("%02x ",aInput[i]);
}
printf("\ncal result:\n");
for(uint8_t i=0;i<sizeof(aMD5Digest);i++){
printf("0x%02X,",aMD5Digest[i]);
}
printf("\n");
if (memcmp(aMD5Digest, aExpectMD5Digest, sizeof(aExpectMD5Digest) / sizeof(aExpectMD5Digest[0])) == 0)
{
printf("Cal MD5 Correct!\n");
}
else
{
printf("Cal MD5 Wrong!\n");
}
/* USER CODE END 2 */3、运行结果

我要赚赏金
