Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629301
  • 博文数量: 194
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 884
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-21 16:48
文章分类

全部博文(194)

文章存档

2023年(1)

2022年(3)

2021年(16)

2020年(4)

2019年(5)

2018年(10)

2017年(72)

2016年(36)

2015年(47)

我的朋友

分类: 嵌入式

2017-08-10 14:28:21

SHA-256 输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 

的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: 


STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度=448 mod 512), 
填充的比特数范围是1 到512,填充比特串的最高位为1,其余位为0。
就是先在报文后面加一个 1,再加很多个0,直到长度 满足 mod 512=448.
为什么是448,因为448+64=512. 第二步会加上一个 64bit的 原始报文的 长度信息。


STEP2:附加长度值。将用64-bit 表示的初始报文(填充前)的位长度附加在步骤1 的结果 
后(低位字节优先)。


STEP3:初始化缓存。使用一个256-bit 的缓存来存放该散列函数的中间及最终结果。 
该缓存表示为A=0x6A09E667 , B=0xBB67AE85 , C=0x3C6EF372 , D=0xA54FF53A, 
E=0x510E527F , F=0x9B05688C , G=0x1F83D9AB , H=0x5BE0CD19 。


STEP4:处理512-bit(16 个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 
步迭代运算组成。每步都以256-bit 缓存值ABCDEFGH 为输入,然后更新缓存内容。 
每步使用一个32-bit 常数值Kt 和一个32-bit Wt。 

常数K为

六种基本函数如下:

就像上图一样,参与运算的都是 32 bit的数,Wt 是 分组之后的报文,512 bit=32bit*16. 也就是 Wt t=1,2..16 由 该组报文产生。
Wt t=17,18,..,64 由 前面的Wt按递推公式 计算出来。Wt递推公式为:


Kt t=1,2..64 是已知的常数。


上面的计算就是不断更新 a,b,c…h这 32bit*8 。在每个512bit的分组里面迭代计算64次。


STEP5:所有的512-bit分组处理完毕后,对于SHA-256算法最后一个分组产生的输出便是256-bit的报文摘要。


实现代码:
newsha256.rar

直接调用
SHA256Init;
SHA256Update;
SHA256Final;
这三个函数即可。
阅读(521) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~