1、l 第 1章 密码学概述 l 第 2章 古典密码技术 l 第 3章 分组密码l 第 4章 公钥密码体制 l 第 5章 散列函数与消息鉴别 l 第 6章 数字签名技术 l 第 7章 密钥管理技术l 第 8章 身份鉴别技术 l 第 9章 序列密码 l 第 10章 密码技术应用课程主要内容2/27第 5章 散列函数与消息鉴别本章主要内容 散列函数的概念 散列函数的构造与设计 安全散列算法 SHA 对散列函数的攻击 消息鉴别 3/27第 5章 散列函数与消息鉴别5.1 散列函数的概念 密码学中的散列函数又称为哈希函数( Hash函数)、杂凑函数,它是一种单向密码体制,是一个从明文到密文的不可逆映射,只
2、有加密过程,不能解密。 l 散列函数的性质设散列函数为 h(m),具有以下基本特性:( 1) h(m)算法公开,不需要密钥。( 2)具有数据压缩功能,可将任意长度的输入数据转换成一个固定长度的输出。( 3)对任何给定的 m, h(m)易于计算。散列函数必须满足以下安全性要求:( 1)具有单向性。给定消息的散列值 h(m),要得到消息 m在计算上不可行;( 2)具有弱抗碰撞性( Weak collision resistance)。对任何给定的消息 m,寻找与 m不同的消息 m ,使得它们的散列值相同,即h(m) h (m),在计算上不可行。 ( 3)具有强抗碰撞性( Strong collis
3、ion resistance) 。寻找任意两个不同的消息 m和 m , 使得 h(m) h (m) 在计算上不可行。4/27第 5章 散列函数与消息鉴别 散列函数的应用散列函数的主要应用有以下三个方面:1)保证数据的完整性2)单向数据加密3)数字签名应用散列函数实现数据完整性保护的模型: 注:实际应用中,未必一定是如 h(mk)的计算方式,明文与密钥 k的组合方式因不同的实现可以不同。 5/27第 5章 散列函数与消息鉴别算法中重复使用一个函数 f 。函数 f的输入有两项,一项是上一轮(第 i-1轮)的输出 CVi-1,称为链接变量,另一项是算法在本轮(第 i轮) b位的输入分组 mi。 5.
4、2 散列函数的构造与设计 l 迭代型散列函数的一般结构整个散列函数的逻辑关系可表示为:CV0 =IV;CVi = f( CVi-1, mi); 1 i t; h( M) = CVt6/27第 5章 散列函数与消息鉴别虽然在合理的假设下,可以证明这类散列函数是安全的,由于它的计算效率太低,所以这一类散列函数并没有什么实用价值。 散列函数的基本设计方法有:基于公开密钥密码算法的设计、基于对称分组密码算法的设计以及直接设计法。1.基于公开密钥密码算法设计散列函数 散列函数的设计方法以 CBC模式利用公开密钥算法,使用公钥 PK以及初始变量 IV对消息分组进行加密,并输出最后一个密文分组 ct作为散列
5、函数输出值,如图 5.3所示。7/27第 5章 散列函数与消息鉴别基于分组密码的 CBC工作模式和 CFB工作模式的散列函数中,密钥 k不能公开。如果密钥 k公开,则会使得攻击者构造消息碰撞十分容易。 通常,可以使用对称密钥分组密码算法的 CBC模式或 CFB模式来产生散列值,如图 5.4、图 5.5所示。 2.基于对称分组密码算法设计散列函数8/27第 5章 散列函数与消息鉴别3.直接设计散列函数这类散列函数并不基于任何假设和密码体制,它是通过直接构造复杂的非线性关系达到单向性要求来设计单向散列函数。这类散列算法典型的有: MD2、 MD4、 MD5、 SHA-1等算法。5.3 安全散列算法
6、 SHA 1. SHA-1SHA-1是数字签名标准 DSS( Digtial Signature Standard)中使用的散列算法。它能够处理最大长度为 264位的输入数据,输出为 160位的散列函数值, SHA-1的输出正好适合作为数字签名算法 DSA( Digtial Signature Algorithm)的输入。 .基本操作和元素 :(1)逐位逻辑运算(2) 加法运算(3) 移位操作9/27第 5章 散列函数与消息鉴别(1) 消息分割与填充(2) 初始化缓冲区(3) 处理第 i个数据块 xi(4) 4轮循环, 80步操作完成后, 保存散列中间结果,再与第一轮的输入相加(模 232)
7、(5) 然后,以 H0(i) , H1(i) , H2(i) , H3(i) , H4(i)作为寄存器初值,用于对分组 xi+1进行散列处理。SHA-1压缩函数操作过程,如图 5.9所示 (下页 ),是处理一个 512位分组的 4次循环中每一循环的基本压缩操作流程。 .SHA的散列过程 .SHA-1的压缩操作. 示例【 例 5.1】 计算字符串 “ abc” 的 SHA-1散列值。字符串 “ abc” 的二进制表示为: 01100001 01100010 01100011,共有 24位的长度。按照 SHA-1的填充要求,应该填充一个 “ 1”( 界符 )和 423个 “ 0” ,最后有两个字 “ 00000000 00000018”( 十六进制 ),表明原始消息的长度为 24位。本例中共只有一个分组。10/27第 5章 散列函数与消息鉴别