网络环境中的攻击

  • 泄密:没有密钥的接收方获得了消息
  • 传输分析:分析双方的通信模式
  • 伪装:声称这条消息来自某个合法实体
  • 内容修改
  • 顺序修改
  • 计时修改:对消息延时、重放
  • 发送方否认发送过某条消息
  • 接收方否认接收过某条消息

对于上述攻击,可以采取的手段有:

  • 消息加密:应对泄密、传输分析
  • 消息认证:应对伪装、内容修改、顺序修改、计时修改
  • 数字签名:应对发送方否认
  • 应对接收方否认需要特定协议

消息认证

消息认证是验证收到的消息确实来自真正的发送方未被修改的消息

消息认证一定包括:

  • 下层——产生认证符的函数
  • 上层——接收方根据认证符验证消息真实性

产生认证符的函数称为认证函数

  • 消息加密:整个消息密文作为认证符
  • 消息认证码MAC:消息和密钥的公开函数,产生定长的值
  • Hash函数:任意长的消息映射为定长的Hash值的公开函数

消息加密

对称加密的消息认证

  1. 对明文消息计算错误检测码(或帧校验序列 FCS

  2. 对加入FCS的消息加密,传输密文

先FCS再加密才具有认证效力,先加密再FCS是可以模仿的

然而,由于A和B具有对称的密钥,接收方可以伪造信息,发送方也可以否认信息,即这种认证不提供数字签名


公钥加密的消息认证

一般而言,公钥加密只提供保密性,因为任何人都知道接收方的公钥,无法认证发送方身份

一种方法是:

  1. A用A的私钥将消息明文加密,得到数字签名
  2. A再将得到的密文用B的公钥再次加密,发送给B
  3. B用自己的私钥解密,得到A经过数字签名后的消息
  4. B再用A的公钥解密,确认消息确由A发出

然而这种方法使用了4次公钥算法,复杂度很高

公钥加密的数字签名接收方无法伪造,于是发送方也无法否认

消息认证码 MAC

MAC利用密文生成一个固定长度的短数据块,将其附加在消息之后,即:

MAC=Ck(M){\rm MAC}=C_k(M)

其中MM为输入消息,CC为MAC函数,kk为收发双方共享密钥

MAC函数与加密类似,但不要求可逆性,只需要比对即可

双方使用的密钥相同,无法提供数字签名

可以提供数字签名的含义是,接收方根据自己的已知信息无法伪造出发送方发出的消息,于是第三者也可以确信消息一定是由发送方发送的

MAC的两种处理方式:

  • 与明文相关的认证:先认证再加密,即发送Ek2[MCk1[M]]E_{k_2}[M||C_{k_1}[M]],||表示拼接
  • 与密文相关的认证:先加密再认证,即发送Ek2[M]Ck1[Ek2[M]]E_{k_2}[M]||C_{k_1}[E_{k_2}[M]]

Hash函数

类似MAC,但Hash函数不使用密钥,生成一个固定大小的Hash码H(M)H(M)

Hash码仅仅是输入消息的函数,也被称为消息摘要(Message Digest, MD)

Hash码需要具有错误检测能力:即改变任何一位或几位,一般都会导致hash码的改变

几种处理方式:

  • 需要传递密文:发送Ek[MH(M)]E_k[M||H(M)]
  • 不需要传递密文:发送MEk[H(M)]M||E_k[H(M)],处理成本更低,且能提供认证
  • 非对称加密hash码:发送MEKRa[H(M)]M||E_{KR_a}[H(M)],可以提供数字签名
  • 公钥签名+密文传递:发送Ek[MEKRa[H(M)]]E_k[M||E_{KR_a}[H(M)]]
  • 秘密值:发送MH(MS)M||H(M||S),其中SS是双方知道但不在网络上发送的秘密值,于是消息无法伪造,提供了认证
  • 叠加:Ek[MH(MS)]]E_k[M||H(M||S)]]

Hash函数需要满足的要求:

  • 对报文长度无限制
  • 产生的hash码长度固定
  • 单向性:正向计算容易,反向计算困难
  • 抗弱碰撞性:给定mm,找到mmm'\neq mH(m)=H(m)H(m')=H(m)在计算上不可行
  • 抗强碰撞性:找到(x,y)(x,y)xyx\neq y,使H(x)=H(y)H(x)=H(y)在计算上不可行

安全hash函数的一般结构

将报文分为每组长度bb位的LL个分组(blenb\nmid {\rm len}时补零),设为Y0,Y1,,YL1Y_0,Y_1,\cdots,Y_{L-1}

给定一个nn位初始值IV\rm IV,进行以下计算:

CV0=IV{\rm CV}_0={\rm IV}

CVk=f(CVk1,Yk1), k=1,2,,L{\rm CV}_k=f({\rm CV}_{k-1},Y_{k-1}),\ k=1,2,\cdots,L

H(M)=CVLH(M)={\rm CV}_L

其中ff是一个压缩函数,将nn位值和bb位分组结合起来得到新的nn位值

设计安全hash函数的问题转化成了设计抗碰撞的压缩函数ff的问题

常用Hash算法

MD5

输入:任意长的消息

分组:512bits

输出:128bits

设计目标:安全、快速、简洁,使用小端结构


第1步:增加填充位、填充长度

增加填充位1000…0使填充后的总长度模512余448,并在填充后的消息最后附上消息长度对2642^{64}的余数,于是总长度是512的倍数

填充的长度用小端法表示,在算法中增加长度是为了增强安全强度

第2步:初始化MD缓存

Hash函数的中间结果保存在四个32位寄存器中,其初始值如下:

1
2
3
4
A = 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210

计算Hash值的具体过程略

SHA

RIPEMD-160

数字签名算法DSS

消息认证数字签名之间的区别:

  • 消息认证用于防止通信双方以外的第三方的攻击,即第三方无法伪造出经过双方认证的消息
  • 数字签名用于防止通信双方自身的攻击,例如接收方伪造一条消息,并生成其来自发送方
    • 由于接收方可以伪造消息,发送方也就可以否认发送过的消息

数字签名必须具备的特征:

  • 可以验证签名者、签名时间
  • 可以认证被签的消息内容
  • 签名可以由第三方仲裁

直接数字签名和仲裁数字签名

直接数字签名

  • 只涉及通信双方
  • 例如X使用自己的私钥对消息或消息摘要加密后发送给Y
  • 方法有效性依赖于私钥安全性

仲裁数字签名

  • 引入仲裁者A
  • X的消息签名后发送给A,A对消息和签名进行检查,之后加上日期发送给Y

数字签名标准DSS

image-20241214114017934