Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270231
  • 博文数量: 953
  • 博客积分: 52320
  • 博客等级: 大将
  • 技术积分: 13090
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 13:42
文章分类

全部博文(953)

文章存档

2011年(1)

2008年(952)

我的朋友

分类: C/C++

2008-08-05 13:59:56

下载本文示例代码
 *其中,生成校验码的算法一般采用HMAC,它保证了第三方在不知密钥的情况下,不可能在修改消息后可以同时修改校验码使之与修改后的消息匹配。
 *在整个过程中消息是公开的(未经加密的),算法只提供消息的完整性校验而不提供保密性,保密性可由公钥加密算法现实,这里不作讨论。

二、软件的实现
  我做的该软件是可以对电脑磁盘上的任意一文件生成一校验文件.vri(密钥由用户自己输入),根据该校验文件可以在需要之时对相应的文件进行校验。具体做法将在后面的例子中给出。
  程序中的HMAC算法的HASH函数我采用的是SHA-256算法,它比起MD5和SHA-1来要安全。(其实因为不是正式的安全产品,所以在本程序中采用MD5或SHA-1也未尝不可)。

*HMAC的结构如下图所示:


图一 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的高效实现方案。

*HMAC的有效实现方案如下:


图二 HMAC的有效实现方案

其中的HASH即为SHA-256。

图中左边所示为预计算,右边为对每条消息的计算。在密钥不变的情况下只需进行一次预计算,以后在产生校验码时就只用到右边的计算了。这样就可以提高效率。
  需要说明的是,大家在阅读我写的HMAC的类可能会发现,在每次计算时都进行了左右两边的计算(不论密钥怎样)。这是因为我考虑到个人用户可能会不时地对密钥进行更换,并且应用场合也不对效率有特别的要求。当然这样做并没有体现出HMAC有效实现方案的优点。
  另外还有一点就是我对密钥的填充是填充的低位,即密钥右边,这和上述方案有不同(方案上说是要填充在高位,即左边),在此说明,以使大家在看源代码的时候不至于疑惑。
  以上有效实现方案在HMac类中现实,HASH函数sha-256在Sha256类中实现。由于这里主要说的是HMAC,sha-256只是作为一个黑盒子,所以不多解释。
  程序中的Mac类与HAMC和HASH函数都无关,只是一个存放结果的介质,它甚至都没有成员函数,我也在考虑是不是可以不把它做成一个类。

为了便于读者阅读HMac类中的各变量基本上采用图二中的各标识符标识。

对于下面一段代码读者可能会有疑惑,明明是该得到第一个预计算的结果,m_dwA1—m_dwH1是什么呢?

for(i=0;i
  其实m_dwA1—m_dwH1就是第一个预计算的输出。这里因为这个输出有256位,于是我把它拆成了8个32位。同理,第二个预计算的输出为m_dwA2—m_dwH2。
  此外,程序中关于文件拖放和文件保存打开的部分(包括串行化等)对于初学者来说都是一个不错的借鉴,当然高手就不需在意了。下面将给出一个例子使读者的认识感性化一点。

三、例子

我有一张非常重要的图片传给你,如下:


图三 例图 VeriFileimg3

在传这张图的同时附上它的校验文件“important.vri”。(该校验文件在源代码压缩包)

而你收到的图片如下:(它在传送中在8,46处被非法的第三方修改了一个象素)


图四 例图VeriFileimg4

你用该软件对其进行校验可以如下操作:
  1. 运行该软件,打开important.vri(打开方式有两种,你可以从菜单‘文件-打开’中打开,也可以直接把文件拖进程序窗口中。)
    (第一次运行该软件后,程序会创建一个对vri文件的关联,以后打开vri文件就能以双击vri文件打开了。);
  2. 将要校验的文件拖入程序窗口中,在弹出的对话框中选否;或者是从菜单‘校验文件-验证源文件’中打开;
  3. 然后程序要求输入校验密钥,这里你和我约定的密钥为gamsn,也就是输入gamsn;
  4. 程序会计算源文件的校验码值,并告诉你结果;

  由源文件生成校验文件的操作也很简单,从菜单‘校验文件-生成校验文件’中选中你的源文件,然后在弹出的对话框中输入密钥就可以了。提醒一下,密钥最大有效长度为16字节,中英文不限。生成的校验文件都自动以vri为后缀名。

四、结束语

大概情况就是如此,大家有什么问题或指正可以与我联系,谢谢!

  另外如果诸君对HASH函数感兴趣的话可以参考 William Stallings 的 Cryptography and Network Security Principles and Practices 一书第三版。该书不是编程方面的指南,而是密码与网安方面的专业教材。它的中文版也译得不错,是一本好书。 下载本文示例代码

阅读(212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~