- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
密码编码学与网络安全试验报告题目试验十一SHA512算法姓名
《密码编码学与网络安全》实验报告 题目:实验十一 SHA512算法 姓名 戴光昱 052433 信息安全 实验环境:Windows XP Sp2
硬件环境:CPU:Intel Core 2 Duo T7100 硬盘:120G 内存:2G 实验要求:
应用SHA512算法编写一个程序。要求此程序能够进行正常的信息摘要。要求按照书中提供的算法进行模拟。 实验原理:
SHA512逻辑原理如下:
算法的输入时最大长度小于2128比特的消息串,输出是512比特的消息摘要,输入消息以1024比特的分组为单位进行处理。此过程包含以下步骤:
步骤一:附加填充位。填充消息使其长度模1024与896同余,即使消息已经满足上述长度要求,仍然需要进行填充,因此填充位数在1到1024之间。即填充由一个1和后续的0组成。
步骤二:附加长度。在消息后附加一个128比特的块,将其看作是128比特的无符号整数(最高有效字节在前),它包含填充前消息的长度。
前两步是产生一个长度为1024整数倍的消息。
步骤三:初始化散列缓冲区。散列函数的中间结果和最终结果保存于512比特的缓冲区中,缓冲区用8个64比特的寄存器(a,b,c,d,e,f,g,h)表示,并将这些寄存器初始化为下列64比特的整数(十六进制值):
a=6A09E667F3BCC908 e=510E527FADE682D1
b=BB67AE8584CAA73B f=9B05688C2B3E6C1F
c=3C6EF372FE94F82B g=1F83D9ABFB41BD6B
d=A54FF53A5F1D36F1 h=5BE0CD19137E2179
步骤四:以1024比特的分组(16个字)为单位处理消息。算法的核心是具有80轮运算的模块。
每一轮都把512比特缓冲区的值abcdefgh作为输入,并更新缓冲区的值。第一轮,缓冲区里的值是中间的散列值Hi-1。每一轮,如t,使用一个64比特的值Wi,该值由当前被处理的1024比特消息分组Mi导出,导出算法是下面将要讨论的消息调度算法。每一轮还将使用附加的常数Kt,其中0≤t≤79,用来表示轮数。这些常数如下获得:前80个素数取三次根,取小数部分的前64比特。这些常数提供了64比特随机串集合,可以消除输入数据里的任何规则性。
第80轮的输出和第一轮的输入Hi-1相加产生Hi。缓冲区里的8个字和Hi-1里的相应字独立进行模264的加法运算。
步骤五:输出。所有的N个1024比特分组都处理完以后,从第N阶段输出的是512比特的消息摘要。
总结SHA-512的运算如下:
H0=IV
Hi=SUM64(Hi-1,abcdefghi)
MD=HN
IV:第三步里定义的abcdefgh缓冲区的初始值。
abcdefghi:第i个消息分组处理的最后一轮的输出。
N:消息(包括填充和长度域)里的分组数。
SUM64:对输入对里的每个字进行独立的模264加。
MD:最后的消息摘要值。
实验内容及过程:
1.数据结构定义部分:
K:64位型一维数组,静态,用于存储80轮当中的附加常数K值,unit64为宏定义,实质为longlong型,64位。
S:64位型一维数组,静态,用于存储每一轮的缓冲区。
W:64位型一维数组,静态,用于存储80轮当中的由Mi导出的值,用于每一轮的混淆运算。
2.基本函数用途说明:
sha_compress:用于将读入文件分压缩成1024位大小的分组单位。另外进行了W和S数组的初始化。
sha_init512:用于缓冲区的初始化。
sha_process512:用于SHA512的每一轮W数值的置数。
sha_done512:用于SHA-512 hash码的输出。
sha_file:sha512读入文件,进行散列值输出。
3.主要的算法思想:
1.1024bit分组,S缓冲区初始化,W[80]置数。
static void sha_compress(sha_state512 *md)
{
UINT64 S [8], W [80], t0, t1;
int i;
/* 将缓冲区复制入S数组 */
memcpy (S, md-state, 64);
/* 初始化W0-15*/
for (i = 0; i 128; i+=8)
W [i3] =
((UINT64)md-buf [i + 0]) 56 |
((UINT64)md-buf [i + 1]) 48 |
((UINT64)md-buf [i +
文档评论(0)