今天想用单片机实现SHA256,看了一篇文章https://blog.csdn.net/imba_wolf/article/details/122417540的教程。
开发环境 Arduino IDE
库采用Mbed TLS介绍 https://www.trustedfirmware.org/projects/mbed-tls/
根据同行的移植https://johanneskinzig.de/index.php/files/26/Arduino-mbedtls/9/gettingstartedmbedtlsarduino.7z下载完成后,将src/lib_mbedtls文件夹拷贝到libraries中,并重命名为mbedtls
代码如下
```#include <mbedtls/sha256.h>
void setup() {
Serial.begin(9600);
// 输入数据
unsigned char input[] = "Hello, World!";
size_t inputLength = sizeof(input) - 1; // 不包括字符串结束符 '\0'
// 初始化 SHA256 上下文
mbedtls_sha256_context sha256Context;
mbedtls_sha256_init(&sha256Context);
mbedtls_sha256_starts(&sha256Context, 0);
// 计算哈希值
mbedtls_sha256_update(&sha256Context, input, inputLength);
unsigned char output[32]; // SHA256 输出长度为 32 字节
mbedtls_sha256_finish(&sha256Context, output);
// 打印结果
for (int i = 0; i < 32; i++) {
Serial.print(output[i], HEX);
}
// 清理资源
mbedtls_sha256_free(&sha256Context);
}
void loop() {
// 程序运行结束后不进行任何操作
}
代码缩减
#include <mbedtls/pk.h>
#include <mbedtls/rsa.h>
#include <mbedtls/pem.h>
#include <mbedtls/sha256.h>
#include <mbedtls/ctr_drbg.h>
void setup() {
Serial.begin(115200);
mbedtls_pk_context key;//初始化一个结构体、
const char *data = "hello";//待加密字符串
unsigned char hash[32];//做一个接受结果的变量
mbedtls_sha256(reinterpret_cast<const unsigned char *>(data), strlen(data), hash, 0);//计算
for (size_t i = 0; i <32; i++) {
Serial.print(hash[i], HEX);//输出
}
mbedtls_pk_free(&key);
// 签名完成后的处理...
delay(1000);
}
void loop() {
}
最后输出DFFD6021BB2BD5B0AF676290809EC3A53191DD81C7F7A4B28688A362182986F
与在线验证Hello, World!的SHA256一致