计算机系统应用教程网站

网站首页 > 技术文章 正文

软考-信息安全工程师学习笔记11——数字签名

btikc 2024-10-29 13:11:02 技术文章 4 ℃ 0 评论

数字签名(DigitalSignature)是指签名者使用私钥对待签名数据的杂凑值做密码运算得到的结果。该结果只能用签名者的公钥进行验证,用于确认待签名数据的完整性签名者身份的真实性签名行为的抗抵赖性。但不提供原文信息加密,不能保证对方能收到消息,不对接收方身份进行验证


数字签名至少应满足以下三个条件

  1. 非否认。签名者事后不能否认自己的签名。
  2. 真实性。接收者能验证签名,而任何其他人都不能伪造签名。
  3. 可鉴别性。当双方关于签名的真伪发生争执时,第三方能解决双方之间发生的争执。

数字签名应具有的性质

  • 签名是对文档的一种映射,签名与文档具有一一对应关系(精确性)
  • 签名应基于 签名者的唯一性特征 (如私钥),从而确定签名的不可伪造性和不可否认性(唯一性)
  • 签名应该具有时间特征, 防止签名的重复使用(时效性)

一个数字签名方案一般由签名算法和验证算法组成。 签名算法密钥是秘密的,只有签名的人掌握;而验证算法则是公开的,以便他人验证。




数字签名工作的基本流程

假设A需要签名发送一份电子合同文件给B。

A的签名步骤如下:

第一步,A使用Hash函数将电子合同文件生成一个消息摘要:

第二步,A使用自己的私钥,把消息摘要加密处理,形成一个数字签名

第三步,A把电子合同文件和数字签名一同发送给B。

A的签名过程如下图:


B收到A发送的电子合同文件及数字签名后,为确信电子合同文件是A所认可的,验证步骤如下:

第一步,B使用与A相同的Hash算法,计算所收到的电子合同文件的消息摘要:

第二步,B使用A的公钥,解密来自A 的加密消息摘要,恢复A原来的消息摘要:

第三步,B比较自己产生的消息摘要和恢复出来的消息摘要之间的异同。若两个清息摘要相同,则表明电子合同文件来自Alice。如果两个消息摘要的比较结果不一致,则表明电子合同文件已被篡改。

验证数字签名的过程如下图:



数字签名与数据加密的区别

  • 数字签名的加解密与数据加解密过程都可以使用公钥算法,但实现过程正好相反,使用的密钥对也不同。
  • 数字签名使用发送方的密钥对,发送方利用自己的私钥进行加密(签名),接收方用发送方的公开密钥进行解密(验证)
  • 数字签名是一对多的关系,任何人都可以查找发送方公开密钥,以验证数字签名的正确性
  • 数字签名大多采用非对称密钥加密算法,它能保证发送信息的完整性、身份的真实性和不可否认性。
  • 数据加密采用了对称密钥和非对称密钥加密算法,能够保证发送信息的保密性。



数字签名的基本模型

一个数字签名体制包括两个方面的处理:

  • 施加签名
  • 验证签名


施加签名

设施加签名的算法为SIG,产生签名的密钥为K,被签名的数据为M,产生的签名信息为S,则有: S=SIG(M, K)

验证签名

设验证签名的算法为VER,用VER对签名S进行验证,可鉴别S的真假。即:

VER (S, Kpu) = M→真

VER (S, Kpu) ≠ M→ 假 (签名时M或M的Hash,会发送给接收方)


签名函数必须满足以下条件,否则文件内容及签名被篡改或冒充均无法发现

1.当M’≠M时,有SIG(M’,K)≠SIG(M,K)

  • 条件1)要求签名S至少和被签名的数据M一样长,当M较长时,应用很不方便,此时可以考虑对M进行分组,但可能产生碰撞; Hash可以很好处理此问题
  • 将条件1)改为:虽然当M'≠M时, 存在S=S',但对于给定的M或S,要找出相应的M'在计算上是不可能的。

2.签名S只能由签名者产生,否则别人便可伪造,于是签名者也就可以抵赖

3. 收信者可以验证签名S的真伪。这使得当签名S为假时,收信者不致上当

4.签名者也应有办法鉴别收信者所出示的签名者签名是否是自己的签名,这就给签名者以自卫的能力


利用公钥密码实现数字签名

1. 一般方法

对于一个公钥密码,如果满足:E(D(M,Kd),Ke)=M,则可确保数据的真实性

凡是能够确保数据的真实性的公开密钥密码都可用来实现数字签名,例如RSA密码、ELGamal密码、 椭圆曲线密码ECC、我国的SM2等都可以实现数字签名现数字签名。


数字签名标准DSS(DigitalSignatureStandard)

  • DSS采用了SHA散列算法,给出了一-种新的数字签名方法,即数字签名算法DSA
  • DSA本质上是基于Elgamal的签名算法
  • DSA只提供数字签名,不可以用子加密或密钥分配

DSA算法的具体描述


  • DSS方法便用Hash函数产生消息的散列值,和随机生成的k作为签名函数的输入
  • 签名函数依赖于发送方的私钥(PRA)和组参数,这些参数为一组通信伙伴所共有,这组参数构成全局公钥PUG
  • 签名由两部分组成,标记为r和s。
  • 接收方对收到的消息计算散列值,和收到的签名(r,s)一起作为验证函数的输入,函数依赖于全局公钥和发送方公钥,若验证函数的输出等于签名中的r,则签名合法。

签名通信协议:A→B

1)A用自己的私钥KdA对数据M进行签名SA=D(M,KdA)

2)如果不需要保密,则A直接将SA发给用户B


3)如果需要保密,则A查到B的公钥KeB ,并用KeB对SA再加密,得到密文C

4) A把C发送B ,并将SA或C留底



签名通信协议的问题

1)验证签名的过程就是恢复明文的过程,而B事先并不知道明文M,否则就用不着通信了,那么B怎样判定恢复出的M是否正确呢

2)怎样阻止B或A用A以前发给B的签名数据,或用A发给其他人的签名数据来冒充当前A发给B的签名数据呢?

3)仅仅靠签名本身并不能解决这些问题。


签名通信协议安全分析

1)因为只有A才拥有KdA,而且由公开的KeA在计算上不能求出保密的解密密钥KdA。因此,签名的操作只有A才能进行,任何其他人都不能伪造。所以KdA就相当与A的印章或指纹,而SA就是A对M的签名。对此,A不能抵赖,任何人不能伪造。

2)事后如果A或B关于签名的真伪发生争执,则他们应向公正的仲裁者出示留底的签名数据,由仲裁者当众验证签名,解决纠纷。


利用Hash函数辅助数字签名


  1. A对消息M做Hash得出H(M)
  2. A用私钥KRa对H(M)进行加密EKRa[H(M)]【数字签名】
  3. A将消息M及签名EKRa[H(M)]发送给接收方B
  4. B用A的公钥KUa对A的签名EKRa[H(M)]解密得H(M)【验证签名】
  5. B对消息M做Hash得出H(M)'
  6. H(M)'与H(M)进行比较,如不相等则表示数据被篡改

如果需要抵御重播攻击,可以加入时间戳


学习参考资料:

信息安全工程师教程(第二版)

建群网培信息安全工程师系列视频教程

信息安全工程师5天修炼

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表