消息认证与数字签名

在网络消息的传输过程中会遇到下述攻击:

  1. 泄密:将消息透露给未授权的单位。
  2. 传输分析:即第三方分析通信双方的通信行为,作为推测通信消息的依据。
  3. 伪装:第三方将信息发送源装作另一实体。
  4. 内容修改:攻击者将发送中的消息拦截,并将消息删除、插入和重新排序。
  5. 顺序修改:将通信双方的消息顺序修改。
  6. 计时修改:将消息延时或重播。
  7. 发送方否认:发送方否认发送了消息。
  8. 接收方否认:接收方否认收到了消息。

消息认证

消息认证的左右主要有两个:(1)验证信息来源的真实性(2)验证信息的完整性。即防止上述的3-6的攻击。

消息认证函数

产生消息认证的函数类型共有三种:

  • Hash函数:利用Hash函数的collision-free 和 不可逆性,将任意长度的消息杂糅、映射为固定长度的消息特征。具体在细节在Hash函数
  • 消息加密:对整个消息加密的密文作为认证。
  • 消息认证码(MAC):他是消息和密钥的函数,它产生定长的值,作为认证符。

消息加密

对称加密

对称加密由于只有通信双方共享密钥,也就是说,收到消息的一方能够确信该消息是由发送方产生的。
但是,这存在一种问题便是,接收方不管收到什么消息都需要经过Y=(D,K),Y可能并非是合法密文。

解决该方法的问题之一便是,加入一个易于识别的结构,并且不能通过加密函数是不能重复这种结构的。例如:FCS(帧校验和)或校验和。

公钥加密

直接使用公钥加密可提供保密性,但是不能提供认证。用公钥加密确实能够保证消息在发送过程中不被盗取。
但是若是仅仅用B的公钥加密,由于公钥的公开性,所以不能确定发送方,第三方可以伪装合法用户发送消息。
为了避免以上的情况,可以先用A的私钥对消息进行加密,再用B的公钥加密。但是,这样的加密和解密一共需要四次复杂的公钥运算。

消息认证码(MAC)

消息认证码(Message authentication code,MAC)是经过特定算法后产生的一小段固定长度的信息,并附加在消息后面。用以检查某段消息的完整性,以及作身份验证。消息认证码的算法中,通常会使用带密钥的散列函数(HMAC),或者块密码的带认证工作模式(如GCM,CCM)。

要生成 Mac ,涉及三种算法:

  • 一个密钥生成算法,用来生成密钥
  • 一个签名算法,根据密钥和信息来生成 Mac
  • 一个验证算法,给定密钥和 Mac ,验证是否正确

若A、B共享密钥K,A向B发送消息M,则A计算MAC=C(K,M),其中C为认证函数。消息与MAC一同发送给B。B收到M‘后用相同的密钥进行相同认证函数的计算得到MAC,将MAC进行比对,若相同,且当只有A、B知道密钥K的情况下,可知道:
(1)接收方可以相信消息未被修改。因为,攻击者在不知道密钥的情况下修改消息,不知道如何才能修改MAC才能匹配。
(2)接收方可以确信消息的发送方,因为只有A和B知道密钥。
(3)若消息中含有序列号,则可以确信消息的顺序没有被修改。

消息认证码和数字签名的区别

Mac 跟数字签名也有很多区别和联系的。

Mac 跟数字签名也有类似的地方,因为都可以确认发出人身份,同时判断文件有无被篡改。

但是区别也是明显的,因为生成 Mac 和验证 Mac 需要的密钥是同一个,属于对称加密的范畴。而数字签名属于非对称加密,生成签名用私钥,而验证签名是否有效要用公钥。Mac 的工作方式决定了,发送方和接收方要事先共享同一个密钥,这也是对称加密算法的共性。数字签名的接收方是不能再生成签名的,也就是说不可伪造。但是 Mac 的接收方因为手里也有密钥,所以可以对其他信息生成 Mac 。

这就是 Mac 和数字签名的对比了。转自知乎

而消息认证码虽然属于对称加密的范畴,但是区别在于:MAC并不要求可逆,而加密要求。另外,MAC的输出是定长,而对称加密的输出与输入长度相关。

基于DES的消息认证码

CBC-MAC 建立在DES之上,是使用最为广泛的MAC算法之一。该认证算法采用DES运算的米文库链接(CBC)方式。其初始向量为0,需要认证的数据需分成连续的64位分组D1、D2、…DN,若最后一组不足64位,则以0填充。
其主要算法为:
O 1 = E ( K , D 1 ) O_{1}=E(K,D_{1}) O1=E(K,D1)
O 2 = E ( K , [ D 2 ⊕ O 1 ] ) O_{2}=E(K,[D_{2}⊕O_{1}]) O2=E(K,[D2O1])
. . . ... ...
O N = E ( K , [ D N ⊕ O N − 1 ] ) O_{N}=E(K,[D_{N}⊕O_{N-1}]) ON=E(K,[DNON1])
该加密算法也可以由AES等代替。考虑到DAC的安全性,分组长度应当选的更长,还可以在
第一块之前添加一个新块填入原始消息长度。

基于Hash的认证码

近些年,基于Hash的消息认证逐渐走进人们的视野。主要原因是SHA等Hash散列函数一般都比对称加密的执行速度快。在诸多的基于散列函数的消息认证码中,HMAC是使用最多的方案,如SSL就使用HMAC来完成认证。
HMAC的设计目标:

  • 不用修改就可以使用合适的散列函数,并且散列函数在软件方面表现很好
  • 当发现有更快或更安全的散列函数时,能够很容易的完成底层替换
  • 密钥的使用与操作简单
  • 很好的保持原有散列函数的性能
  • 若知道已嵌入Hash的函数强度,则完全可以知道认证函数抗密码分析的强度

数字签名

消息认证可以保护消息不受第三方的恶意攻击,但是他不能保证通信的另一方的恶意攻击。
如:(1)A可以伪造一条消息说消息发自B。(2)因为A可以伪造消息,B可以否认他发送过某条消息。

所以数字签名的必须满足:

  • 需要能够验证签名者、签名日期、时间
  • 还需要认证签名内容
  • 签名需要能被第三方仲裁,解决纠纷

直接数字签名

直接数字签名只涉及通信双方。

用共享的密钥(对称加密)对整个消息和签名加密,这里是先进行签名,然后再执加密。只有这样在发生争执时,第三方才可以查看消息,因为如果先加密再签名的话,第三方需要知道解密密钥才能知道消息。

但是这样的签名的安全依赖于发送方的密钥的保密性。如果发送方的密钥泄露,或者发送方声称密钥丢失否认发送了消息,我们可以要求签名的消息中包含一个时间戳,以及在密钥被泄密后立即向管理中心报告。即使用数字证书的证书管理中心(CA)。

EIgamal数字签名方案

算法描述

同EIGamal加密一致,其基本元素是素数q和α,其中,α是q的原根。
用户A产生私钥XA;A的公钥是{q,α,YA}。
具体的密钥产生细节在EIGamal算法概述

生成签名对

A为了对M进行签名,用户A首先计算m=Hash(M),m∈[0,q-1]。
(1)选择证书K,使得满足1≤K≤q-1以及gcd(K,q-1)=1。
(2)计算S1Kmod q。
(3)计算K-1mod (q-1)。
(4)计算S2=K-1(m-XAS1)mod (q-1)。
(5)签名对(S1,S2)。

验证签名对

(1)计算V1mmod q。
(2)计算V2=(YAS1 S1S2
若V1=V2则签名合法。

验证正确性

当V1=V2时,
α m ≡ Y A S 1 S 1 S 2 m o d q α^{m} \equiv Y_{A}^{S_{1}} S_{1}^{S_{2}} mod q αmYAS1S1S2modq

已知,
Y A ≡ α X A m o d q Y_{A} \equiv α^{X_{A}} mod q YAαXAmodq
S 1 ≡ α K m o d q S_{1}\equivα^{K} mod q S1αKmodq
所以

V 2 ≡ α X A S 1 + K S 2 m o d q V_{2}\equivα^{X_{A}S_{1}+K S_{2}} modq V2αXAS1+KS2modq

又因为
S 2 ≡ K − 1 ( m − X A S 1 ) m o d ( q − 1 ) S_{2} \equiv K^{-1}(m-X_{A}S_{1})mod (q-1) S2K1mXAS1mod(q1)
所以
K S 2 ≡ m − X A S 1 m o d ( q − 1 ) KS_{2} \equiv m -X_{A}S_{1} mod (q-1) KS2mXAS1mod(q1)
由上式可得,
X A S 1 + K S 2 = t ∗ ( q − 1 ) + m X_{A}S_{1}+ KS_{2} = t*(q-1)+m XAS1+KS2=t(q1)+m


V 2 ≡ α X A S 1 + K S 2 ≡ α t ∗ ( q − 1 ) + m m o d q V_{2}\equivα^{X_{A}S_{1}+K S_{2}} \equiv α^{ t*(q-1)+m} modq V2αXAS1+KS2αt(q1)+mmodq

由费马定理可得,
α ( q − 1 ) ≡ 1 m o d q α^{ (q-1)} \equiv 1 modq α(q1)1modq

所以,
V 2 ≡ α m m o d q V_{2}\equiv α^{ m} mod q V2αmmodq
得证V1=V2

Schnorr数字签名方案

Schnorr数字签名方案也是基于离散对数的数字签名。但Schnorr数字签名方案所需消息计算量最小化,生成签名的主要工作不依赖于消息,可以等到处理器空闲时处理。

方案描述

生成密钥对

(1)素数p、q,且q是p-1的素因子。
(2)选择整数α,使得αq = 1 mod p 。
(3)选择随机整数s,0<s<q,作为用户私钥。
(4)计算v=a-s mod p ,作为用户公钥。

产生签名

(1)选择随机整数r,0<r<q,计算x=armodp。
(2)将x附在消息后面一起计算Hash值h=H(M|x)。
(3)计算y=(r+sh)mod q。签名对为(h,y)。
ps:由于步骤一的产生与发送的消息M无关,可以在预处理时计算,在一定程度提高了效率。

验证签名

(1)计算x‘=αyvhmod p。
(2)验证h 和 H(M|x’)是否相等

若传输过程中消息没有遭受破坏,
x ′ ≡ α y v h ≡ α y − s h ≡ α r ≡ x m o d q x' \equiv α^{y} v^{h}\equiv α^{y-sh} \equiv α^{r}\equiv x mod q xαyvhαyshαrxmodq
所以,h=H(M|x’)

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值