基于路径散列的消息摘要方法和系统
技术领域
本发明主要涉及到信息安全和信息标识领域,实现一种基于路径散列的消息摘要的方法和系统。
背景技术
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密。著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体,中国国家密码管理局编制的SM3。
消息摘要算法具有不可逆性,其主要功能有数据签名、数据完整性校验等。常见的消息摘要算法有:
Cyclical Redundancy Check,循环冗余校验。现在应用最多的就是CRC32算法,它产生一个4字节(32位)的校验值,一般是以8位十六进制数,如FA 12CD 45等。CRC算法的优点在于简便、速度快,严格的来说,CRC更应该被称为数据校验算法,但其功能与消息摘要算法类似,因此也作为测试的可选算法。
Adler-32是Mark Adler发明的校验和算法,和32位CRC校验算法一样,都是保护数据防止意外更改的算法,但是这个算法较容易被伪造,所以是不安全的保护措施。但是比CRC好点的是,它计算得很快。这个算法那是从Fletcher校验和算法中修改过来的,原始的算法形式略快,但是可依赖性并不高。
Message-Digest Algorithm 5,消息摘要算法版本5。由Ron Rivest(RSA公司)在1992年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。
SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构——美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来消息摘要算法的发展方向。目前SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。
中国国家密码管理局编制的SM3适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成,此算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。
消息摘要的主要特点有:
无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。一般认为,摘要的最终输出越长,该摘要算法就越安全。
消息摘要是伪随机的。不同的输入会有不同的输出,而且输出的摘要消息可以通过随机性检验。用相同的算法对相同的消息求两次摘要,其结果必然相同。
一般只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。这正是好的消息摘要算法所具有的性质:输入改变了,输出也就改变了;两条相似的消息的摘要确不相近,甚至会大相径庭。
消息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。
好的摘要算法,没有人能从中找到“碰撞”,虽然“碰撞”是肯定存在的。即对于给定的一个摘要,不可能找到一条信息使其摘要正好是给定的。即无法找到两条消息,使它们的摘要相同。
事实上,2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto’2004)安排了三场关于杂凑函数的特别报告。在国际著名密码学家Eli Biham和Antoine Joux相继做了对SHA-1的分析与给出SHA-O的一个碰撞之后,来自山东大学的王小云教授做了破译MD5、HAVAL-128、MD4和RIPEMD算法的报告。2009年谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。
本发明公开基于路径散列的消息摘要方法和系统实现通过信息分组、路径散列计算、结果序列调和散列,结合输出字符串的设定,从而输出的消息摘要。该方法可以扩展和衍生不同的摘要算法,不同的分组,不同的变换序列,不同的路径选择算法,不同的散列算法均可以产生不同的消息摘要。基于路径散列的消息摘要算法和分组的位数关联,例如6bit分组,表示摘要信息的最小存储单元为0到2的6次方减一,即0到63,对应的消息摘要大小为64个6bit的单元组成,构成的消息摘要为384位,设定64个字符代表0到63个单元,输出的消息摘要为64个字符。
发明内容
本发明公开一种基于路径散列的消息摘要方法和系统,消息经过分组,对分组序列进行路径散列计算,循环计算完毕,对消息摘要结果再进行调和路径散列计算,消息摘要计算的结果通过字符串形式输出。分组有利于大容量的信息的处理,消息分组结合路径散列算法,使得运算的结果不可逆。
基于路径散列的消息摘要方法和系统主要包括:消息摘要和路径规划方法;分组,分组散列,调和散列算法和摘要的字符串输出等系统。
消息摘要包括:摘要的长度,摘要的存储单元的大小。消息摘要的描述为S[i],i从0到2的k次方减一。假定信息分组的bit数定义k,S[i]的值小于2的k次方减一。
变换序列,变换序列的大小等于消息摘要的大小,单元值为0到2的k次方减一,每个单元选取的值不同。
路径规划包括:分组散列路径规划,调合散列的路径规划。
分组散列路径规划:散列路径选择,主要约束条件包括分组序号、该序号对应变换序列的路径和路径深度;再散列路径选择,在前一次的基础之上,考虑分组信息对应值,构成扰动散列路径。
调合散列是对分组散列结果再散列的过程。该散列计算的路径规划,同样也需要规划路径深度,路径算法等。
散列计算单元主要包括:分组信息,对应路径节点变换序列的值,对应路径节点消息摘要结果的值。
消息的分组是算法的初始环节,满足消息摘要规划的要求,对消息按bit位进行分组。计算机输入的字符的最小单元为字符型,字符型占位为8个bit,假定摘要存储单元的大小为k个bit,则分组规则如下:
分组数为h,选取的字符个数为g,则有g*8=h*k。分组每次选取g个字符,分组后产生h个k bit的单元;分组序列定义为Di[h],i表示输入序列的第i个分组。
分组计算通过位运算进行,输入信息按消息摘要存储单元bit的要求,依次选取放入分组序列。对消息进行分组的方式有多种,主要取决于选取消息的步长的设定:
等分分组。每h个字符为一组,步长为h;
渐进分组。每h个字符为一组,步长为1;
等差分组。每h个字符为一组,步长小于h,大于0;
其它分组。每h个字符为一组,步长由给定规则设定,步长小于h,大于0。
消息摘要的算法从分组开始,分组后对分组的信息进行分组散列计算。假定分组的数组为Di[j],其中j为0到h-1,对分组数组进行散列计算。计算步骤如下:
循环从0到h-1;
一次散列计算,散列计算按路径选择策略结合散列算法实施。
路径规划。假定变换序列为R,k为分组信息的位数,R含有2的k次方个单元,元素取值范围为0到2的k次方减一;
循环设定。设定循环的次数,假定为p次,p为路径深度;
分组散列计算。分组信息Di[h],对h进行循环运算。
分组一次散列的路径规划方法有:
直接方法。第一步选取R[i]单元,即对应消息摘要S[R[i]]。定义Pt=R[i];下一步选取R[Pt]单元,即S[R[Pt]],设定Pt=R[Pt];依次选取,直到p次循环结束。
规则路径选择。定义规则F(i),表示第i步的选取,消息摘要选择S[F(i)],设定Pt=F(i);下一步选取F(Pt),消息摘要选择S[F(Pt)],设定Pt=F(Pt);依次选取,直到p次循环结束。
散列计算,计算的结果存入消息摘要存储序列S。散列计算的方法如下:
二元散列计算。输入的信息的单元Di[h],位于选择节点的消息摘要单元S[i];
多元散列计算。从输入信息单元Di和消息摘要S序列中按规则选取n个参与计算。
计算公式的选取。选取计算的方法,对参与计算的单元进行计算。
二次散列计算。路径规划中增加可变单元Di[h]。
分组二次散列的路径规划方法有:
直接方法。第一步选取消息摘要的R[Di[h]]单元,定义Pt=R[Di[h]];下一步选取R[Pt]单元,设定p=R[Pt];依次选取,直到p次循环结束。
规则路径选择。定义规则Rf(i,Di[h]),表示第i步的选取,设定Pt=Rf(i,Di[h]);下一步选取Pt=R[Pt];依次选取,直到p次循环结束。
散列计算,计算的结果存入消息摘要存储序列。散列计算的方法如下:
二元散列计算。变换序列R[i],S[i];
多元散列计算。从R和S中按规则选取n个参与计算。
计算公式的选取。选取计算的方法,对参与计算的单元进行计算。
分组计算结束,进行调和散列计算。
调和散列计算主要的方法:
简单的线性调和。设定规则选取多个元素,线性调和计算即可;
路径线性调和。按变换序列选取多个元素,线性调和计算即可。
消息摘要序列的字符串输出,定义字符串表示,定义2的k次方个字符表示Ch[n],其中n表示为0到2的k次方减一;S[i]的消息摘要输出为Ch[S[i]],其中i表示为0到2的k次方减一。
基于路径散列的消息摘要方法和系统,经过分组、分组散列、调和散列到摘要的字符串表示,实现了不可逆的消息摘要的生成方法。
附图说明
图1基于路径散列的消息摘要的系统流程
图2路径散列计算的示意图
具体实施方式
下面结合附图和具体实施方式对本发明进行详细说明。附图1给出基于路径散列计算的系统流程,包括:消息分组,分组散列,调和散列和消息摘要字符串输出等环节。
本发明实施步骤如下:
首先为基本的设定,主要包括:消息摘要设定,变换序列设定,输出字符串设定,路径计算函数设定;
消息摘要的特征设定。消息摘要S[i],i=0到n-1,其中n为数组的大小,元素的值S[i]大于0,小于n-1,要求n为2的整数次幂,可选n等于2的k次方。
设定变换序列,R[i],i=0到n-1,其中n为数组的大小,元素的值R[i]大于0,小于n-1,要求每个元素需要取不同的值,n等于2的k次方。
输出字符串的设定。定义字符串Ch,字符串长度为2的k次方,Ch[i],i为0到2的k次方减一,用不同的字符表示;
路径散列计算方法是系统的核心,附图2给出路径散列的示意图。主要包括路径规划,选取计算单元,选择散列算法。路径规划包括变换序列,路径选择算法,路径深度的设定。
路径函数定义。F(i),i为0到2的k次方减一,简单的路径函数F(i)=R[F(i-1)]。
再散列路径选择。Rf[i,Di[h]],i为0到2的k次方减一;简单的路径函数Rf[i]=R[Rf(i-1,Di-1[h])],i为分组信息的序号,即第i个分组;h为分组信息Di[h]中的第h元素;Rf为i和Di[h]的函数。
消息分组主要包括:分组的位数,和消息选取的步长。选取的步长大于等于1,不大于分组要求选取字符个数的要求。
消息进行分组的方式有多种,分组大小为h,k为分组位数,选取的字符个数为g,主要取决于选取消息的步长的设定:
等分分组。每g个字符为一组,步长为g;
渐进分组。每g个字符为一组,步长为1;
等差分组。每g个字符为一组,步长小于g,大于0;
其它分组。每g个字符为一组,步长由给定规则设定,步长小于g,大于0。
分组大小计算,分组大小为h,选取的字符个数为g,则有g*8=k*h,分组序列定义为Di[h],i表示输入序列的第i个分组。
信息分组规则。从原始信息中按位选取g位,变换为h个k位组成一组。
散列结果存储序列S[i],i=0到n-1;其中n为数组的大小,n等于2的k次方。定义参照变换序列,初始化值等于变换序列。S[i]为消息摘要序列。
分组散列;整个循环为分组信息的大小,循环h次。循环内一般进行两次散列计算。
散列,按路径算法选择参与计算的值S[F(i)],Di[h],假定路径函数为F(i),路径深度为p,算法为H(S[i],Di[h]),则下列计算循环p次;
Pt=F(i),S[Pt]=H(S[Pt],DPt[h]);
选择下一步路径,F(i+1)=R[F(i)],即Pt=R[Pt],重复上一步计算,直到满足循环条件即可。
再散列。按路径算法选择参与计算的值Rf(i,Di[h]),路径深度为p,算法为H(S[i],R[i]),则下列计算循环p次:
Pt=Rf(i,Di[h]),S[Pt]=H(S[Pt],R[Pt]);
选择下一步路径,Pt=R[Pt],重复上一步计算,直到满足循环条件即可。
摘要调和散列;定义输出序列为O[i],大小等于摘要序列的大小,摘要序列为S[i],则有:
调和计算单元为S[i]和O[i];
赋初值,O[i]=S[i],计算路径选择,定义计算路径深度为p,算法为H(O[i],S[Pt]),则循环p次:
Pt=F(i),O[i]=H(O[i],S[Pt]);
选择下一步路径,Pt=R[Pt],重复上一步计算,直到满足循环条件即可。
把O[i]复制到S[i]。
结果输出。定义字符串表示,k位分组对应0到2的k次方减一,定义2的k次方个字符表示,Ch[n],其中n表示为0到2的k次方减一;S[i]的消息摘要输出为Ch[S[i]],其中i表示为0到2的次方减一。
以上是基于路径散列的消息摘要方法和系统实施。
结合该方法下面给出6位分组,摘要序列为384位的基于路径散列的消息摘要方法的实例,实例命名zy6。
6位分组384消息摘要算法,提供384位的消息摘要。
本实例选取的变换序列。R[64]={63,0,34,17,58,23,16,2,59,55,56,7,47,61,8,4,8,25,48,3,37,41,1,32,39,57,33,30,18,45,14,28,5,60,5,40,43,53,10,20,49,35,62,31,6,24,22,26,6,29,36,9,11,52,44,13,27,54,19,50,51,12,42,21},并用变换序列初始化摘要序列S[64];
分组算法。确定分组方案,以三个字符为一组,即c[3],每个字符占8位;变换为D[4],每个D[i]占6位,共四个。即c[0]取前6位赋值给D[0];剩下的两位结合c[1]的前四位给D[1];c[1]剩下的四位结合c[2]的前两位复制给D[2];c[2]剩下的6位赋值给D[3]。
简单的描述,即三个8位的结合在一起为24位,按6位分割形成D[4]。
分组选择循环。对原始的信息按每字符循环,首先选取0,1,2;定义选取的步长为1,则下一步选取1,2,3;以此类推。不足位用分组序号i加上组序号h,对64取余填充。即(i+h)%64;i为原始信息的选取顺序,h为D的序号。
分组散列计算。第一层循环为4,循环变量为h,h从0到3,对D[4]进行逐个计算;
如果D[h]大于0,则进行散列计算;
第一次散列,路径深度为4,i为分组序号,h为分组信息序号。则路径Pt有:
初始化Pt=(64-((i+h)%64))%64;
计算赋值。S[Pt]=(S[Pt]+D[h])%64;
路径计算。Pt=R[Pt];
循环四次,完成第一次散列。
再散列。路径深度为4;初始路径为Pt=(Pt+D[h])%64,Pt为一次散列后的路径;
计算赋值。S[Pt]=(S[Pt]+R[Pt])%64;
路径计算。Pt=R[Pt]。
循环四次,完成再散列。
第i分组计算完毕,重复分组选择循环直到所有的信息参与分组散列计算完毕。
调合散列。循环次数64,步长为1,从0到63;
初始化,路径Pt=i;中间结果定义为O[i],O[i]=S[i];
散列计算,循环变量为j,j从0到3,步长为1;
计算O[i]=(O[i]+S[(Pt+j*9)%64])%64;
路径计算。Pt=R[Pt];
计算。O[i]=O[i]%64;
直到调和散列循环结束。
O[i]赋值给S[i],即S[i]=O[i]。
6位分组384消息摘要结果为S[i]。
以下为摘要字符串输出:
定义输出字符串为:
Ch[64]=”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ=-”;
摘要字符串输出为Ch[S[i]],i从0到63,字符串长度为64。
以下为摘要字符串十六进制输出:
定义输出字符串为:
Ch[16]=”0123456789abcdef”;
摘要字符串输出为Ch[S[i]],i从0到63。
S[i]转换的W[i],即64个6位数组,转换为48个8位数组;
W[i]高4位Wh[i],低位为Wl[i],输出字符串为Ch[Wh[i]]加上Ch[Wl[i]];
遍历W[i],最后生成96个字符串。