文档库 最新最全的文档下载
当前位置:文档库 › Hash算法实验原理及哈希函数简介

Hash算法实验原理及哈希函数简介

Hash算法实验原理及哈希函数简介
Hash算法实验原理及哈希函数简介

任务一 MD5算法111111*********

一.哈希函数简介

信息安全的核心技术是应用密码技术。密码技术的应用远不止局限于提供机密性服务,密码技术也提供数据完整性服务。密码学上的散列函数(Hash Functions)就是能提供数据完整性保障的一个重要工具。Hash函数常用来构造数据的短“指纹”:消息的发送者使用所有的消息产生一个附件也就是短“指纹”,并将该短“指纹”与消息一起传输给接收者。即使数据存储在不安全的地方,接收者重新计算数据的指纹,并验证指纹是否改变,就能够检测数据的完整性。这是因为一旦数据在中途被破坏,或改变,短指纹就不再正确。

散列函数是一个函数,它以一个变长的报文作为输入,并产生一个定长的散列码,有时也称为报文摘要,作为函数的输出。散列函数最主要的作用于是用于鉴别,鉴别在网络安全中起到举足轻重的地位。鉴别的目的有以下两个:第一,验证信息的发送者是真正的,而不是冒充的,同时发信息者也不能抵赖,此为信源识别;第二,验证信息完整性,在传递或存储过程中未被篡改,重放或延迟等。

二.哈希函数特点

密码学哈希函数(cryptography hash function,简称为哈希函数)在现代密码学中起着重要的作用,主要用于对数据完整性和消息认证。哈希函数的基本思想是对数据进行运算得到一个摘要,运算过程满足:

z压缩性:任意长度的数据,算出的摘要长度都固定。

z容易计算:从原数据容易算出摘要。

z抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的摘要都有很大区别。 z弱抗碰撞:已知原数据和其摘要,想找到一个具有相同摘要的数据(即伪造数据),在计算上是困难的。

z强抗碰撞:想找到两个不同的数据,使它们具有相同的摘要,在计算上是困难的。 三.针对哈希函数的攻击

与传统密码体制的攻击方式相比,对散列函数的攻击方法主要有两种:

z穷举攻击:它可以用于任何类型的散列函数的攻击,最典型的方式就是所谓的“生日攻击”。采用生日攻击的攻击者将产生许多明文消息,然后计算这些明文消息的指纹(摘要),进行比较。

z利用散列函数的代数结构:攻击其函数的弱性质。通常的有中间相遇攻击、修正分组攻击和差分分析攻击等。

四.MD5哈希函数

1990年R.L.Rivest提出哈希函数MD4。MD4不是建立在某种密码系统和假设之上,而是一种直接构造法。所以计算速度快,特别适合32位计算机软件实现,对于长的信息签名很实用。MD5是MD4的改进版,它比MD4更复杂,但是设计思想相似并且也产生了128位数列。 五.MD5哈希算法流程动画演示

对于任意长度的明文,MD5首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。

对于每个明文分组的摘要生成过程如下:

(1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。

(2)申请4个32位的链接变量,记为A、B、C、D

(3)子明文分组与链接变量进行第1轮运算。

(4)子明文分组与链接变量进行第2轮运算。

(5)子明文分组与链接变量进行第3轮运算。

(6)子明文分组与链接变量进行第4轮运算。

(7)链接变量与初始链接变量进行求和运算。

(8)链接变量作为下一个明文分组的输入重复进行以上操作。

(9)最后,4个链接变量里面的数据就是MD5摘要。

六.MD5分组过程

对于任意长度的明文,MD5可以产生128位的摘要。任意长度的明文首先需要添加位数,使明文总长度为448(mod512)。在明文后添加位的方法是第一个添加位是l,其余都是0。然后将真正明文的长度(没有添加位以前)以64位表示,附加于前面已添加过位的明文后,此时的明文长度正好是512位的倍数。当明文长度大于2的64次方时,仅仅使用低64位比特填充,附加到最后一个分组的末尾。

经过添加处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组(block),

可以划分成L份明文分组,我们用,,……,表示

图1-4-1 MD5的分组处理方法

七.MD5子明文分组和链接变量

对于512位的明文分组,MD5将其再分成16份子明文分组(sub-block),每份子明文分组为32位,我们使用M[k](k= 0, 1,……15)来表示这16份子明文分组。这里的概念要弄清楚,

一个添加位后的明文可以划分为L份明文组分,而一个明文分组又可以划分为16份子明文分组。 MD5有4轮非常相似的运算,每一轮包括16个类似的步骤,每一个步骤的数据处理都是针对4个32位记录单元中数据进行的。这4个32位记录单元称为“链接变量”,分别标记为A、B、C、D。这4个链接变量的初始值以16进位制表示如下:A=0x01234567,B=0x 89ABCDEF.C =0x FEDCBA98,D=0x 76543210。链接变量用于存放中间散列函数值,经过4轮运算(共64

个步骤)之后,链接变量A,B,C,D中的128位即为中间散列函数值。中间散列函数值作为下一个明文分组的输入继续使用,当所有的明文分组都处理完毕后,链接变量A,B,C,D中的128位数据就是摘要。

八.MD5第1轮运算

MD5有4轮非常相似的运算,每一轮包括16个类似的步骤,当第1轮运算中的第1步骤开始处理时,A、B、C、D四个链接变量中的值先赋值到另外4个记录单元A′,B′,C′,D′中。这4个值将保留,用于在第4轮的最后一个步骤完成之后与A,B,C,D进行异或操作。

第1轮的操作程序为FF(a,b,c,d,M[k],S,T[i])

它表示的逻辑为:a←b+((F(b,c,d)+M[k]+T[i])<<

其中,a、b、c、d为32位的变量,M[k]表示相应的子明文分组,对于4轮共64步的MD5算法中T[i]是64个不同的固定的数值,S为循环左移的位数,F(x,y,z)是第一轮的逻辑函数,最后将结果存放在链接变量A中。

第1轮16步的固定值T[i]值如表1-4-1所示。

表1-4-1 MD5第1轮固定数T

MD5规定,第一轮的16步操作如表1-4-2所示。

表1-4-2 MD5第1轮16步运算

MD5算法中,第一轮的逻辑函数F(x,y,z)为F(x,y,z)= (x?y)V( ?z),MD5的算法比较复杂,下面我们以第1轮的第1步和第2步为例来展示每一步的运算。

例如,子明文分组M[0] = 0x0000FFFF、M[1] = 0x00000000,第1轮的操作程序为

FF(a,b,c,d,M[k],S,T[i]),它表示的逻辑为:

a←b+((F(b,c,d)+M[k]+T[i])<<

第一轮的逻辑函数F(x,y,z)为F(x,y,z)= ( x & y )|( ~x & z ),由表1-4-2知,第1轮第1步的运算为:FF(A,B,C,D,M[0],7,0xd76aa478),注意到这里的0xd76aa478就是T[1]的值,变量a、b、c、d分别代表链接变量A、B、C、D。首先,b、c、d要经过逻辑函数F,即:

然后得到的值要与M[0]和T[1]相加得0xFEDCBA98+0x0000FFFF+0xD76AA478 = 0xD6485F0F,0xD6485F0F要循环左移7位,得到结果:0x242F87EB,0x242F87EB与b相加得:0x242F87EB + 0x89ABCDEF = 0xADDB55DA,最后,将这个结果赋值给a,第1步的计算就完成了,只有链接变量A发生了改变,这时链接标量的值为:

A = 0xADDB55DA

B = 0x89ABCDEF

C = 0xFEDCBA98

D = 0x76543210

第1轮第2步的运算为FF(D,A,B,C,M[1],12,0xe8c7b756),注意到这里的0xe8c7b756就是T[2]的值,变量a、b、c、d分别代表链接变量D、A、B、C。

首先,b、c、d要经过逻辑函数F,即:

然后得到的值要与M[1]和T[2]相加得0xDB8FEFCA+0x00000000+0xE8C7B756= 0xC457A720,0xD6485F0F要循环左移12位,得到结果:0x7A720C45,0x242F87EB与b相加得:0x7A720C45 + 0xADDB55DA = 0x284D621F。

最后,将这个结果赋值给a,第2步的计算就完成了,只有链接变量D发生了改变,这时链接标量的值为:

A = 0xADDB55DA

B = 0x89ABCDEF

C = 0xFEDCBA98

D = 0x284D621F

经过16个步骤之后,MD5的第一轮运算就完成了,链接变量A、B、C、D将携带第1轮运算后的数值进入第二轮运算。

九.MD5后3轮运算

MD5第2轮、第3轮和第4轮算运与第一轮运算相似,这里给出相应的操作程序、固定数T、每一步运算和逻辑函数。

第2轮的逻辑函数为:G( x, y, z ) = ( x & y )|( y & ~z )。

第3轮的逻辑函数为:H( x, y, z ) = x⊕y⊕z。

第4轮的逻辑函数为:I( x, y, z ) = y⊕( x & ~z )。

第2轮的操作程序为:GG(A,B,C,D,M[k],S,T[i])。

它表示的逻辑为:a←b+((G(B,C,D)+M[k]+T[i])<<

第3轮的操作程序为:HH(A,B,C,D,M[k],S,T[i])。

它表示的逻辑为:a←b+((H(B,C,D)+M[k]+T[i])<<

第4轮的操作程序为:II(A,B,C,D,M[k],S,T[i])。

它表示的逻辑为:a←b+((I(B,C,D)+M[k]+T[i])<<

后3轮的每个步骤的运算如表1-4-3所示。

表1-4-3 MD5后3轮16步运算

后3轮的固定数T的值如表1-4-4所示。

表1-4-4 后3轮的固定数T

十.求和运算

第四轮最后一步骤的A,B,C,D输出,将分别与A′,B′,C′,D′记录单元中数值进行求和操作。其结果将成为处理下一个512位明文分组时记录单元A,B,C,D的初始值。当完成了最后一个明文分组运算时,A,B,C,D中的数值就是最后的散列函数值。

任务二 SHA1函数

一.SHA1与MD5差异

SHA1对任意长度明文的预处理和MD5的过程是一样的,也即预处理完后的明文长度是512位的整数倍,但是有一点不同,那就是SHA1的原始报文长度不能超过2的64次方,然后SHA1生成160位的报文摘要。SHA1算法简单而且紧凑,容易在计算机上实现。

表1-4-5列出了对MD5及SHA的比较差异之处。让我们根据各项特性,简要说明其间的不同。

表1-4-5 MD5与SHA1的比较

z安全性:SHA所产生的摘要比MD5长32位。若两种散列函数在结构上没有任何问题的话,SHA比MD5更安全。

z 速度:两种方法都是主要考虑以32位处理器为基础的系统结构。但SHA的运算步骤比MD5多了16步,而且SHA记录单元的长度比MD5多了32位。因此若是以硬件来实现SHA,其速度大约比MD5慢了25%。

z 简易性:两种方法都是相当的简单,在实现上不需要很复杂的程序或是大量存储空间。然而总体上来讲,SHA对每一步骤的操作描述比MD5简单。

二.SHA1哈希算法流程动画演示

对于任意长度的明文,SHA1首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。

对于每个明文分组的摘要生成过程如下:

(1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。

(2)申请5个32位的链接变量,记为A、B、C、D、E。

(3)16份子明文分组扩展为80份。

(4)80份子明文分组进行4轮运算。

(5)链接变量与初始链接变量进行求和运算。

(6)链接变量作为下一个明文分组的输入重复进行以上操作。

(7)最后,5个链接变量里面的数据就是MD5摘要。

三.SHA1的分组过程

对于任意长度的明文,SHA1的明文分组过程与MD5相类似,首先需要对明文添加位数,使明文总长度为448(mod512)。在明文后添加位的方法是第一个添加位是l,其余都是0。然后将真正明文的长度(没有添加位以前)以64位表示,附加于前面已添加过位的明文后,此时的明文长度正好是512位的倍数。有一点与MD5不同,那就是SHA1的原始报文长度不能超过2的64次方。

经过添加处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组(block),可以划分成L份明文分组,我们用Y0,Y0,……YL-1表示这些明文分组。对于每一个明文分组,都要重复反复的处理,这些与MD5是相同的。

对于512位的明文分组,SHA1将其再分成16份子明文分组(sub-block),每份子明文分组为32位,我们使用M[k](k= 0, 1,……15)来表示这16份子明文分组。之后还要将这16份子明文分组扩充到80子明文分组份,我们记为W[k](k= 0, 1,……79),扩充的方法如下。

W t = M t , 当0≤t≤15

W t = W t-3⊕W t-8⊕W t-14⊕ W t-16, 当16≤t≤79

SHA1有4轮运算,每一轮包括20个步骤(一共80步),最后产生160位摘要,这160位摘要存放在5个32位的链接变量中,分别标记为A、B、C、D、E。这5个链接变量的初始值以16进位制表示如下。

A=0x 67452301

B=0x EFCDAB89

C=0x 98BADCFE

D=0x 10325476

E=0x C3D2E1F0

四.SHA1的4轮运算

SHA1有4轮运算,每一轮包括20个步骤,一共80步,当第1轮运算中的第1步骤开始处理时,A、B、C、D、E五个链接变量中的值先赋值到另外5个记录单元A′,B′,C′,D′,E′中。这5个值将保留,用于在第4轮的最后一个步骤完成之后与链接变量A,B,C,D,E进行异或操作。

SHA1的4轮运算,共80个步骤使用同一个操作程序,如下:

其中为逻为子为固

的结果赋值给链接变量A

z将链接变量A赋值给链接变量B

z将链接变量B循环左移30位赋值位链接变量C

z将链接变量C赋值给链接变量D

z 将链接变量D赋值给链接变量E

SHA1规定4轮运算的逻辑函数如表1-4-6所示。

表1-4-6 SHA1的逻辑函数

在操作程序中需要使用固定常数(i的取

表1-4-7 SHA1的常数K取值表

我们同样举一个例子来说明SHA1哈希算法中的每一步是怎样进行的,比起MD5算法,SHA1相对简单,假设W[1]=0x12345678,此时链接变量的值分别为A=0x67452301、B=0xEFCDAB89、C=0x98BADCFE、D=0x10325476、E=0xC3D2E1F0,那么第1轮第1步的运算过程如下。

(1)将链接变量A循环左移5位,得到的结果为:0xE8A4602C。

(2)将B,C,D经过相应的逻辑函数:

(3)将第(1)步,第2步的结果与E,W[0],和K0相加得:

(4)将B循环左移30位得:(B<<<30)=0x7BF36AE2

(5)将第3步结果赋值给A,A(这里是指A原始结果)赋值给B,步骤4的结果赋值给C,C赋值给D,D赋值给E

(6)最后得到第1轮第1步的结果:

A = 0xB1E8EF2B

B = 0x67452301

C = 0x7BF36AE2

D = 0x98BADCFE

E = 0x10325476

按照这种方法,将80个步骤进行完毕。

第四轮最后一个步骤的A,B,C,D,E输出,将分别与记录单元A′,B′,C′,D′,E′中的数值求和运算。其结果将作为输入成为下一个512位明文分组的链接变量A,B,C,D,E,当进行完最后一个明文分组后,A,B,C,D,E中的数据就是最后散列函数值。

哈希算法散列

计算机算法领域 基本知识 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)称二次探测再散列;

一致性哈希算法应用及优化(最简洁明了的教程)

一致性哈希算法的应用及其优化 一.简单哈希算法 哈希(Hash)就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,使得散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。哈希算法是一种消息摘要算法,虽然哈希算法不是一种加密算法,但由于其单向运算,具有一定的不可逆性使其成为加密算法中的一个重要构成部分。 二.分布式缓存问题 哈希算法除了在数据加密中的运用外,也可以用在常见的数据分布式技术中。哈希计算是通过求模运算来计算哈希值的,然后根据哈希值将数据映射到存储空间中。设有由N 个存储节点组成的存储空间,采用简单哈希计算将一个数据对象object 映射到存储空间上的公式为:Hash(object)% N。 现在假设有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式已经不能满足用户的访问,于是想引入Memcached作为缓存机制。现在一共有三台机器可以作为Memcached服务器,如下图1所示。

图1.三台memcached服务器 可以用简单哈希计算:h = Hash(key) % 3 ,其中Hash是一个从字符串到正整数的哈希映射函数,这样能够保证对相同key的访问会被发送到相同的服务器。现在如果我们将Memcached Server分别编号为0、1、2,那么就可以根据上式和key计算出服务器编号h,然后去访问。 但是,由于这样做只是采用了简单的求模运算,使得简单哈希计算存在很多不足: 1)增删节点时,更新效率低。当系统中存储节点数量发生增加或减少时,映射公式将发生变化为Hash(object)%(N±1),这将使得所有object 的映射位置发生变化,整个系统数据对象的映射位置都需要重新进行计算,系统无法对外界访问进行正常响应,将导致系统处于崩溃状态。 2)平衡性差,未考虑节点性能差异。由于硬件性能的提升,新添加的节点具有更好的承载能力,如何对算法进行改进,使节点性能可以得到较好利用,也是亟待解决的一个问题。 3)单调性不足。衡量数据分布技术的一项重要指标是单调性,单调性是指如果已经有一些内容通过哈希计算分派到了相应的缓冲中,当又有新的缓冲加入到系统中时,哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 由上述分析可知,简单地采用模运算来计算object 的Hash值的算法显得过于简单,存在节点冲突,且难以满足单调性要求。

单向散列函数算法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])<<

hash算法

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 数学表述为:h = H(M) ,其中H( )--单向散列函数,M--任意长度明文,h--固定长度散列值。 在信息安全领域中应用的Hash算法,还需要满足其他关键特性: 第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应的M=H-1(h)不可行。这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的Hash 又被称为"消息摘要(message digest)",就是要求能方便的将"消息"进行"摘要",但在"摘要"中无法得到比"摘要"本身更多的关于"消息"的信息。 第二是抗冲突性(collision-resistant),即在统计上无法产生2个散列值相同的预映射。给定M,计算上无法找到M',满足H(M)=H(M') ,此谓弱抗冲突性;计算上也难以寻找一对任意的M和M',使满足H(M)=H(M') ,此谓强抗冲突性。要求"强抗冲突性"主要是为了防范所谓"生日攻击(birthday attack)",在一个10人的团体中,你能找到和你生日相同的人的概率是2.4%,而在同一团体中,有2人生日相同的概率是11.7%。类似的,当预映射的空间很大的情况下,算法必须有足够的强度来保证不能轻易找到"相同生日"的人。 第三是映射分布均匀性和差分分布均匀性,散列结果中,为0 的bit 和为 1 的bit ,其总数应该大致相等;输入中一个bit 的变化,散列结果中将有一半以上的bit 改变,这又叫做"雪崩效应(avalanche effect)";要实现使散列结果中出现1bit 的变化,则输入中至少有一半以上的bit 必须发生变化。其实质是必须使输入中每一个bit 的信息,尽量均匀的反映到输出的每一个bit 上去;输出中的每一个bit,都是输入中尽可能多bit 的信息一起作用的结果。 Damgard 和Merkle 定义了所谓"压缩函数(compression function)",就是将一个固定长度输入,变换成较短的固定长度的输出,这对密码学实践上Hash 函数的设计产生了很大的影响。Hash函数就是被设计为基于通过特定压缩函数的不断重复"压缩"输入的分组和前一次压缩处理的结果的过程,直到整个消息都被压缩完毕,最后的输出作为整个消息的散列值。尽管还缺乏严格的证明,但绝大多数业界的研究者都同意,如果压缩函数是安全的,那么以上述形式散列任意长度的消息也将是安全的。这就是所谓Damgard/Merkle 结构: 在下图中,任意长度的消息被分拆成符合压缩函数输入要求的分组,最后一个分组可能需要在末尾添上特定的填充字节,这些分组将被顺序处理,除了第一个消息分组将与散列初始化值一起作为压缩函数的输入外,当前分组将和前一个分组的压缩函数输出一起被作为这一次

密码学实验(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)*/

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法 1. 哈希算法 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 1. 什么是哈希算法? 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2. 如何设计一个优秀的哈希算法? 单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 篡改无效: 对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。 散列冲突: 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。 执行效率: 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈

希值。 2. 哈希算法的常见应用有哪些? 7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 1. 安全加密 常用于加密的哈希算法: MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法 SHA:Secure Hash Algorithm,安全散列算法 DES:Data Encryption Standard,数据加密标准 AES:Advanced Encryption Standard,高级加密标准 对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。 在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。 2. 唯一标识 通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。 3. 数据校验 利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。 4. 散列函数 1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?

【免费下载】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) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用(上篇) 安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。 除了这两个之外,当然还有很多其他加密算法,比如 DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)。

前面我讲到的哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。像 MD5,有 2^128 个不同的哈希值,这个数据已经是一个天文数字了,所以散列冲突的概率要小于 1-2^128。 如果我们拿到一个 MD5 哈希值,希望通过毫无规律的穷举的方法,找到跟这个 MD5 值相同的另一个数据,那耗费的时间应该是个天文数字。所以,即便哈希算法存在冲突,但是在有限的时间和资-源下,哈希算法还是被很难破解的。 对于加密知识点的补充,md5这个算法固然安全可靠,但网络上也有针对MD5中出现的彩虹表,最常见的思路是在密码后面添加一组盐码(salt), 比如可以使用md5(1234567.'2019@STARK-%$#-idje-789'),2019@STARK-%$#-idje-789 作为盐码起到了一定的保护和安全的作用。 唯一标识(uuid) 我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。

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

字符串哈希算法

经典字符串Hash函数 工作中经常需要用大hash这个强有力的工具,hash表最核心的部分则在于怎么设计一个好的hash函数,以使数据更均匀地分布在若干个桶上。下面来介绍一下我现在用到的一个hash函数,我们来看代码: unsigned chostcachehash::get_host_key(const string& host) { int result = 1; unsigned i = 0; for (i = 0; i > 24); h = h ^ g; } } return h; } openssl中出现的字符串hash函数 unsigned long lh_strhash(char *str) { int i,l; unsigned long ret=0; unsigned short *s;

加解密算法实验报告

实验加/解密算法 实验日期:__年__月_日实验成绩:___________ 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所示:

哈 希 常 见 算 法 及 原 理 ( 2 0 2 0 )

哈希算法乱谈(摘自知乎) 最近【现场实战追-女孩教-学】初步了解了Hash算法的相关知识,一些人的见解让我能够迅速的了解相对不熟悉的知识,故想摘录下来,【QQ】供以后温故而知新。 HASH【⒈】算法是密码学的基础,比较常用的有MD5和SHA,最重要的两【О】条性质,就是不可逆和无冲突。 所谓不【1】可逆,就是当你知道x的HASH值,无法求出x; 所谓无【б】冲突,就是当你知道x,无法求出一个y,使x与y的HA【9】SH值相同。 这两条性【⒌】质在数学上都是不成立的。因为一个函数必然可逆,且【2】由于HASH函数的值域有限,理论上会有无穷多个不同的原始值【6】,它们的hash值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资-源都做不到。 顺便说一下,王小云教授曾经成功制造出MD5的碰撞,即md5(a) = md5(b)。这样的碰撞只能随机生成,并不能根据一个已知的a求出b(即并没有破坏MD5的无冲突特性)。但这已经让他声名大噪了。 HASH算法的另外一个很广泛的用途,就是很多程序员都会使用的在数据库中保存用户密码的算法,通常不会直接保存用户密码(这样DBA就能看到用户密码啦,好危险啊),而是保存密码的HASH值,验

证的时候,用相同的HASH函数计算用户输入的密码得到计算HASH值然后比对数据库中存储的HASH值是否一致,从而完成验证。由于用户的密码的一样的可能性是很高的,防止DBA猜测用户密码,我们还会用一种俗称“撒盐”的过程,就是计算密码的HASH值之前,把密码和另外一个会比较发散的数据拼接,通常我们会用用户创建时间的毫秒部分。这样计算的HASH值不大会都是一样的,会很发散。最后,作为一个老程序员,我会把用户的HASH值保存好,然后把我自己密码的HASH值保存到数据库里面,然后用我自己的密码和其他用户的用户名去登录,然后再改回来解决我看不到用户密码而又要“偷窥”用户的需要。最大的好处是,数据库泄露后,得到用户数据库的黑客看着一大堆HASH值会翻白眼。 哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。 举个粒子,我写了一篇小说,摘要是一个string:'关于甲状腺精灵的奇妙冒险',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了我的文章,并发表为'关于JOJO的奇妙冒险',我可以立即发现我的文章被篡改过,因为根据'关于JOJO的奇妙冒险'计算出的摘要不同于原始文章的摘要。 可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡

数字签名实验的报告

数字签名实验报告 比较散列算法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)对于任何大小的数据,单向散列函数产生定长的信息摘要——定长性

实验三 MD5算法的设计与实现

实验三MD5算法的设计与实现 MD5算法及C++实现 一、理论部分: 1、预备知识 1.1什么是数据校验 通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 1.2最简单的检验 实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。 适用范围:简单的数据量极小的通讯。 应用例子:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。 1.3奇偶校验Parity Check 实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。 应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。 1.4 bcc异或校验法(block check character)

实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常 把她附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。 校验值计算的代码类似于: unsigned uCRC=0;//校验初始值 for(int i=0;i

哈希算法介绍

哈希算法简介

目录 1哈希算法概念 (2) 2哈希函数 (3) 3冲突的解决方法 (3) 4哈希算法应用 (4)

关键词: 算法、哈希、c语言 摘要: 哈希算法在软件开发和Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性。本文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解。

1哈希算法概念 哈希(hash 散列,音译为哈希) 算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。 哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希算法都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。 哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的项作为记录在表中的存储位置,这种表称为哈希表,所得存储位置称为哈希地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。 查找一般是对项的摸个部分(及数据成员)进行,这部分称为键(key )。例如,项可以由字符串作为键,附带一些数据成员。 理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组。 通常的习惯是让项从0到 TableSize-1之间变化。 将每个键映射到0到TableSize-1 这个范围中的某个数 ,并且将其放到适当的单元中,这个映射就称为散列函数(hash funciton )。 如右图,john 被散列到3,phil 被散列到4,dave 被散列到6,mary 被散列到7. 这是哈希的基本思想。剩下的问题则是要选择一个函数,决定当两个键散列到同一个值的时候(称为冲突),应该做什么。

实验四Hash算法和密码应用网络与信息安全实验报告

实验四Hash算法和密码应用 同组实验者实验日期成绩 练习一MD5算法 实验目的1理解Hash函数的计算原理和特点,2理解MD5算法原理 实验人数每组2人 系统环境Windows 网络环境交换网络结构 实验工具密码工具 实验类型验证型 一、实验原理 详见“信息安全实验平台”,“实验4”,“练习一”。 二、实验步骤 本练习主机A、B为一组,C、D为一组,E、F为一组。首先使用“快照X”恢复Windows 系统环境。 1.MD5生成文件摘要 (1)本机进入“密码工具”|“加密解密”|“MD5哈希函数”|“生成摘要”页签,在明文框中编辑文本内容: __________________________________________________________________________。 单击“生成摘要”按钮,生成文本摘要: __________________________________________________________________________。 单击“导出”按钮,将摘要导出到MD5共享文件夹(D:\Work\Encryption\MD5\)中,并通告同组主机获取摘要。 (2)单击“导入摘要”按钮,从同组主机的MD5共享文件夹中将摘要导入。 在文本框中输入同组主机编辑过的文本内容,单击“生成摘要”按钮,将新生成的摘要与导入的摘要进行比较,验证相同文本会产生相同的摘要。 (3)对同组主机编辑过的文本内容做很小的改动,再次生成摘要,与导入的摘要进行对比,验证MD5算法的抗修改性。 2.MD5算法 本机进入“密码工具”|“加密解密”|“MD5哈希函数”|“演示”页签,在明文输入区输入文本(文本不能超过48个字符),单击“开始演示”,查看各模块数据及算法流程。根据实验原理中对MD5算法的介绍,如果链接变量的值分别为(其中,M[1]=):A: 2B480E7C B: DAEAB5EF

几种字符串哈希HASH算法的性能比较

几种字符串哈希HASH算法的性能比较 2011年01月26日星期三 19:40 这不就是要找hash table的hash function吗? 1 概述 链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。 设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash 链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串 Hash函数在执行效率、离散性、空间利用率等方面的性能问题。 2 经典字符串Hash函数介绍 作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。 2.1 PHP中出现的字符串Hash函数 static unsigned long hashpjw(char *arKey, unsigned int nKeyLength) { unsigned long h = 0, g; char *arEnd=arKey+nKeyLength; while (arKey < arEnd) { h = (h << 4) + *arKey++; if ((g = (h & 0xF0000000))) { h = h ^ (g >> 24); h = h ^ g; } } return h; } 2.2 OpenSSL中出现的字符串Hash函数 unsigned long lh_strhash(char *str) { int i,l; unsigned long ret=0; unsigned short *s; if (str == NULL) return(0); l=(strlen(str)+1)/2; s=(unsigned short *)str; for (i=0; i ret^=(s[i]<<(i&0x0f)); return(ret);

哈希算法MD5

实验二哈希算法MD5 1、目的 使学生认识理解数据哈希算法:了解其基本原理,掌握MD5算法过程。 2、环境 PC 1 台、软件VC60、 3、方法和步骤 (1)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现MD5和MAC算法,//以姓名小写全拼为消息,求消息的Md5指纹值 如图1填充: 图2:4轮线性调用

图3:第i轮指纹参数变到第i+1轮指纹参数。 4、注意 实验报告画出MD5的流程图; 对MD5照指导书进行详细描述。 记录64次线性过程所变的局部32位指纹的值,及变量名;第一个参数被更新,循环右移一个参数后作为下次的4参数。 如: 1:a: D6D117B4 2:d: 344A8432

3:c: 2F6FBD72 4:b: 7AD956F2 … 64 b: C08226B3 以计算器为工具,手工验证,第1次和16,32,48,64次执行的a,b,c,d的计算过程。验证过程与比对过程写于报告之上。 思考题: 如果以姓名消息,以8位学号为密钥求MD5的HMAC值,共要做几次哈希,每次哈希分别调用了次”round”? 5、预备知识 1.理解MD5过程 Step 1: Padding M0 → M1 |M1| ≡ 448 mod 512 填充到512位的整数倍差64位。或者64字节整数倍差8个字节。 –Padding内容: 100 0 Step 2: Append 64-bit length 填充前长度(单位:bits)。 –若|M0| > 2^64,则仅取低64位。即|M|%2^64 –数据格式:低字节在前(little-endian)小端格式。 –|M2|为512的倍数: Y1,…,YL-1(L个分组) Step 3: 实始化指纹值(小端格式) (little-endian) ←CV0←IV ,I=1。, (ABCD) A = 01 23 45 67 (左边是内存状况,值形式:0x67452301) B = 89 AB CD EF (0xEFCDAB89) C = FE DC BA 98 (0x98BADCFE) D = 76 54 32 10 (0x10325476) =IV, CVi= HMD5(CVi-1,Pi) Step 4: MD5:压缩;CV 4-1 (a=A,b=B,c=C,d=D) 4-2:从消息左边选出第三1个512位的分组,将其分16个整数x[ 0-15]。连同a,b,c,d 指纹整数,移位数组s,常数数组ac,进行16位FF非线性变换。 F(x, y, z)=(((x) & (y)) | ((~x) & (z))) FF(a, b, c, d, x, s, ac) { (a)+= F ((b), (c), (d)) + (x) + (UINT4)(ac); (a)= ROTATE_LEFT ((a), (s)); (a)+= (b); } //第1轮S盒 #define S11 7 #define S12 12 #define S13 17 #define S14 22

相关文档