【网络安全基础】第三章---公钥密码和消息认证

发布于:2025-07-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

仅供参考


一、引言

除消息机密性外,消息认证也是一个重要的网络安全功能。本章的主要内容:
(1)研究使用消息验证码(MAC)和散列函数进行消息认证
(2)分析公钥密码原理和两个具体的公钥算法
(3)分析使用公钥密码生成数字签名,从而提供加强版的消息认证


二、消息认证方法

加密可以防止被动攻击(窃听)。加密的另一个要求是可以防止主动攻击(伪造数据和业务)。防止这些攻击的办法被称为消息认证

认证包括两个重要方面:
(1)验证消息的内容有没有被篡改和验证来源是否可信
(2)验证消息的时效性(消息有没有被人为地延迟或重放)以及两实体之间消息流的相对顺序

常见的认证函数:
1、消息加密:将整个消息的密文作为认证码
2、哈希函数(散列函数):通过哈希函数使消息产生定长的散列值作为认证码
3、消息认证码(MAC):将消息与密钥一起产生定长值作为认证码

散列函数认证还可以分为无密钥的散列函数验证(MD5、SHA)、基于密钥的散列函数验证(HMAC)

三、散列函数(哈希函数)

单向散列函数之所以重要,不仅在于消息认证,还有数字签名

3.1 散列函数的要求

散列函数的目的是为文件、消息或其他数据块产生“指纹”;因此散列函数H必须具有以下性质:
(1)H可适用于任意长度的数据块
(2)H能够生成固定长度的输出
(3)对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件方式实现
(4)对于任意给定值h,找到满足H(x)=h的x在计算上不可行。满足这一特性的散列函数称为具有单向性,或具有抗原像攻击性
(5)对于任意给定的数据块x,找到满足H(y)=H(x)的y≠x在计算上是不可行的。满足这一特性的散列函数被称为具有抗第二原像攻击性,有时也称为具有抗弱碰撞攻击性
(6)找到满足H(x)=H(y)的任意一对(x,y)在计算上是不可行的。满足这一特性的散列函数被称为抗碰撞性,有时也被称为抗强碰撞性

条件(1)和(2)是散列函数的定义
散列函数就是哈希函数
满足前5个性质的散列函数称为弱散列函数
满足6个性质的散列函数称为强散列函数

3.2 散列函数的安全性

单向散列函数的要求:抗强碰撞性、抗弱碰撞攻击性、单向性

3.3 习题训练

考虑下面的散列函数。消息是一列十进制数字:M=(a1,a2,a3,····,at)

在这里插入图片描述

解题思路:

(1)要判断是否满足抗弱碰撞攻击性,只需设置一个不同的消息M’≠M,如果h(M’)=h(M),则说明不满足,反之则满足;从下述推导可见,该散列函数不满足抗弱碰撞攻击性
在这里插入图片描述

(2)散列函数不满足抗弱碰撞攻击性:
在这里插入图片描述

(3)计算散列值如下:
在这里插入图片描述

四、单向散列函数

单向散列函数是在哈希函数的基础上,实现了单向性、抗弱碰撞性、抗强碰撞性

单向散列函数可以替代MAC

常用的单向散列函数:MD5、SHA-1、RIPEMD-160

4.1 MD5算法

MD5算法立足于Feistel结构(4×32bit),输出128bit散列值

在这里插入图片描述

4.2 SHA安全散列算法

SHA是基于散列函数MD4,并且其架构跟MD4高度相仿

SHA-1立足于Feistel结构(5×32位),输出160bit散列值

在这里插入图片描述

消息摘要=散列值=哈希值

五、消息认证码

5.1 MAC

利用私钥产生一小块数据,称之为消息认证码,将其附到消息上

如何产生消息认证码:

KAB是密钥,M是明文
F是生成消息认证码的函数

在这里插入图片描述

如何实现认证:
(1)发送方计算得到MAC,将消息与MAC一同发送给接收方
(2)接收方将得到的消息和密钥做相同的运算,得到新的MAC
(3)比较得到的MAC与新的MAC,如果相同,则可得出以下结论:
1、接收方能够确认消息没有被篡改
2、接收方能够确保消息来自合法的合法的发送方
3、如果消息中包含序列号,那么接收方可以确认消息的正确序列

在这里插入图片描述

许多算法都可以生成MAC,标准推荐使用DES;DES加密得到密文后,取密文最后几个比特用作MAC(典型的为16/32比特)

根据如何生成MAC可分为HMAC和CMAC

5.2 HMAC(基于散列函数)

HMAC的设计目标
(1)不必修改而直接使用现有的散列函数
(2)嵌入式散列函数要有很好的可移植性
(3)保持散列函数的原有性能,不发生显著退化
(4)使用和处理密钥简单
(5)如果已知嵌入的散列函数的强度,则完全可以知道认证机制抗密码分析的强度

运算步骤
(1)密钥处理:如果密钥长度大于哈希函数的块长度(例如,对于 SHA - 256,块长度为 512 位),先对密钥进行哈希运算,将其长度缩减到哈希函数的块长度;如果密钥长度小于块长度,则在密钥末尾填充 0,使其长度达到块长度。
(2)生成内填充值:将处理后的密钥与一个固定的十六进制值(通常称为 ipad,对于大多数哈希函数,其值为 0x36363636…36,长度等于块长度)进行异或操作,得到内填充值。
(3)生成外填充值:将处理后的密钥与另一个固定的十六进制值(通常称为 opad,值为 0x5C5C5C5C…5C,长度等于块长度)进行异或操作,得到外填充值。
(4)计算中间哈希值:将内填充值与消息连接起来,然后对连接后的结果进行哈希运算,得到中间哈希值。
(5)计算最终 HMAC 值:将外填充值与中间哈希值连接起来,再次进行哈希运算,得到最终的 HMAC 值。

5.3 分组密码CMAC(基于对称加密算法)

实现思想:
分组密码将消息分割为固定长度的分组(如 AES 为 128 位),CMAC 通过以下方式工作:
(1)利用密钥对消息分组进行加密运算,通过特定模式(如分组链接、密钥扩展等)将各分组的加密结果关联起来,最终生成认证码。
(2)认证时,接收方用相同密钥对消息进行同样处理,对比生成的认证码是否一致,以判断消息是否被篡改或伪造。

六、公钥密码原理

公钥密码和传统密码同等重要,它还可以用来进行消息认证和密钥分发

6.1 公钥密码思想

一个公钥加密方案由六部分组成:明文、加密算法、公钥、私钥、密文、解密算法

(1)公钥和私钥都可以用作算法的输入;如果公钥用作加密,则私钥用作解密;如果公钥用作解密,则私钥用作加密
(2)公钥是对外公开的,其他人都能使用,私钥只有自己知道
(3)传统密码算法(也就是对称加密算法)中使用的密钥被特别的称为密钥;公钥加密算法中的两个密钥被称为公钥和私钥

如何进行加密/解密:
(1)每个用户都生成一对密钥用来对消息进行加密和解密。
(2)每个用户把两个密钥中的一个放在公共寄存器或其他可访问的文件里,这个密钥便是公钥,另一个密钥自己保存。每个用户都收藏别人的公钥。
(3)如果 Bob 希望给 Alice 发送私人消息,则他用 Alice 的公钥加密消息。
(4)当 Alice 收到这条消息,她用私钥进行解密。因为只有 Alice 知道她自己的私钥,其他收到消息的人无法解密消息。

在这里插入图片描述

在这里插入图片描述

第二个图是干什么的:
(1)所有用户都可以用Alice的公钥来加密消息,从而给Alice发送消息,那么Alice怎么判断哪条消息是Bob发送的呢,第二个图很好解释了这个问题
(2)Bob利用自己的私钥来加密,Alice在解密的时候就只能用Bob的公钥来解密,从而知道是Bob发送的消息,实现了认证

6.2 公钥密码系统

分类:
(1)加密 / 解密:发送方用接收方的公钥加密消息。
(2)数字签名:发送方用自己的私钥 “签名” 消息。签名可以通过对整条消息加密或者对消息的一个小的数据块加密来产生,其中该小数据块是整条消息的函数。
(3)密钥交换:通信双方交换会话密钥。这可以使用几种不同的方法,且需要用到通信一方或双方的私钥。

哪些算法可以实现:
在这里插入图片描述

6.3 公钥密码的要求

在这里插入图片描述

七、公钥密码算法

RSA和Diffie-Hellman是使用最为广泛的两种公钥算法

7.1 RSA公钥密码算法

1、密钥生成过程:

(1)选择两个不同的大质数: 设这两个大质数为p和q,例如p = 11,q = 13。
(2)计算n的值:n = p × q,对于上述例子,n = 11 × 13 = 143。n的长度(二进制位数)决定了 RSA 算法的安全强度,实际应用中n通常是 1024 位、2048 位甚至更高。
(3)计算φ(n):φ(n)是n的欧拉函数值,对于n = p × q(p、q为质数),φ(n) = (p - 1) × (q - 1)。在例子中,φ(143) = (11 - 1) × (13 - 1) = 120 。
(4)选择公钥指数e:e要满足 1 < e < φ(n),且e与φ(n)互质(即它们的最大公约数为 1)。比如选择e = 7,因为7和120的最大公约数是 1。
(5)计算私钥指数d:d是e在模φ(n)下的乘法逆元,即满足e × d =1 (mod φ(n))。通过扩展欧几里得算法可以计算出d的值,对于e = 7,φ(n) = 120,可以算出d = 103,因为7 × 103 = 721,721 ÷ 120 = 6······1。
(6)生成密钥对:公钥是(e, n),即(7, 143);私钥是(d, n),即(103, 143)。

2、加密过程:

假设发送方要将消息m加密发送给接收方(接收方持有公钥(e, n)),加密公式为c = me mod n,其中c是密文。例如消息(m = 8),则c = 87 mod 143 = 2097152 mod 143 = 128 。

3、解密过程:

接收方收到密文c后,用自己的私钥(d, n)进行解密,解密公式为m = cd mod n。对于上述例子,m = 128103 mod 143,经过计算得到m = 8,成功恢复出原始消息。

7.2 Diffie-Hellman密钥交换(必考)

Diffie-Hellman算法的目的在于使得两个用户能够安全的交换密钥这个密钥不是公钥或密钥,而是由一方的公钥+另一方的私钥得到的

(1)题目会给出一个素数p和它的本原根α
(2)用户A的公钥为YA,私钥为XA;用户B的公钥为YB,私钥为XB
(3)有公式:
在这里插入图片描述

在这里插入图片描述
(4)如何实现交换密钥的呢?
1、用户A和用户B可能从来没有通信过,也就不存在预先协商好的共享密钥
2、用户B以明文的形式向用户A发送YB,用户A利用YB计算 K = ( Y B ) X A m o d    q K = (Y_{\text{B}})^{X_{\text{A}}} \mod q K=(YB)XAmodq
3、用户A以明文的形式向用户B发送YA,用户B利用YA计算 K = ( Y A ) X B m o d    q K = (Y_{\text{A}})^{X_{\text{B}}} \mod q K=(YA)XBmodq
4、计算完后两个K是相同的,本地算出相同的共享密钥 K,至此完成从无到有的密钥交换

中间人攻击

Diffie-Hellman密钥交换面对中间人攻击是不安全的
这种弱点可以通过数字签名公钥证书来克服

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 习题训练

在这里插入图片描述

解题过程:
在这里插入图片描述

八、习题模拟

在RSA系统中,某用户的公钥e=31,n=3599,该用户的私钥是3031吗?

解题思路:
最重要的是找到开始的两个素数q和p
(1)因为3599很接近3600,而且3599=p×q,3600=60×60,所以p和q都在60附近,不会差很多;试探得到p=59,q=61
(2)φ(n)=(p-1)(q-1)=3480
(3)因为e × d =1 (mod φ(n)),所以31d=3480k+1,k从1开始试,直到3480k+1可以整除31,即可求出d
(4)算出私钥是3031

MD5的输入是任意长度,其输出长度是****比特

答案:128

在使用RSA的公钥系统中,你可截获发送给用户的密文C=10,并且已知他的公钥e=35,n=35。明文M是什么?

解题思路:
(1)解密要用到私钥,所以必须先求出私钥
(2)n=p×q=35=5×7;φ(n)=(p-1)(q-1)=24;e×d=k×φ(n)+1;35d=24k+1;d=11
(3)M = Cd mod n;则35k+M=1011;得到M为5
在这里插入图片描述

简述Diffie-Hellman密钥交换面对中间人攻击是不安全的

(1)攻击者生成随机两个私钥X1和X2,并计算出对应的公钥Y1和Y2
(2)用户A向用户B发送YA,被攻击者拦截,攻击者向用户B发送Y1
(3)用户B向用户A发送YB,被攻击者拦截,攻击者向用户A发送Y2
(4)这样就导致用户A和用户B以为他们之间共享了同一个密钥
(5)但实际上,用户A和攻击者共享密钥K1 = ( Y 2 ) X A m o d    q (Y_{\text{2}})^{X_{\text{A}}} \mod q (Y2)XAmodq= ( Y A ) X 2 m o d    q (Y_{\text{A}})^{X_{\text{2}}} \mod q (YA)X2modq
(6)同理,用户B和攻击者共享密钥K2 = ( Y 1 ) X B m o d    q (Y_{\text{1}})^{X_{\text{B}}} \mod q (Y1)XBmodq= ( Y B ) X 1 m o d    q (Y_{\text{B}})^{X_{\text{1}}} \mod q (YB)X1modq


网站公告

今日签到

点亮在社区的每一天
去签到