基于STM32的C语言SHA256加密算法

本文详细介绍了如何在STM32单片机上使用C语言实现SHA256加密算法,包括算法原理、消息预处理、摘要计算主循环,并提供了适用于单片机的代码示例和工程文件,旨在帮助单片机开发者理解和应用SHA256加密。
摘要由CSDN通过智能技术生成

标题基于STM32的C语言SHA256加密算法

本文博客链接:https://blog.csdn.net/zsj2016o/article/details/107257830 作者:zsj ,转载请注明.

项目中用到了一个新的加密算法(SHA256),我之前只用过AES的加密算法,SHA256的加密算法没有用过,由于时间紧急,为了弄懂这个加密方式就花了不少积分,下载了不少资源,发现他们都是很浅显的板书,或者一些表述为亲测可用的程序,其实就是TI官网下载的原始资料,连最起码的翻译都没有,在我看来这就是骗积分的行为,对此表示不屑,经过对资料进行整合、测试,将其以博客的形式发表出来,与大家交流,由于本人能力的原因,如果有错误,可以直接留言之处,有不懂得可以叫Q/W交流,非喜勿喷。

下面正式开始,在这里讲的是SHA256,首先将SHA256进行最基础的说明。
1,什么是SHA

一个n位的哈希函数就是一个从任意长的消息到n位哈希值的映射,一个n位的加密哈希函数就是一个单向的、避免碰撞的n位哈希函数。这样的函数是目前在数字签名和密码保护当中极为重要的手段。

当前比较流行的哈希函数主要有128位的MD4和MD5和160位的SHA-1,今天介绍的SHA-2族有着更多位的输出哈希值,破解难度更大,能够提高更高的安全性。

SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布。属于SHA算法之一,是SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。

这些变体除了生成摘要的长度、循环运行的次数等一些细微差异之外,基本结构是一致的。本文主要讲一讲SHA256。

2,SHA256原理

SHA256的压缩函数主要对512位的消息区块和256位的中间哈希值进行操作,本质上,它是一个通过将消息区块为密钥对中间哈希值进行加密的256位加密算法。 因此,为了描述SHA256算法,有以下两方面的组件需要描述:

SHA256压缩函数
SHA256消息处理流程
以下的描述当中所使用到的标记如下:

在这里插入图片描述

常量初始化
初始哈希值[公式]取自自然数中前面8个素数(2,3,5,7,11,13,17,19)的平方根的小数部分, 并且取前面的32位. 下面举个例子: [公式]小数部分约为0.414213562373095048, 而其中

[公式]

于是, 质数2的平方根的小数部分取前32位就对应0x6a09e667.

如此类推, 初始哈希值[公式]由以下8个32位的哈希初值构成:

[公式]

SHA256算法当中还使用到64个常数, 取自自然数中前面64个素数的立方根的小数部分的前32位, 如果用16进制表示, 则相应的常数序列如下:

428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2

消息预处理
在计算消息的哈希摘要之前需要对消息进行预处理:

对消息进行补码处理: 假设消息[公式]的二进制编码长度为[公式]位. 首先在消息末尾补上一位"1", 然后再补上[公式]个"0", 其中[公式]为下列方程的最小非负整数
[公式]

举个例子, 以消息"abc"为例显示补位的过程.

a,b,c对应的ASCII码和二进制编码分别如下:

原始字符 ASCII码 二进制编码
a 97 01100001
b 98 01100010
c 99 01100011
因此, 原始信息"abc"的二进制编码为:01100001 01100010 01100011, 第一步补位, 首先在消息末尾补上一位"1", 结果为: 01100001 01100010 01100011 1; 然后进行第二步的补位, 因为[公式], 可以得到[公式], 在第一步补位后的消息后面再补423个"0", 结果如下:

[公式]

最后还需要在上述字节串后面继续进行补码, 这个时候补的是原消息"abc"的二进制长度[公式]的64位二进制表示形式, 补完以后的结果如下:

[公式]

最终补完以后的消息二进制位数长度是512的倍数.

这里需要注意的两点是不管原来的消息长度是多少, 即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512位. 另外, 考虑到最后要将消息长度[公式]转换为64位二进制编码, 因此, 长度的必须小于[公式], 绝大多数情况, 这个足够大了.

将补码处理后的消息以512位为单位分块为: [公式], 其中第[公式]个消息块的前32位表示为: [公式], 后面32位为: [公式], 以此类推, 最后32位的消息块可表示为: [公式]. 我们采用Big endian约定对数据进行编码, 即认为第一个字节是最高位字节, 因此, 对于每一个32位字节, 最最左边的比特是最大的比特位.
摘要计算主循环
哈希计算算法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我不知道我这个解释,大家能否明白,我在写博客的时候发现,有的博主写的确实好,如果大家看完我的还不是很清楚,可以参考一下,下面这篇 《SHA256算法原理详解》 作者:随煜而安 链接为:https://blog.csdn.net/u011583927/article/details/80905740#Big_endian_return

写到这里大家可能会问,既然人写的比你好,那你干嘛还来献丑…… ̄□ ̄||

当然啦,人确实写的比我好,我承认,但是我这篇文章也是有必要的,我看了绝绝大部分关于SHA256的文章,它所显示的代码都不是单片机能使用的,作为一个单片机党,感觉很苦恼,所以附一版单片机可以用的SHA256的程序说明,如下:
我也分三个部分进行说明:常量的初始化、中间过程、结果

首先是初始化,废话不多说直接上代码:

void sha256_init(SHA256_CTX *ctx)
{
   
	ctx->datalen = 0;
	ctx->bitlen = 0;
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值