1、简介
Hash函数也称哈希函数/散列函数、杂凑函数,是一个从消息空间到像空间的不可逆映射,可将“任意”长度的输入经过变换以后得到固定长度的输出。它是一种单向密码体制,即只有加密过程,不存在解密过程。Hash函数的单向性和输出长度固定的特征使其可生成消息的“数字指纹”(Digital Fingerprint),也称消息摘要(MD,Message Digest)或哈希值/散列值(Hash Value),主要应用于消息认证、数字签名、口令的安全传输与存储、文件完整性校验等方面。以下使用STM32内置硬件Hash完成SHA1计算,开发板为STM32U5-Nucleo
2、cubemx设置
3、程序设计
创建待加密数据
#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 aSHA1Digest[20] __ALIGN_END;//存储SHA1加密结果 __ALIGN_BEGIN static uint8_t aExpectSHA1Digest[20] __ALIGN_END = {0x2F,0xF3,0x9B,0x41,0x6D,0xB7,0x03,0x8D,0x6F,0xA0,0xB0,0xB9,0x09,0xBB,0xE1,0x62,0x8E,0x89,0x8E,0x19};
执行SHA1计算
/* USER CODE BEGIN 2 */ if (HAL_HASH_SHA1_Start(&hhash, (uint8_t *)aInput, INPUT_TAB_SIZE, aSHA1Digest, 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(aSHA1Digest);i++){ printf("0x%02X ",aSHA1Digest[i]); } printf("\n"); if (memcmp(aSHA1Digest, aExpectSHA1Digest, sizeof(aExpectSHA1Digest) / sizeof(aExpectSHA1Digest[0])) == 0) { printf("Cal SHA1 Correct!\n"); } else { printf("Cal SHA1 Wrong!\n"); }
4、运行结果