|
基于SHA-256的HMAC文件校验器 HMAC即带密钥的HASH函数,用它产生的报文鉴别码(MAC)可以实现报文鉴别。这里我将其做成一个软件,用于对文件的合法性进行校验。以下我先简单介绍软件相关背景知识再介绍其代码实现。 一、背景知识简介 有时候进行通信的双方基于安全的考虑需要对对方发过来的消息进行校验,以确定消息是未经第三方修改过的。这种校验可以这样进行: *其中,生成校验码的算法一般采用HMAC,它保证了第三方在不知密钥的情况下,不可能在修改消息后可以同时修改校验码使之与修改后的消息匹配。 IV =作为HASH函数输入的初始值 M =HMAC的消息输入 Yi =M的第i个分组,0<=i<=(L-1) b =每一分组所含的位数 n =嵌入的HASH函数所产生的HASH码长 K =密钥 K+ =为使K为b位长而在K左边填充0后所得的结果 ipad =0x36重复b/8次的结果 opad =0x5c重复b/8次的结果 对于特定的HASH函数,b、n都是固定的,所以在程序的HMAC类中,n被定义为宏Mn,b被定义为Mb,值分别为32和64。由于该结构的效率较低,不利于实用化。于是有人提出了一个HMAC的高效实现方案。 for(i=0;i<Mb;i++) S[i]=sKeyplus[i]^ipad[i];m_sha256.Init(Mb);m_sha256.GenW(S,Mb);m_sha256.Steps();m_dwA1=m_sha256.OA;m_dwB1=m_sha256.OB;m_dwC1=m_sha256.OC;m_dwD1=m_sha256.OD;m_dwE1=m_sha256.OE;m_dwF1=m_sha256.OF;m_dwG1=m_sha256.OG;m_dwH1=m_sha256.OH;其实m_dwA1—m_dwH1就是第一个预计算的输出。这里因为这个输出有256位,于是我把它拆成了8个32位。同理,第二个预计算的输出为m_dwA2—m_dwH2。 此外,程序中关于文件拖放和文件保存打开的部分(包括串行化等)对于初学者来说都是一个不错的借鉴,当然高手就不需在意了。下面将给出一个例子使读者的认识感性化一点。 三、例子 我有一张非常重要的图片传给你,如下:
图三 例图 VeriFileimg3 在传这张图的同时附上它的校验文件“important.vri”。(该校验文件在源代码压缩包) 而你收到的图片如下:(它在传送中在8,46处被非法的第三方修改了一个象素) 图四 例图VeriFileimg4 你用该软件对其进行校验可以如下操作:
由源文件生成校验文件的操作也很简单,从菜单‘校验文件-生成校验文件’中选中你的源文件,然后在弹出的对话框中输入密钥就可以了。提醒一下,密钥最大有效长度为16字节,中英文不限。生成的校验文件都自动以vri为后缀名。 |