听说这玩意可以防止否认 —— 数字签名

谁骗了谁?

  小艾和小杨是好朋友,并且经常使用固定密钥进行通信。一天小艾收到一条诈骗消息,理所当然,单纯的小艾被骗钱了。小艾 kali 学的不好,找不到凶手,于是动起了坏心思。小艾将诈骗消息使用和小杨通信的密钥使用单向散列函数计算出 MAC 然后将消息和 MAC 封装后拿去警察局报警。

  • 小艾:小杨发给我的诈骗消息骗了我的钱。
  • 小杨:我没有发过这条消息。
  • 小艾:你怎么证明不是你发的。
  • 小杨:你怎么证明是我发的。
  • 警察:到底是谁骗了谁?

数字签名

  之前的文章提到 消息认证码(MAC) 的缺点就是无法防止否认。因为发送方和接收方可以计算出同样的 MAC 值,所以无法判断这个 MAC 值到底是由谁来计算出来的。
  这个问题的本质在于双方使用同样的密钥生成同样 MAC 值,所以解决这个问题的办法就是让发送者和接收者使用不同的密钥。要求使用不同密钥,很容易想到非对称加密中的公钥与私钥。
  发送方发送消息的时候使用私钥对消息进行签名,接收方接收消息的时候使用公钥对签名进行验证即可确定发送者身份。因为签名只能由发送者的私钥完成,所以这个签名一定是由发送者签发的,这样就没有否认的问题了,这就是数字签名(Digital Signature)。

如何签名与验签?

  • 生成数字签名由消息发送者 A 完成,生成签名就是根据消息内容计算签名值,生成签名意味着认可这个消息的内容。
  • 验证数字签名由消息接受者完成,也可以由第三方来完成。验签成功意味着这个消息是由 A 发出,失败则表示这个消息不是 A 发出的。

  在数字签名的过程中,消息发送者 A 和消息接收者 B 使用不同的密钥来进行签名和验签。这里使用的不同的密钥就是非对称加密中的公钥和私钥。
  非对称加密中使用公钥加密、私钥解密,数字签名中使用私钥签名、公钥验签,数字签名其实就是公钥密码的反向应用。

公钥私钥
非对称加密算法加密消息解密消息
数字签名验签签名

数字签名的方法

1.对消息进行签名

  • 发送者 A 用自己的私钥对消息 M 进行加密生成签名 S。
  • A 将加密后的签名 S 和消息 M 发送给接收者 B。
  • B 用公钥对签名 S 进行解密,从而得到签名之前的消息 M1。
  • B 将 M1 和 A 直接发送过来的消息 M 进行对比,两者一致则验签成功,否则失败。

2.对消息的 hash 值进行签名

  直接对消息进行签名,看起来非常简单,但是在实际应用中很少使用。因为对整个消息进行签名是一个非常耗时的操作,所以我们通常会使用单向散列函数对消息计算出一个 hash 值,然后对这个 hash 值进行签名,这样既可以对消息签名又节省了时间。

  • 发送者 A 用单向散列函数对消息 M 计算 hash 值 H。
  • A 用自己的私钥对 H 进行签名 S。
  • A 将消息 M 和签名 S 发给接收者 B。
  • B 用 A 的公钥对签名 S 进行解密得到 H。
  • B 使用单向散列函数对收到的消息 M 计算得到 hash 值 H1,将 H 和 H1 进行比对,两者一致则验签成功,否则失败。

缺点

  • 使用 消息认证码(MAC) 可以防篡改和仿伪装,但是无法防否认。
  • 使用数字签名可以防篡改、防伪装、防否认。

但是如果验证签名的公钥不是和签名的私钥配对的呢?
  这样就会导致验签失败,这里我们就需要一个可信任的机构来为我们颁发可信任的公钥,这就需要用到证书了。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值