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设置
创建待加密数据
/* 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、运行结果