
点击上方蓝色文字一键关注我们吧
摘 要
为解决目前部队在导弹数据记录、存储中经常出现的数据篡改、描涂、字迹不清等问题,设计一种基于Hash函数的导弹数据数字化登记系统。介绍Hash函数验证数据完整性的原理,对比几种常用的Hash函数,介绍我国自主研发的SM3算法,对其实现效率进行改进,设计导弹数据完整性验证方案,并使用C#语言进行导弹数据数字化登记系统的开发。测试结果表明:该系统能有效检验数据是否完整,且具有可行性与可推广性。
来 源
《兵工自动化》2020年第5期《SM3算法在导弹数据数字化登记系统中的应用》
作者:丛林虎,方 轶
单位:海军航空大学岸防兵学院,山东 烟台 264001
引 用 格 式
丛林虎,方 轶. SM3算法在导弹数据数字化登记系统中的应用[J].兵工自动化,2020, 39(5):12-15.
欢迎引用,谢谢!
0 引言
导弹的各种数据是反映导弹状态、性能的重要依据,也是导弹履历的重要组成部分。目前部队采用的导弹数据记录、存储方式仍然是手工纸质记录、存储。在数据的记录过程中,该方式难免会因为各种原因出现后期描涂修改数据的情况,甚至丢失原始数据,降低数据的可信度,为后续数据的统计、分析等工作带来不便。判断数据是否被篡改,即验证数据完整性非常有必要。
Hash函数是一种能将任意长的消息构造成定长数据的函数,属于密码学3大类加密算法之一[1]。散列函数一般具有抗碰撞性和单向性,抗碰撞性又分为弱抗碰撞性和强抗碰撞性。弱抗碰撞性是指难以找到和该消息具有相同散列值的另外一条消息;强抗碰撞性是指难以找到散列值相同的2条不同消息;单向性是指无法通过散列值反推出该消息。由于Hash函数的特点,使其广泛应用于数据完整性检测、消息认证、数字签名、伪随机数生成和一次性口令等方面[2]。
笔者对我国国家密码管理局颁布的国密SM3散列函数进行了效率优化改进,并基于改进SM3算法设计数据完整性方案,最后使用C#语言对方案进行实现,开发了导弹数据数字化登记系统。
1 Hash函数
Hash函数是一类函数的统称,其中包含很多具体算法,如SHA-1、SHA-256、RIPEMD160、MD5、SM3、SHA-3等[3]。其中MD5算法和SHA-1算法的强抗碰撞性已经被攻破,证明其并不安全[4]。
目前被广泛使用的Hash算法都是迭代Hash算法[5]。迭代Hash函数的输入和输出都是比特串。一般比特串x的长度记为,比特串x和y的级联记为
。设
,构造过程一般分为3步:1) 用一个公开算法对任意长度的输入消息X进行填充,将填充后的比特串记为Y,满足
。2) 将Y分为长度为t比特的若干个分组,记为
,其中
。3) 按以下步骤一次处理每一个消息分组:
H0=IV; (1)
Hi+1=f(Hi,Yi) 0≤L-1。 (2)
其中:IV为初始链接变量(initial value);Hi为中间链接变量;f为压缩函数或轮函数。IV的取值必须在杂凑算法说明中定义。填充规则必须保证2个不同的消息经过填充预处理后仍然不同,通常将填充前输入消息的长度填充在最后。
2 SM3算法及其快速实现方案
2.1 SM3算法
SM3算法是我国国家密码管理局颁布的一种迭代Hash算法标准,其输入和输出都是比特串[6]。SM3算法的输出长度为256比特,消息分组为512比特,采用MD结构。对于长度小于264比特的消息X,SM3算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。具体算法描述[7]如下。
2.1.1 函数定义
SM3算法中定义了布尔函数FFj(X,Y,Z)、GGj(X,Y,Z)和置换函数P0(X,Y,Z)、P1(X,Y,Z),具体定义如下:
式中的X、Y、Z均为长度为32的比特串。
2.1.2 填充
对于一个长度为比特的消息,首先将比特“1”添加到消息的末尾,再添加k个“0”,其中k是满足
的最小非负整数,然后添加一个64位的长度
二进制比特串。经过填充后消息的长度就是512的倍数。
2.1.3 迭代压缩
将填充后的消息按每512比特的长度为一组进行分组,并对分组后的消息进行编号,得到,其中
。对分组后已填充消息进行如下方式的迭代:
V(i+1)=CF(V(i),B(i))
END FOR
其中:CF是压缩函数;V(0)是初始值IV,长度为256比特。最后一次迭代后的结果为V(n)。
2.1.4 消息扩展
将消息分组B(i)扩展,生成字用于CF函数。首先将消息分组B(i)划分为16个字
。根据以下方法扩展:

2.1.5 压缩函数
压缩函数的计算过程如下:
其中:A,B,C,D,E,F,G,H是中间变量;SS1,SS2,TT1,TT2是字寄存器,且字的存储方式为大端存储。最后输出的256比特杂凑值为y=ABCDEFGH。
2.2 SM3算法的快速实现方案
根据前文对SM3算法的描述,压缩函数主要过程是中间变量的赋值、移位运算以及寄存器中数据的读写,且使用多个中间变量与多个寄存器,读写寄存器中的数据占用了大量的运算时间。可以通过优化中间变量、减少对寄存器中的数据读写次数的方式来达到降低压缩函数运算时间的目的,使用此方法进行改进的同时也不会破坏原有压缩函数结构,保证了结果仍然可靠,同时在对消息进行扩展时也可以进行一些优化改进。具体改进策略如下:
1) 扩展时,原始SM3算法对消息直接进行121次扩展,使用122个中间变量Wj和进行存储,即进行了122次赋值,并用于之后的压缩函数中。这里可以将消息扩展合并至压缩函数中,在使用时进行消息的字扩展,可以免去许多次赋值操作。在前文SM3算法描述的基础上,消息扩展优化方案如下:首先将消息分组B(i)划分为16个字:W0,W1,…,W15,并将前4个字存储在中间变量W0,W1,W2,W3中,用于压缩函数的第一次计算。
2) 压缩函数中的SS1,SS2,TT1,TT2都是中间变量,因此,需要减少这些中间变量的使用。优化方案主要集中在压缩函数循环体的前4步操作中,剩余相同部分不再给出。同时结合消息扩展部分的优化方案,在前文SM3算法描述的基础上,压缩函数优化改进后的描述如下:
3) 使用Visual C#语言对原始SM3算法以及改进算法进行实现,运行环境为CPU Intel Core i7-6700HQ 2.60 GHz,Windows7 SP1,Visual Studio 2012。使用Stopwatch方法统计各种运算的耗时,统计结果及2种实现方式的效果对比如表1所示。
从表中可知:笔者提出的方案能有效提高SM3算法的执行效率,总耗时减少了约25%。
3 导弹数据数字化登记系统实现
3.1 导弹数据完整性验证方案设计
数据记录人员在导弹数据数字化登记系统上完成数据记录并提交后,系统自动调用笔者提出的改进SM3算法计算本次记录数据的Hash值,并存储于本地数据库中且不可更改。在对本次数据进行查询时,首先进行数据Hash值的验证,即重新计算查询数据的Hash值,并与之前提交数据时计算保存的Hash值进行比对[8]。根据Hash函数的特点,对同一组数据采用同一个Hash函数计算出的Hash值是相同的,如果比对结果相同,则说明该数据没有被修改过,是原始数据;否则说明该数据曾经被人修改,可以根据情况进行责任追究。具体方案如图1所示。
图1 导弹数据完整性验证方案
3.2 导弹数据数字化登记系统实现
使用Visual C#语言进行某型航空导弹业务数据数字化登记系统的开发,并应用基于笔者提出的改进SM3算法。开发完成后进行功能测试。如图2所示,完成数据登记后计算出Hash值。如图3所示,在查询时比对Hash值,并提示用户Hash值比对结果。
4 结束语
笔者提出一种基于Hash函数的数据完整性验证方案,基于改进的SM3算法,设计、实现了导弹数据数字化登记系统。功能试用结果表明:该系统能够完成数据完整性验证,并将验证结果告知用户。下一步,可将数字签名技术应用于该系统,在验证数据完整性的基础上明确数据来源,防止可能出现的代签名导致责任人不明、数据来源不明确等问题。
兵工自动化投稿网址

http://bgzdh.ijournals.com.cn/ch/author/login.aspx