1、算法公开,不需要密钥。
2、有数据压缩功能,能将任意长度的输入转换成一个固定长度的输出。
3、容易计算。
安全HASH是一种迭代结构的HASH函数,包括SHA-1在内的大多数HASH函数都采用同一种结构。
SHA-1的处理可分为以下几个步骤:
1、添加填充位。在消息的最后添加适当的填充位使得数据位满足长度=448mod512。(不懂什么是mod?补补数论基础吧)
2、添加长度。在修改过的消息后面添加一个64位块,用于表示原始消息长度。
(以上为消息预处理,在硬件加密中我们不需要考虑,因为这些都是软件部分完成的,而硬件部分需要处理的只是消息预处理后生成的512位数据块。这里长度小于2^64的消息被分割成N个512位的数据块,最后一个数据块的末尾需要做长度填充,也就是一个64位块(对应2^64位的消息))
3、初始化消息摘要的缓冲区。也就是初始化寄存器。用来保存计算的中间值。(这里会用到5个32位的寄存器(刚好对应160位的输出))寄存器的初始值的常数。
4、以512位数据块为单位处理消息。这里就是核心部分了,一共80次迭代。(其实做硬件加密也就主要考虑这一部分就好,对512位的数据块进行处理)(这里计算的中间值和最终值都保存在上面提到的5个寄存器中)
5、输出。输出160为消息摘要。如果有多个数据块则最后要做加法。
详细的讲讲消息处理部分。(主要为个人意见,并且是初步意见,之后肯定会有变化)
一、对Wt的生成可以单独做一个模块,因为它的计算比较麻烦,主要是针对不同的循环次数,对应的值不一样,而且寄存器多(如果你想把所有Wt都记下来)。可以使用16个寄存器,以其中一个为固定输出,然后每次计算做移位,节省了寄存器。
For t=0 to 15
Wt=Dt
For t=16 to 79
Wt=ROTL1(Wt-3^Wt-8^Wt-14^Wt-16)
二、ft也可以做一个模块。
0<=t<=19 ft=(B&C)^(~B^D)
20<=t<=39 ft=(B^C^D)
40<=t<=59 ft=(B&C)^(C&D)^(B^D)
60<=t<=79 ft=(B^C^D)
三、Kt的生成就是一个四选一的选择器。
0<=t<=19 Kt=5a827999
20<=t<=39 Kt=6ed9eba1
40<=t<=59 Kt=8f1bbcdc
60<=t<=79 Kt=ca62c1d6
四、循环迭代部分其实用到的是一样的算法。
For t=0 to 79
A=ROTL5(A)+ft(B,C,D)+E+Kt+Wt
B=A
C=ROTL30(B)
D=C
E=D
五、时序很重要,因为你每次处理的是32位数据。别忘了为每次迭代定义一个计数器记录当前的计算步数。
大概的过程是:先初始化缓冲区,这里不涉及输入数据,初始化的都是些常数。512位的数据输入进来,通过Wt生成模块被划分为16个32位的数据块,分别带到迭代中进行计算,也作为16步之后的数据来源。通过5个寄存器(ABCDE)与常数Kt、动态数据Wt以及函数ft相互作用、移位生成160位的消息摘要输出。
No comments:
Post a Comment