本发明涉及计算机技术领域,具体涉及一种哈希算法的实现方法及装置。
背景技术:
哈希算法是在加解密运算中非常重要的不可逆运算,受到各国密码管理机构的重视。这种算法的基本内涵是针对长度任意的message消息进行特定的运算,该运算最终将输出长度恒定的杂凑值。哈希算法的操作步骤是不需要保密。一旦输入有及其细微的变化,其输出的哈希值的改变也是非常彻底。哈希算法在密码学中具有重要的地位,被广泛应用在数字签名,消息认证,数据完整性检测等领域。
目前,常见的哈希算法包括有md5、sha、sm3;其中,sm3密码杂凑是中国商用密码杂凑标准(也称哈希,或者单向散列),其消息分组为512位,经过填充和迭代压缩,生成256位的杂凑值,国密sm3算法为国内商用密码应用中的数字签名和验证、消息验证码的生成和验证以及随机数的生成提供了强有力支撑;
哈希算法的实现通常需要经过填充、分组、扩展和压缩运算处理过程,然而,传统的硬件密码设备实现的哈希算法通常是实现算法的整个过程,输入任意字节的数据明文,输出固定长度的hash值,每次输入硬件密码设备的是全部的明文数据,必须等待所有的明文数据准备完成以后才能输入到硬件密码设备进行运算,导致哈希算法的运算速度降低,应用不灵活,因此如何设计一种哈希算法的实现方法,使得不需等待所有的明文数据准备完成就能输入硬件密码设备进行运算,提高哈希算法的运算速度,应用灵活是目前急需解决的问题。
技术实现要素:
本发明针对上述问题,有必要提供一种哈希算法的实现方法及装置,从而实现不需等待所有的明文数据准备完成就能输入硬件密码设备进行运算,提高哈希算法的运算速度,应用灵活。
本发明第一方面提出一种哈希算法的实现方法,包括:
初始化步骤:初始化iv向量为预设向量;
填充分组步骤:每获取到待运算的明文数据,即对待运算的明文数据进行消息填充和分组以获得分组消息;
扩展压缩步骤:对每个分组消息进行消息扩展生成扩展消息分组,再通过iv向量和每个所述扩展消息分组进行迭代压缩计算获得最终的hash值ivn;
设置硬件密码设备和外部模块;
在所述外部模块实现所述初始化步骤和所述填充分组步骤;
在硬件密码设备实现扩展压缩步骤。
基于上述,所述硬件密码设备至少为一个,多个硬件密码设备同时对多个明文数据进行计算。
基于上述,还包括保存输出步骤:通过所述外部模块保存最终的hash值ivn,并将最终的hash值ivn作为结果输出。
基于上述,对待运算的明文数据进行消息填充和分组的方法包括:
判断输入的明文数据长度是否是固定长度的整数倍分组数据;
若是,则对所述输入的明文数据以固定长度进行分组,并填充一个分组,得到分组消息;
若否,则对所述输入的明文数据使用算法填充规则填充至固定长度的整数倍,即填充一个或两个分组,得到分组消息。
基于上述,通过iv向量和每个所述扩展消息分组进行迭代压缩计算获得最终的hash值ivn的方法包括:
使用ivi向量依次对每个扩展消息分组进行迭代压缩计算后得到ivn,并将ivn作为最终的hash值;
其中,所述扩展消息分组的数量为n;ivi作为下一个所述扩展消息分组进行压缩计算的中间向量,向量中i的取值为0到n-1;iv0作为对第一个扩展消息分组进行压缩计算的初始向量;ivn作为对所有扩展消息分组进行压缩计算完成后获得的最终结果。
本发明第二方面提出一种哈希算法的实现装置,包括:硬件密码设备和外部模块,所述外部模块设置初始化单元、填充分组单元,所述硬件密码设备设置扩展单元和压缩单元;
所述初始化单元,用于初始化iv向量为预设向量,并传输至所述压缩单元进行处理;
所述填充分组单元,用于对每获取到的待运算的明文数据进行消息填充和分组后获得分组消息,并将每个所述分组消息传输至所述扩展单元进行处理;
所述扩展单元,用于将每个所述分组消息进行消息扩展后生成扩展消息分组;
所述压缩单元,用于通过iv向量和每个所述扩展消息分组进行迭代压缩计算后获得最终的hash值ivn。
基于上述,所述硬件密码设备至少为一个,多个硬件密码设备同时对多个明文数据进行计算。
基于上述,所述外部模块还包括存储输出单元,用于保存最终的hash值ivn和将最终的hash值ivn作为结果输出。
基于上述,对待运算的明文数据进行消息填充和分组的方法包括:
判断输入的明文数据长度是否是固定长度的整数倍分组数据;
若是,则对所述输入的明文数据以固定长度进行分组,并填充一个分组,得到分组消息;
若否,则对所述输入的明文数据使用算法填充规则填充至固定长度的整数倍,即填充一个或两个分组,得到分组消息。
基于上述,通过iv向量和每个所述扩展消息分组进行迭代压缩计算获得最终的hash值ivn的方法包括:
使用ivi向量依次对每个扩展消息分组进行迭代压缩计算后得到ivn,并将ivn作为最终的hash值;
其中,所述扩展消息分组的数量为n;ivi作为下一个所述扩展消息分组进行压缩计算的中间向量,向量中i的取值为0到n-1;iv0作为对第一个扩展消息分组进行压缩计算的初始向量;ivn作为对所有扩展消息分组进行压缩计算完成后获得的最终结果。
本发明具有突出的实质性特点和显著的进步,具体的说:
(1)本发明通过外部模块实现哈希算法的消息填充和分组,硬件密码设备实现哈希算法的消息扩展和迭代压缩。硬件密码设备的输入部分包括明文数据和iv向量,输出数据只有iv,且输出iv可作为下一次运算的输入iv。外部模块保存硬件密码设备输出的iv向量,硬件密码设备不保存记录运算结果的状态值。外部模块的填充和分组与硬件密码设备的扩展压缩为两个互不干扰过程,经二者的配合,能够保证输入的明文数据不需要全部准备好,就可以通过输入多次分组消息来完成哈希算法的实现,提高哈希算法的运算速度。
(2)本发明的硬件密码设备为多个且同时工作时,实现对多个明文数据同时进行运算,不用排队等待上一个外部模块的整个哈希计算完成,从而进一步提高哈希计算的速度,应用起来更加灵活。
本发明的附加方面和优点将在下面的描述部分中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1示出本发明另一种哈希算法的实现方法的流程图。
图2示出本发明哈希算法的具体实现流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,当一个组件被认为是“连接”另一个组件,它可以是直接连接到另一个组件或者可能同时存在居中组件。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。
实施例1
如图1所示,本实施例提出一种哈希算法的实现方法,包括:
初始化步骤:初始化iv向量为预设向量;
填充分组步骤:每获取到待运算的明文数据,即对待运算的明文数据进行消息填充和分组以获得分组消息;
扩展压缩步骤:对每个分组消息进行消息扩展生成扩展消息分组,再通过iv向量和每个所述扩展消息分组进行迭代压缩计算获得最终的hash值ivn;
保存输出步骤:保存最终的hash值ivn,并将最终的hash值ivn作为结果输出。
设置硬件密码设备和外部模块;
在所述外部模块实现所述初始化步骤和所述填充分组步骤;
在硬件密码设备实现扩展压缩步骤。
具体的,对待运算的明文数据进行消息填充和分组的方法包括:
判断输入的明文数据长度是否是固定长度的整数倍分组数据;
若是,则对所述输入的明文数据以固定长度进行分组,并填充一个分组,得到分组消息;
若否,则对所述输入的明文数据使用算法填充规则填充至固定长度的整数倍,即填充一个或两个分组,得到分组消息。
通过iv向量和每个所述扩展消息分组进行迭代压缩计算获得最终的hash值ivn的方法包括:
使用ivi向量依次对每个扩展消息分组进行迭代压缩计算后得到ivn,并将ivn作为最终的hash值;
其中,所述扩展消息分组的数量为n;ivi作为下一个所述扩展消息分组进行压缩计算的中间向量,向量中i的取值为0到n-1;iv0作为对第一个扩展消息分组进行压缩计算的初始向量;ivn作为对所有扩展消息分组进行压缩计算完成后获得的最终结果。本实施例中,对当前扩展消息分组进行压缩计算后获得的ivi作为下一个扩展消息分组进行压缩计算的中间向量。
需要说明的是,多个分组消息可以一次全部传输至用于实现扩展压缩步骤的设备,也可以等待上一个分组消息传输至用于实现扩展压缩步骤的设备进行消息扩展和压缩后,再传输下一个分组至用于实现扩展压缩步骤的设备。
在具体实现的过程中,输入的明文数据不需要一次全部准备好,可以分为多次来传输计算,而每一次计算输出的iv作为下一次计算的初始iv,直至所有数据计算完成。可以理解为:先将准备好的部分数据经过外部模块进行初始化iv和填充分组,再通过硬件密码设备进行扩展和迭代压缩后生成中间的iv(这个中间的iv也是多次迭代生成的,根据扩展消息分组的数量而言),返回至外部模块进行保存;再将后续准备好的数据通过外部模块进行填充分组,将中间的iv和此次分组数据传入硬件密码设备进行扩展和迭代压缩后生成最终的iv(最终的iv也是多次迭代,依据分组的数量),返回至外部模块进行保存和输出。当然可以不是两次就把数据准备好,可以是多次,重复上述过程。
本实施例所述的哈希算法的实现方法至少可以应用于实现md5、sha、sm3密码算法;所述整数倍分组数据的固定长度和所述迭代压缩计算后获得最终的hash值ivn的输出长度均根据哈希算法的类型而不同。
如图2所示,具体的,外部模块和硬件密码设备配合实现哈希算法的过程如下:
1)外部模块使用初始iv0初始化iv;
2)外部模块判断是否有整分组明文数据需要运算,如果有整分组的待运算的明文数据,则外部模块输入iv和整分组的待运算的明文数据至硬件密码设备;
硬件密码设备接收iv和整分组的待运算的明文数据后进行消息扩展和迭代压缩运算,得到新的iv,并返回至外部模块;外部模块使用ivn作为最终hash值。
3)如果不是整分组的待运算的明文数据,则外部模块填充明文数据至整分组,并输入iv和填充后的整分组明文数据至硬件密码设备;
硬件密码设备接收iv和整分组的待运算的明文数据后进行消息扩展和迭代压缩运算,得到新的iv为ivn。
4)硬件密码设备将ivn返回至外部模块,外部模块使用ivn作为最终hash值进行结果输出。
具体的,本实施例所述哈希算法的实现装置至少可以用于实现md5、sha、sm3密码算法;所述整数倍分组数据的固定长度和所述迭代压缩计算后获得最终的hash值ivn的输出长度均根据哈希算法的类型而不同。
以sm3哈希算法为例,实现过程包括预处理、消息扩展和计算hash值三部分。预处理部分由消息填充和消息分组两部分组成。首先将接收到的消息末尾填充一个“1”,再添加k个“0”,使得填充后的数据成为满足length=448mod512bit的数据长度,再在末尾附上64bit消息长度的二进制表示数,然后将消息分成512bit的子块,最后将每个512bit的消息子块扩展成132个字w0,w1,…,w67,w0′,w1′,…,w63′用于hash值的计算。
sm3算法的hash运算主要是在压缩函数部分,压缩函数共包含64轮,每轮包括12步运算,64轮循环计算结束后,再将计算结果与输入到本轮计算的初始数据进行异或运算,即上一次hash运算的hash值输出ivi与输入到本轮计算的初始数据异或得到本次hash值输出ivi+1。
本实施例的哈希算法的实现装置,硬件密码设备只实现了sm3算法的扩展和压缩,其余由外部模块实现。硬件密码设备的输入部分包括明文数据和iv向量,输出数据只有iv,且输出iv可作为下一次运算的输入iv。外部模块保存硬件密码设备输出的iv向量,硬件密码设备不保存记录运算结果的状态值。外部模块的填充和分组与硬件密码设备的扩展压缩为两个互不干扰过程,经二者的配合,能够保证输入的明文数据不需要全部准备好,就可以通过输入多次分组消息来完成哈希算法的实现。
本实施例中,多个分组消息可以一次全部传输至硬件密码设备,也可以等待上一个分组消息传输至硬件密码设备进行消息扩展和压缩后,再传输下一个分组至硬件密码设备。
特别的,硬件密码设备为多个且同时工作时,实现对多个明文数据同时进行运算,不用排队等待上一个外部模块的整个哈希计算完成,从而进一步提高哈希计算的速度,应用起来更加灵活。
本实施例中,所述外部模块至少包括软件程序、调用所述硬件密码设备的硬件处理设备,所述硬件设备包括单片机、arm、fpga;所述硬件密码设备至少包括密码卡、智能密码钥匙。
实施例2
本实施例提供一种哈希算法的实现装置,包括:初始化单元、填充分组单元、存储输出单元、扩展单元和压缩单元;
所述初始化单元,用于初始化iv向量为预设向量,并传输至所述压缩单元进行处理;
所述填充分组单元,用于对每获取到的待运算的明文数据进行消息填充和分组后获得分组消息,并将每个所述分组消息传输至所述扩展单元进行处理;
所述扩展单元,用于将每个所述分组消息进行消息扩展后生成扩展消息分组;
所述压缩单元,用于通过iv向量和每个所述扩展消息分组进行迭代压缩计算后获得最终的hash值ivn;
所述存储输出单元,用于保存最终的hash值ivn和将最终的hash值ivn作为结果输出。
需要说明的是,为描述的方便和简洁,上述描述的哈希算法的实现装置的具体实现方法,可以参考上述实施例1描述的方法,在此不再赘述。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围。