实验四 Hash函数MD5

实验四 Hash函数MD5
实验四 Hash函数MD5

实验四Hash函数MD5

一、实验目的

通过实际编程了解MD5算法的过程,加深对Hash函数的认识。

二、实验原理

Hash函数是将任意长的数字串转换成一个较短的定长输出数字串的函数,输出的结果称为Hash值。Hash函数具有如下特点:

(1)快速性:对于任意一个输入值x,由Hash函数)

H,计算Hash

(x

值y,即)

y=是非常容易的。

H

(x

(2)单向性:对于任意一个输出值y,希望反向推出输入值x,使得H

y=,是非常困难的。

(x

)

(3)无碰撞性:包括强无碰撞性和弱无碰撞性,一个好的Hash函数应该满足强无碰撞性,即找到两个不同的数字串x和y,满足

H

x

(y

H=,在计算上是不可能的。

)

)

(

Hash函数可用于数字签名、消息的完整性检验。消息的来源认证检测等。现在常用的Hash算法有MD5、SHA-1等。下面从MD5入手来介绍Hash算法的实现机制。

MD系列单向散列函数是由Ron Rivest设计的,MD5算法对任意长度的输入值处理后产生128位的Hash值。MD5算法的实现步骤如下(见图4-1):在MD5算法中,首先需要对信息进行填充,使其字节长度与448模512同余,即信息的字节长度扩展至448

n,n为一个正整数。填充的方法如下:

512

*+

在信息的后面填充第一位为1,其余各位均为0,直到满足上面的条件时才停止用0对信息的填充。然后,再在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度为*+

=

+n

n,即长度恰好是512的整数倍,这样做的目的是+

512

*

512

448

)1

(

64

为了满足后面处理中对信息长度的要求。

MD5中有A、B、C、D,4个32位被称为链接变量的整数参数,它们的

初始值分别为:

A 0=0x01234567,

B 0=0x89abcdef,

C 0=0xfedcba98,

D 0=0x76543210

当设置好这4个链接变量后,就开始进入算法的4轮循环运算。循环的次数是信息中512位信息分组数目。

首先将上面4个链接变量复制到变量A 、B 、C 、D 中,以备后面进行处理。 然后进入主循环,主循环有4轮,每轮循环都很相似。第一轮进行16次操作,每次操作对A 、B 、C 、D 中的3个做一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组(32位)和一个常数。再将所得结果向左循环移S 位,并加上A 、B 、C 、D 其中之一。最后用该结果取代A 、B 、C 、D 其中 第一轮

第二轮

第四轮

第三轮

明文

512位

A B C D

+ + +

+ 32位 128位 “+”代表mod232

128位 图4-1 MD5算法的实现步骤

之一。

以下是每次操作中用到的4个非线性函数(每轮一个)。

B

D

B

F∧

=

C

C

(

)

B

)

)

(

,

,

(D

C

B

D

B

D

=

G∧

C

(

(

)

)

)

,

(D

,

)

=

,

(

,

B

C

H⊕

D

B

D

C

B

D

C

=

C

I∨

,

(

B

)

)

,

(D

MD5轮主要操作为:

a

b

b

a<<<

f

+

=

c

+

+

+

)

)

)

d

,

,

M

((s

t

(

对应于四轮操作,f分别取F,G,H,I;对每一轮的16次运算,M分别取M1,M2,…,M16。对于4轮共64次运算,t为给定的一些常数,另外一个常数)(i s 是))

232i

abs的整数部分,其中i=1,2,…,64。在)

*

(sin(

sin(i中,i的单位是弧度,由此构成了32位的随机数源)(i s,它消除了输入数据中任何规律性的特征。

对于4轮64次操作的具体运算,可查阅课本的内容。所有这些操作完成之后,将A,B,C,D分别加上A0,B0,C0,D0。然后用下一分组数据继续进行运算,最后得到一组A,B,C,D。把这组数据级联起来,即得到128比特的Hash结果。

需要说明的是,2004年8月,在Crypto2004国际密码学会议上,山东大学王小云教授发现了一种找到MD5散列函数的碰撞的方法,即可以找到两个不同的输入x和y,得到相同的Hash结果。这一发现意味着采用MD5算法的数字签名、完整性检验等信息安全应用系统将不在安全了,这就促使信息安全系统的设计者尽快去寻找和探索新的Hash算法。

三、实验环境

运行Windows操作系统的PC机,具有VC等语言编译环境

四、实验内容和步骤,

1、算法分析

我们给出了有关MD5算法的头文件md5.h和G__md5.c,根据所提供的文件

分析MD5算法的实现过程。

下面简单介绍所用到的结构体变量和函数。程序中用到的结构体变量如下:typedef struct md5_state {

ulong64 length;

ulong32 state[4], curlen;

unsigned char buf[64];

}md5_state;

length记录已经处理过的位数,curlen记录已经处理过的字节数,数组state 存储上面所说的4个链接变量,buf作为处理过程中的缓存。

程序中用到的函数如下:

(1)void md5_init(md5_state *md)

函数名称:初始化函数。

参数说明;

md指向一个上面所提到的结构体变量。初始化时把curlen和length置为0,并把4个链接变量存储到state中。

(2)int md5_process(md5_state*md, const unsigned char *buf, unsigned longlen)

函数名称:处理函数

参数说明:

md指向经过初始化函数处理过的一个结构体变量。

buf指向待处理的信息。

Len是buf中信息的长度,以字节为单位。

这个函数对处理的信息以512比特为单位进行压缩,不足的部分存储在结构体的buf中,并且用len来指示信息的末尾,这样下次调用时会接着上一次的结果进行。

(3)int md5_done(md5_state *md, unsigned char *Hash)

函数名称:完成函数

参数说明;

md指向上面所处理过的结构体。

Hash指向存储结果的缓冲区。

这个函数对未完成的信息先进行padding(填补)操作,然后处理,并把最终结果存在Hash指向的缓冲区中。

2、算法实现:

利用提供的代码,实现对任意输入长度的字符串进行MD5散列函数运

算。

3、雪崩效应检验:

尝试对一个长字符串进行Hash运算,并获得其运算结果。对该字符串进行轻微的改动,比如增加一个空格或标点,比较Hash结果值的改变位数。进行8次这样的测试。

4、自己编写MD5代码。

五、实验报告和要求

1、利用提供的程序进行MD5的算法编程,对一个给定的字符串,计算它

的Hash值,提交程序代码和运算结果。

2、自己编写完整的MD5实现代码,并提交程序和程序流程图。

3、对编好的MD5算法,测试其雪崩效应,要求给出文本改变前和改变后的

Hash值,并计算出改变的位数。写出8次测试的结果,并计算出平均改变的位数。

数据结构实验 散列表实验报告

课程实验报告 课程名称:数据结构 实验项目名称:散列表 专业班级: 姓名:XXX 学号: 完成时间:2015 年06 月13 日

背景 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在理想情况下,查找、插入、删除操作的时间均为O(1),是一种高效的动态集合结构。 例1:计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键值为任意字符串,与语言中的标识符对应。该符号表常采用散列表。 例2:为了节约空间,常常需要把文本文件采用压缩编码方式存储。LZW是对文本文件进行压缩和解压缩的方法之一,该方法采用了散列。 问题描述 我们希望在浩瀚的图书中,去发现一本书是否存在。我们不知道书的编号,只知道它的书名。(其实这已经不错了...)。通过书名,来查询它是否存在。 为了简化问题,我们假设每本书的书名都是一组小写字母组成,长度不超过100字符。 基本要求 (1)根据输入建立图书名称表,采用散列表实现该表,散列函数选用BKDE 字符串哈希。 (2)数据的输入输出格式: 输入分为两部分 第一部分,第一行是行数n,n <= 5000。余下n行,每行一个字符串。表示已存 在的图书记录。 第二部分,第一行是行数m,m <= 1000。余下m行,每行一个字符串。表示要查 询的图书记录。 输出: 输出为m行,如果被查的记录存在,则输出"YES",如果不存在则输出"NO"。 测试数据 输入: 4 a ans and hellocpp

哈希表实验报告完整版

实验报告 姓名:学号: 1.实验题目 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。 基本要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 2.需求分析 本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 输出形式:地址,关键字,收索长度,H(key),拼音 3.概要设计 typedef struct NAME typedef struct hterm void InitNameList() void CreateHashList() void FindList() void Display() int main() 4.详细设计 #include #include #include

#define HASH_LEN 50 #define M 47 #define NAME_NO 8 typedef struct NAME { char *py; //名字的拼音 int k; //拼音所对应的整数}NAME; NAME NameList[HASH_LEN]; typedef struct hterm //哈希表{ char *py; //名字的拼音 int k; //拼音所对应的整数int si; //查找长度 }HASH; HASH HashList[HASH_LEN]; void InitNameList() { NameList[0].py="houxinming"; NameList[1].py="abc"; NameList[2].py="defdgf"; NameList[3].py="zhangrji"; NameList[4].py="jiaxin"; NameList[5].py="xiaokai"; NameList[6].py="liupeng"; NameList[7].py="shenyonghai";

哈希算法散列

计算机算法领域 基本知识 Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ 1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a?key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法 3. 平方取中法 4. 折叠法 5. 随机数法 6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。 处理冲突的方法 1. 开放寻址法;Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法: 1. di=1,2,3,…, m-1,称线性探测再散列; 2. di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列;

数据结构课程设计--哈希表实验报告

福建工程学院 课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年12 月31 日 实验题目:哈希表 一、要解决的问题 针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。 基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。 运行的环境:Microsoft Visual C++ 6.0 二、算法基本思想描述 设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环语句调用数组中保存的数据来显示哈希表。 三、设计 1、数据结构的设计和说明 (1)结构体的定义 typedef struct //记录 { NA name; NA xuehao; NA tel; }Record;

{ Record *elem[HASHSIZE]; //数据元素存储基址 int count; //当前数据元素个数 int size; //当前容量 }HashTable; 哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。 2、关键算法的设计 (1)姓名的折叠处理 long fold(NA s) //人名的折叠处理 { char *p; long sum=0; NA ss; strcpy(ss,s); //复制字符串,不改变原字符串的大小写 strupr(ss); //将字符串ss转换为大写形式 p=ss; while(*p!='\0') sum+=*p++; printf("\nsum====================%d",sum); return sum; } (2)建立哈希表 1、用除留余数法构建哈希函数 2、用线性探测再散列法处理冲突 int Hash1(NA str) //哈希函数 { long n; int m; n=fold(str); //先将用户名进行折叠处理 m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数 return m; //并返回模值 }Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{ int i,q; i=c/2+1; while(i=0) return q; else i=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++;

单向散列函数算法Hash算法

单向散列函数算法(Hash算法): 一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(过程不可逆),常见的单向散列算法有MD5,SHA.RIPE-MD,HAVAL,N-Hash 由于Hash函数的为不可逆算法,所以软件智能使用Hash函数作为一个加密的中间步骤 MD5算法: 即为消息摘要算法(Message Digest Algorithm),对输入的任意长度的消息进行预算,产生一个128位的消息摘要 简易过程: 1、数据填充..即填出消息使得其长度与448(mod 512)同余,也就是说长度比512要小64位(为什么数据长度本身已经满足却仍然需要填充?直接填充一个整数倍) 填充方法是附一个1在后面,然后用0来填充.. 2、添加长度..在上述结果之后附加64位的消息长度,使得最终消息的长度正好是512的倍数.. 3、初始化变量..用到4个变量来计算消息长度(即4轮运算),设4个变量分别为A,B,C,D(全部为32位寄存器)A=1234567H,B=89abcdefH,C=fedcba98H,D=7654321H 4、数据处理..首先进行分组,以512位为一个单位,以单位来处理消息.. 首先定义4个辅助函数,以3个32为双字作为输入,输出一个32为双字 F(X,Y,Z)=(X&Y)|((~X)&Z) G(X,Y,Z)=(X&Z)|(Y&(~Z)) H(X,Y,Z)=X^Y^Z I(X,Y,Z)=Y^(X|(~Z)) 其中,^是异或操作 这4轮变换是对进入主循环的512为消息分组的16个32位字分别进行如下操作: (重点)将A,B,C,D的副本a,b,c,d中的3个经F,G,H,I运算后的结果与第四个相加,再加上32位字和一个32位字的加法常数(所用的加法常数由这样一张表T[i]定义,期中i为1至64之中的值,T[i]等于4294967296乘以abs(sin(i))所得结果的整数部分)(什么是加法常数),并将所得之值循环左移若干位(若干位是随机的??),最后将所得结果加上a,b,c,d之一(这个之一也是随机的?)(一轮运算中这个之一是有规律的递增的..如下运算式),并回送至A,B,C,D,由此完成一次循环。(这个循环式对4个变量值进行计算还是对数据进行变换??) For i=0 to N/16 do For j=0 to 15 do Set X[i] to M[i*16+j] End AA = A BB=B CC=C DD=D //第一轮,令[ABCD K S I]表示下面的操作: //A=B+((A+F(B,C,D)+X[K]+T[I])<<

习题题5-1Hash函数答案说明

题5.1 a.分离链接法:将散列到同一个值的所有元素保留到一个链表中。 1)首先插入4371,h(4371)=4371(mod 10)=1,故插入1位置。 2)插入1323,h(1323)=1323(mod 10)=3,故插入3位置。 3)插入6173,h(6173)=6173(mod 10)=3,故插入3位置,此时发生冲突(与1323 插入同一位置),故添加一个链表并保存到此链表中。 4)插入4199,h(4199)=4199(mod 10)=9,故插入9位置。 5)插入4344,h(4344)=4344(mod 10)=4,故插入4位置。 6)插入9679,h(9679)=9679(mod 10)=9,故插入9位置,此时发生冲突(与4199 插入同一位置),故添加一个链表并保存到此链表中。 7)插入1989,h(1989)=1989(mod 10)=9,故插入9位置,此时发生冲突(与4199, 9679插入同一位置),故添加一个链表并保存到此链表中。 b.线性探测:hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i,i为发 生冲突的次数,f(0)=0。相当于逐个探测散列表,最后将值散列

到最接近的一个空单元中(可以理解为,若发生冲突,则插入到下一个空单元中)。 1)首先插入4371,h0(4371)=(4371(mod 10)+f(0))mod 10=1,故插入1位置。 2)插入1323,h0(1323)=(1323(mod 10)+f(0))mod 10=3,故插入3位置。 3)插入6173,h0(6173)=(6173(mod 10)+f(0))mod 10=3,故插入3位置,此时发 生冲突(与1323插入同一位置)。 发生第一次冲突,计算h1(6173)=(6173(mod 10)+f(1))mod 10=4,故插入4位置。 4)插入4199,h0(4199)=(4199(mod 10)+f(0))mod 10=9,故插入9位置。 5)插入4344,h0(4344)=(4344(mod 10)+f(0))mod 10=4,故插入4位置,此时发 生冲突(与6173。插入同一位置)。 发生第一次冲突计算h1(4344)=(4344(mod 10)+f(1))mod 10=5,故插入5位置。 6)插入9679,h0(9679)=(9679(mod 10)+f(0))mod 10=9,故插入9位置,此时发 生冲突(与4199插入同一位置)。 发生第一次冲突计算h1(9679)=(9679(mod 10)+f(1))mod 10=0,故插入0位置。 7)插入1989,h0(1989)=(1989(mod 10)+f(0))mod 10=9,故插入9位置,此时发

密码学实验(MD5实验)

密码学实验 ——计算文件MD5值 姓名: 班级: 学号: 教师: 助教:

【1】Hash算法实验 (1)MD5\SHA1\SHA-256算法比较 A.【相同点】MD5,SHA1,SHA-256属于密码级散列函数,算法相对比较复杂,参与加密算法的过程中时也 比较安全,三者都是属于哈希算法一类,都是任意长 度的消息压缩到某一固定长度的消息摘要的函数B.【不同点】 MD5输出128bit SHA1输出160bit SHA256输出256bit ①普通密码可以用MD5,但数字证书和数字签名就法 定必须用SHA256 ②MD5比SHA1快,SHA1比MD5强度高 C.截图

(2)相同与相似字符串MD5差异比较

【2】Hash算法过程与填充方式

【常见Hash算法的数据填充方式】 1.首位填充1,后面填满0位;【即:先补一个1,然后再补 0,直到长度满足对512取模后余数是448。】 2.补长度;【通常用一个64位的数据来表示原始消息的长度。 如果消息长度不大于2^64,那么第一个字就是0;如果原始的消息长度超过了512,我们需要将它补成512的倍数。 然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要】 【3】计算文件MD5值 1.源代码【hello.exe\erase.exe文件放在其中的src文件夹中】package com.topcheer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Scanner; publicclass EXEMD5 { /*设置MD5值输出为16进制(从0到F)*/

什么是哈希函数

什么是哈希函数 哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。 1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质: 2、给定输入数据,很容易计算出它的哈希值; 3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性; 4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性; 5、哈希值不表达任何关于输入数据的信息。 哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。` 怎样构建数字签名 好了,有了Hash函数,我们可以来构建真正实用的数字签名了。 发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。 数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。 由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

哈希查找_数据结构实验报告

南昌航空大学实验报告 课程名称:数据结构实验名称:实验九查找 班级:学生姓名:学号: 指导教师评定:签名: 题目:编程实现哈希表的造表和查找算法。 要求:用除留余数法构造哈希函数,用二次探测再散列解决冲突。 一、需求分析 1.用户可以根据自己的需求输入一个顺序表(哈希表) 2.通过用除留余数法构造哈希函数,并用开放地址的二次探测再散列解决冲突。 3.在经过排序后显示该哈希表。 4.程序执行的命令包括: (1)创建哈希表(2)输出哈希表(3)二次探测再散列解决冲突 二、概要设计 ⒈为实现上述算法,需要顺序表的抽象数据类型: ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 基本操作P: Creathash(&h) 操作结果:构造一个具有n个数据元素的哈希查找表h。 destroyhash(&h) 初始条件:哈希查找表h存在。 操作结果:销毁哈希查找表h。 displayhash(h) 初始条件:哈希查找表h存在。 操作结果:显示哈希查找表h。 hash(h,&k) 初始条件:哈希查找表h存在。 操作结果:通过除留余数法得到地址用k返回。 hash2 (i,&k) 初始条件:哈希查找表h存在存在,i是除留余数法得到的地址。 操作结果:返回二次探测再散列解决冲突得到的地址k。 search (h,key) 初始条件:哈希查找表h存在。 操作结果:查找表h中的key,若查找成功,返回其地址,否则返回

-1 insert (&h,key) 初始条件:哈希查找表h存在。 操作结果:若表h中没有key,则在h中插入key。 search1(h, key,&p) 初始条件:哈希查找表h存在。 操作结果:在表h中查找key,若没有,则返回p的插入的地址,否 则返回-1。 }ADT Hash 2. 本程序有三个模块: ⑴主程序模块 main(){ 初始化; { 接受命令; 显示结果; } } ⑵创建hash表的模块:主要建立一个哈希表; ⑶解决冲突模块:利用开放地址的二次探测再散列解决冲突; (4)输出哈希表模块:显示已创建哈希表。 三、详细设计 ⒈元素类型,结点类型 typedef struct { int key; }keytype; typedef struct { keytype elem[100]; int length; /*当前的长度*/ int size; /*哈希表的总长*/ }hashtable; /*全局变量*/ int a=0,b=0; /*哈希函数*/ 2.对抽象数据类型中的部分基本操作的伪码算法如下: /*哈希函数*/ int hash(hashtable *h,int k) { return k%h->size; }

SHA-1(安全哈希算法实现)

SHA-1(安全哈希算法实现) 如题,不知道sha-1的自己百度吧。 1 #include 2 #include //定义vector数组 3 #include //记录消息 4usingnamespace std; 5 6constint NUM = 8; //一个字由32比特(或者8个16进制数) 7constint BIT = 512; //消息认证码要以512比特一组 8 9//字常量 10string H0 = "67452301"; 11string H1 = "EFCDAB89"; 12string H2 = "98BADCFE"; 13string H3 = "10325476"; 14string H4 = "C3D2E1F0"; 15 16//定义SHA1(安全哈希算法)类 17class SHA1 18 { 19public: 20//将一个字符串形式的字转化为vector数组 21 vector hex_into_dec(string word); 22 23//将vector转化为string字符串形式 24string num_into_message(vector A); 25 26//两个字X和Y的逻辑"和" 27 vector word_AND(vector A,vector B); 28 29//两个字X和Y的逻辑"或" 30 vector word_OR(vector A,vector B); 31 32//两个字X和Y的逻辑"异或" 33 vector word_XOR(vector A,vector B); 34 35//两个字X和Y的逻辑"补" 36 vector word_COMPLEMENT(vector A); 37 38//两个字X和Y的摸2^32整数加 39 vector word_ADD(vector A,vector B); 40

【免费下载】hash算法实验

实验课程名称:电子商务安全管理实验项目名称1:DES 、RSA 和Hash 算法的实现实验成绩 试验者 王秀梅专业班级1105441 组别同组者无实验的目的 (1) 掌握常用加密处理软件的使用方法。 (2) 理解DES 、RSA 和Hash 算法的原理。 (3) 了解MD5算法的破解方法。实验环境 (1) 装有Windows XP/2003操作系统的PC 机1台。 (2) MixedCS 、RSATool 、DAMN_HashCalc 、MD5Crack 工具软件各1套。实验步骤1、请参考实验指导PPT 。并在最后写实验心得体会。2、将实验电子版提交FTP——1105441电子商务安全管理——第一次实验报告,文件名为“学号(1105441)+姓名+实验一”。 实验过程记录 (1) 对称加密算法DES 的实现 步骤1:双击运行MixedCS.exe 程序,打开的程序主界面步骤2:单击“浏览文件”按钮,选择要进行DES 加密的源文件,选择完成后在“输出文件”文本框中会自动出现默认的加密后的文件名。步骤3:选中“DES 加密”单选按钮,在“DES 密钥”文本框中输入5个字符 (区分大小、管路敷设技术通过管线敷设技术,不仅可以解决吊顶层配置不规范问题,而且可保障各类管路习题到位。在管路敷设过程中,要加强看护关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置保护层防腐跨接地线弯曲半径标高等,要求技术交底。管线敷设技术中包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。线缆敷设原则:在分线盒处,当不同电压回路交叉时,应采用金属隔板进行隔开处理;同一线槽内,强电回路须同时切断习题电源,线缆敷设完毕,要进行检查和检测处理。、电气课件中调试对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料试卷相互作用与相互关系,根据生产工艺高中资料试卷要求,对电气设备进行空载与带负荷下高中资料试卷调控试验;对设备进行调整使其在正常工况下与过度工作下都可以正常工作;对于继电保护进行整核对定值,审核与校对图纸,编写复杂设备与装置高中资料试卷调试方案,编写重要设备高中资料试卷试验方案以及系统启动方案;对整套启动过程中高中资料试卷电气设备进行调试工作并且进行过关运行高中资料试卷技术指导。对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。 、电气设备调试高中资料试卷技术电力保护装置调试技术,电力保护高中资料试卷配置技术是指机组在进行继电保护高中资料试卷总体配置时,需要在最大限度内来确保机组高中资料试卷安全,并且尽可能地缩小故障高中资料试卷破坏范围,或者对某些异常高中资料试卷工况进行自动处理,尤其要避免错误高中资料试卷保护装置动作,并且拒绝动作,来避免不必要高中资料试卷突然停机。因此,电力高中资料试卷保护装置调试技术,要求电力保护装置做到准确灵活。对于差动保护装置高中资料试卷调试技术是指发电机一变压器组在发生内部故障时,需要进行外部电源高中资料试卷切除从而采用高中资料试卷主要保护装置。

HASH函数

密码学 (第十三讲) HASH函数 张焕国 武汉大学计算机学院

目录 密码学的基本概念 1、密码学 2、古典 、古典密码 3、数据加密标准( ) DES) 、数据加密标准(DES 4、高级 ) AES) 数据加密标准(AES 高级数据加密标准( 5、中国商用密码( ) SMS4) 、中国商用密码(SMS4 6、分组密码的应用技术 7、序列密码 8、习题课:复习对称密码 、公开密钥密码(11) 9、公开密钥密码(

目录 公开密钥密码(22) 10 10、 11、数字签名(1) 12、数字签名(2) 13、 、HASH函数 13 14 14、 15、 15 PKI技术 16 16、 、PKI 17、习题课:复习公钥密码 18、总复习

一、HASH 函数函数的概念的概念 1、Hash Hash的作用的作用 ?Hash Hash码也称报文摘要码也称报文摘要。。 ?它具有极强的错误检测能力错误检测能力。。 ?用Hash Hash码作码作MAC ,可用于认证认证。。 ?用Hash Hash码辅助码辅助数字签名数字签名。。 ?Hash Hash函数可用于函数可用于保密保密。。

一、HASH 函数的概念 2、Hash Hash函数的定义函数的定义 ①Hash Hash函数将任意长的数据函数将任意长的数据M 变换为定长的码h , 记为记为::h=HASH(M)h=HASH(M)或或h=H(M)h=H(M)。。 ②实用性:对于给定的数据对于给定的数据M M ,计算,计算h=HASH(M)h=HASH(M)是是 高效的。 ③安全性安全性:: ? 单向性:对给定的对给定的Hash Hash值值h ,找到满足H(x)H(x)==h 的x 在 计算上是不可行的计算上是不可行的。。 否则否则,,设传送数据为设传送数据为C=C=<<M ,H(M||K )>,K 是密钥。攻击者可以截获攻击者可以截获C,C,求出求出Hash 函数的逆函数的逆,,从而得出 M||S =H -1(C),然后从M 和M ||K即可即可得出得出K。

Hash算法MD5 实验报告

哈尔滨工程大学 实验报告 实验名称:Hash 算法MD5 班级: 学号: 姓名: 实验时间:2014年6月 成绩: 指导教师: 实验室名称: 哈尔滨工程大学实验室与资产管理处制

一、实验名称 Hash算法MD5 二、实验目的 通过实际编程了解MD5 算法的加密和解密过程,加深对Hash 算法的认识。 三、实验环境(实验所使用的器件、仪器设备名称及规格) 运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。 四、任务及其要求 (1)利用自己所编的MD5 程序对一个文件进行处理,计算它的Hash 值,提交程 序代程和运算结果。 (2)微软的系统软件都有MD5 验证,尝试查找软件的MD5 值。同时,在Windows 操作系统中,通过开始→运行→sigverif 命令,利用数字签名查找验证非Windows 的系 统软件。__ 五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等) 在MD5 算法中,首先需要对信息进行填充,使其字节长度与448 模512 同余,即信息的字节长度扩展至n*512+448,n 为一个正整数。填充的方法如下:在信息的后面填充第一位为1,其余各位均为0,直到满足上面的条件时才停止用0 对信息填充。然后,再在这个结果后面附加一个以64 位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度为n*512+448= (n+1)*512,即长度恰好是512 的整数倍,这样做的目的是为满足后面处理中后面处理中对信息长度的要求。n 个分组中第q 个分组表示为Yq。MD5 中有A、B、C、D,4 个32 位被称作链接变量的整数参数,它们的初始值分别为: A=01234567B=89abcdef,C=fedcba98,D= 当设置好这个4 个链接变量后,就开始进入算法的4 轮循环运算。循环的次数是信息中512 位信息分组数目。首先将上面4 个链接变量复制到另外4 个变量中A

加解密算法实验报告

实验加/解密算法 实验日期:__年__月_日实验成绩:___________ 1.实验目的: (1)数据机密性; (2)数据完整性; (3)不可抵赖性 2.实验环境(设备、仪器、网络): (1)虚拟机 (2)加密工具 (3)Windows系统环境 3.实验内容(实验方案、实验步骤、测量数据及处理等): 3.1实验方案 加密方和解密方利用RSA加密算法分别生成一对公钥和私钥,并告知对方自己的公钥。 加密方实验流程如图3-1所示: 图3-1 将加密后的明文和签名发送给解密方。 解密方实验流程如图3-2所示:

图3-2 将明文同样进行hash运算得出摘要,与验证签名后得出的摘要相比较,如果相同则可以证明明文没有被破坏或改变,同时也可使确定是加密方发送的信息。 3.2实验过程 加密方 (1)加密方通过RSA算法得出公钥(e,n)=(101,253),私钥(d,n)=(61,253); (2)编辑明文为we are in xinjiang,and you? (3)在加密工具的环境中利用解密方的公钥对明文进行加密,如图3-3所示: 图3-3 (4)在加密工具中利用MD5对明文进行hash运算,如图3-4所示:

图3-4 (5)用加密方的私钥对生成的摘要进行签名,如图3-5所示: 图3-5 (6)将签名与密文发送给解密方。

解密方 (1)通过RSA算法得出公钥(e,n)=(1003,2173),私钥(d,n)=(1827,2173) (2)利用解密方的私钥对密文解密,如图3-6所示: 图3-6 (3)验证签名,将加密方发送的签名用加密方的公钥解密,如图3-7所示:

哈希表实验报告(20200623044247)

数据结构实验报告四一一哈希表查找名字(字符串) 实验题目:哈希表查找名字(字符串) 实验目标: 输入一组名字(至少50个),将其保存并利用哈希表查找。输出哈希查找冲突次数,哈希表负载因子、查找命中率。 数据结构: 哈希表和数组(二维)。二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法, 用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。 需要的操作有: 1.关键字求取(主函数中两次出现,未单独编为函数) 关键字key=abs (字符串首位ASCII码值-第二位ASCII码值+第([n]+i )位ASCII码值撮后一 位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。 2.处理关键字的哈希函数(Hash) 利用平方取中法求关键值key在哈希表中的位置。公式add=(key*key)%1000/LENGTH(add 为key在哈希表中的地址)。 int Hash(i nt key) { return((key*key)/1000%LENGTH); } 3.处理哈希表中冲突的函数(Collision 利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。 int Collision(int key,int Hashtable[]) { int i; for(i=1;i<=LENGTH;i++) { if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH); coun t++; } } 4.哈希表初始化(InitHash) void InitHash(int Hashtable[]) { int i; for(i=0;i

安全哈希函数简介

安全哈希函数 一、哈希函数定义 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 二、性质 基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。但反过来不同的原始输入不一定能得到相同的散列值,即发生了碰撞。哈希函数的定义域无限,而值域有限,因此理论上来讲每个哈希函数都可以找到碰撞。 一个“优良”的hash函数f 应当满足以下三个条件: 任意y,找x,使得f(x)=y,非常困难。此为哈希函数的单向性,或抗原像性(preimage resistant)。 给定x1,找x2,使得f(x1)=f(x2),非常困难。弱抗碰撞性,或抗第二原像性(second preimage resistant)。 找x1,x2,使得f(x1)=f(x2),非常困难。强抗碰撞性(Collision Resistant)。 三、分类 哈希函数有字符串哈希函数,一般用于数据存储;安全哈希函数 安全哈希函数的分类: 根据安全水平: 弱抗碰撞哈希函数和强抗碰撞哈希函数,后者是包含前者的。 在保护口令的应用中,只需弱抗碰撞性就够了,但在数字签名中,必须有强抗碰撞性。

根据是否使用密钥: 带密钥的哈希函数:消息的散列值由只有通信双方知道的秘密密钥K来控制,此时散列值称作MAC(Message Authentication Code) 不带密钥的哈希函数:消息的散列值的产生无需使用密钥,此时散列值称作MDC(Message Detection Code 四、哈希函数的用途 数字签名 哈希函数可以提高签名的速度,减少运算,又可以不泄露签名所对应的消息,还可以将消息的签名与加密变换分开处理。 校验 可以校验数据是否被篡改。传输消息之前对消息进行哈希变换,接收者也进行相同的哈希变换,若两个哈希值相同,可以认为消息在传输过程中没有被篡改。 快速访问 散列表的寻址时间复杂度为O(1),在数据存储中运用较多,这里不作详述。 安全访问认证 MD5广泛用于操作系统的登陆认证上,如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。 伪随机数生成

数字签名实验的报告

数字签名实验报告 比较散列算法MD5和SHA所得到的结果 从三方面进行分析: 一、安全性:SHA优于MD5,由于160>128 二、速度:SHA慢了约25%,因为160>128且80>60 三、简易性:SHA对每一步骤的操作描述比MD5简单 对实验记录2这个源文件进行各类实验: SHA-1的信息摘要比MD5的要长,无论对源文件做出空格、修改、删除、增加等任何操作,两种散列函数的信息摘要都会发生改变。 1 查找资料,掌握不同散列算法的原理和特点,掌握MD5和SHA散列算法的特点和应用条件。

散列函数有三个主要特点: (1)它能处理任意大小的信息,并将其按信息摘要(Message Digest)方法生成固定大小的数据块,对同一个源数据反复执行Hash函数将总是得到同样的结果。 (2)它是不可预见的。产生的数据块的大小与原始信息看起来没有任何明显关系,原始信息的一个微小变化都会对小数据块产生很大的影响。 (3)它是完全不可逆的,没有办法通过生成的数据块直接恢复源数据。 常见散列函数有MD5、SHA、MAC、CRC。 MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值。有两个特点: 1、输入两个不同的明文(一段原始的数字信息)不会得到相同的输出值 2、根据输出值,不能得到原始的明文,即过程不可逆 所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,然后在所谓的解密的时候,都是通过这个映射表来查找其所对应的原始明文。而绝对没有一种算法,可以通过输出加密后的散列值算出原始明文。 ·SHA(Secure Hash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个160位的数值; ·MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。 ·CRC(Cyclic Redundancy Check):循环冗余校验码,CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。 2 总结信息摘要的特点,分析比较原始文件和信息摘要的关系。 (1)对于任何大小的数据,单向散列函数产生定长的信息摘要——定长性

密码学作业ch11

1.消息认证是为了对付哪些类型的攻击? 答:伪装(假冒)篡改内容修改顺序修改时间(包括重放) 2.消息认证或数字签名方法有哪两层功能? 答:任何消息认证或数字签名机制基本分两步: 产生认证符(是一个用来认证消息的值)的函数; 将该函数作为原语使接收方可以验证消息真实性的认证协议。 3.产生消息认证有哪些方法? 答:用于消息认证的最常见的密码技术是消息认证码和安全散列函数 MAC是一种需要使用秘密钥的算法,以可变长度的消息和秘密钥作为输入,产生一个认证码。拥有秘密钥的接受方产生一个认证码来验证消息的完整性。 哈西函数将可变长度的消息映射为固定长度的哈西值,或叫消息摘要。对于消息认证来说,安全散列函数还必须以某种方式和秘密钥捆绑起来。 4.对称加密和错误控制码一起用于消息认证时,这两个函数必须以何种顺序执行? 答:先错误控制码后对称加密。

5.什么是消息认证码? 答:消息认证码,是用来保证数据完整性的一种工具,可以防止数据未经授权被篡改,用数学语言描述,是一个让双方共享的密钥k和消 (m),这个函数值就是一个息m作为输入函数,如果将函数记为mac k 认证标记。 6.消息认证码和散列函数之间的区别是什么? 答:消息认证码(MAC)依赖公开函数,密钥控制下对消息处理,生成定长认证标识,并加以认证。 散列函数:将任意长度的消息换为定长的消息摘要,并加以认证。 7.为提供消息认证,应以何种方式保证散列值的安全? 答:a.用对称密码对消息及附加在其后的散列码加密。 b.用对称密码仅对散列加密。 c.用公钥密码和发送方的密钥仅对散列加密。 d.若寄希望保证保密性有希望有数字签名,则先用发送方的密钥对散列码加密 e.该方法使用散列函数但不使用加密函数来进行消息认证。 f.如果对整个消息和散列码加密,则(e)中的方法可提供保密性。 8.为了攻击MAC算法必须要恢复密钥吗? 答:不需要。

相关文档
最新文档