消息认证码的原理与实现

老牛浏览 724评论 0发表于

1. 简介

在信息安全领域中,常见的信息保护手段大致可以分为保密和认证两大类。目前的认证技术有对用户的认证和对消息的认证两种方式。用户认证用于鉴别用户的身份是否是合法用户;消息认证就是验证所收到的消息确实是来自真实的发送方且未被修改的消息,也可以验证消息的顺序和及时性。

消息认证实际上是对消息本身产生的一个冗余的信息 —— MAC(消息认证码),消息认证码是利用密钥对要认证的消息产生新的数据块并对数据块加密生成的。它对于要保护的信息来说是唯一和一一对应的。因此可以有效的保护消息的完整性,以及实现发送方消息的不可抵赖和不能伪造。

消息认证码的安全性取决于两点:

  1. 采用的加密算法,所谓的数字签名。即利用公钥加密算法(不对称密钥)对块加密,以保证消息的不可抵赖和完整性。

  2. 待加密数据块的生成方法,本文讨论以数据块生成方法为主。

2. 消息认证码

实现消息认证码可以有多重途径,本文提出了校验码方案,并讨论和实现了消息摘要方案。校验码是数据通信中经常用到的差错控制手段,稍加扩充实际上也可以作为认证码。消息摘要方案是利用目前广泛应用的单向散列函数(Hash 函数)生成 Hash 值来作为认证码。

2.1 校验码方案

校验码是差错控制中的检错方法,数据通信中的噪声使得传输的比特值改变,用校验码可以检测出来,同样道理,一些人为造成的比特值的改变,使用差错控制也是可以检测的。其实现方案是将校验码作为应用层的数据传输,在消息发送时,使用选定的校验码方案对将要发送的消息产生冗余的码值,对该码值加密处理并随消息一并发送,接收方对数据先解密后校验。如果解密的码值和产生的码值一致,则可以证实该消息来自可信赖的发送方,且未被修改。一旦消息被中途截获并篡改,那么消息与解密的校验码就不能一一对应。

通常使用的校验码方案有奇偶校验、循环冗余校验、行列冗余校验,它们产生冗余码的方式不一样,其冗余码长度随着消息长度改变而改变。加密的方法基本上有对称和非对称之分,主流加密方法有 DES、AES 和 RSA 等。将校验码用于消息认证有实现简单、检测能力强的特点,同时由于它的不定长特点为穷举攻击带来了一定的难度,可以适用于抗弱碰撞的环境。

2.2 消息摘要方案

消息摘要方案利用单向散列函数将任意长度的消息全文作为输入,将压缩到某一固定长度的哈希值即消息摘要,或称为“数字指纹”作为输出,因此被称为消息摘要。这种消息认证码方案已广泛应用于数字签名,虚拟专网等。作为消息认证码的一种变形,消息摘要的运算过程不需要加密算法的参与,其实现的关键是所采用的单向散列函数是否有良好的抗碰撞性。Hash 函数值是所有消息位的函数,具有错误检测的能力,经过函数处理,原始信息即使只更改一个字母,对应的压缩信息也会变为截然不同的摘要,这就保证了经过处理信息的唯一性,为电子商务等提供了数字认证的可能。

Hash 函数值可由如下形式的函数表示:h = H (M)

现在的通用算法有 MD5, SHA1, SHA-256等。基本过程是对消息原文分组,附加填充位,附加长度,然后以 512 位数据块位单位处理消息,用压缩函数模块进行 4 次循环,每次循环包括多个处理步骤并且每次循环的函数都不一样,最后才生成消息摘要。它们的区别在于计算过程中使用的填充方法、基本函数、初始向量和运算步数的不同。

3. 消息摘要实现

基于运算速度,安全性和强碰撞性的考虑,对现用的方法简化,其具体实现步骤如下:

  1. 预处理;将消息划分为 512 位的分组,最后一个分组补以填充位,该填充位是以 1 开头,后面为 0 的比特值。

  2. 初始化 4 个链接向量,该链接向量将存放在寄存器中,因此可以加快运算速度。

  3. 进入主循环,循环次数为消息长度除以 512,便于每次循环处理一个 512 位的值,每轮循环大致有 3 个阶段,循环输入是当前处理的分组和链接向量。

    • 第一阶段:初始变量拷贝到中间变量。

    • 第二阶段:分 4 轮实现,每一轮取 4 个变量中的 3 个进行异或操作,操作结果与分组相加并循环移位。

    • 第三阶段:生成结果更新中间变量。

  4. 散列值生成,处理完以后,更新后的向量级联即成为 hash 值输出。

本消息摘要的实现能够体现出该 hash 函数的特点:

  • 雪崩效应:明文的改变导致散列值的巨大改变。

  • 单向性:由散列值得到消息这一操作是不可能的。

  • 运算速度快。

4. 安全性分析

消息认证不支持可逆性,是多对一的函数,其定义域由任意长的消息组成,而值域则是由远小于消息长度的比特值构成,从理论上说,一定存在不同的消息产生相同的冗余数据块。因此必须要找到一种足够单向和强碰撞自由性的方法对消息认证才是安全的。

首先,利用校验码加密的方式构造认证码,它可以实现数据完整性,它对消息不可抵赖不可伪造性的认证性能取决于加密的函数。因此这种方法的安全性取决于校验码的长度和加密的方法。但是由于它是针对局部变量的校验,比如针对一行或者一列,它的抗碰撞性能不是很好,即有可能产生消息被改动,认证码仍然没有变动的情况。

其次,对于用单向散列函数构造认证码的方式来说,安全性是基于该函数的抗强碰撞的,即攻击主要目标是找到一对或者更多对碰撞消息,该消息生成摘要是相同的。

5. 结束语

消息认证技术可以防止数据的伪造和被篡改,以及证实消息来源的有效性,已广泛应用于信息网络。随着密码技术与计算机技术能力的提高,消息认证码的实现方法也在不断的改进和更新之中,多重实现方式会为更安全的消息认证码提供保障。

点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于