为了用最简单的方式来讲解RSA、数字签名、验签,下面模拟2个在军事角色来讲解,毕竟加密算法的起源就是为了战争服务的。

假设有一个德国将军和一个德国士兵需要通信,那么他们为了安全考虑,决定采用RSA非对称加密算法保证机密性,因为使用RSA算法可以达成信息安全三要素:

  • 机密性(确保信息不被非法获取)
  • 完整性(确保能够发现信息是否被改动过)
  • 可用性(确保系统正常提供服务)

下面只是一些片段的场景演示,并不是很严谨,主要是为了理解:公钥加密、私钥解密,私钥签名、公钥验签。

准备阶段——预制密钥过程

将军先成一对公、私密钥,在出发之前,将公钥发给10万名士兵,让他们带着。

将军拿着私钥:

-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOFLM8+cWfjWJrP6
3i0jiRtpc240U6wjyEV4Ji2XA8UpFsRMdsFLXRsy9Rs5YsW1GBlXcv3bgZD2itui
YSYnWdbJpI7yIFtkDKJZQ/k8kmH9v2QePUwzAbvXZsZ9hg92ORGms2nNT3DhQHNQ
wopSgdThz8Ztvhd4Er0s1M9ZAvhjAgMBAAECgYEAxwNLTUXsJGfn4Gzm/jC52MEZ
+mu2zgT90IAGGZeg+PUG63gwHyeXo4MsCVRz7/m8xAX/ykew+IEQwFt8Pdvc+rrs
5yml4gOBPfhpau5QaI75xNjnyH7UA3mbRCZeyZrvuKqtY/f8pCgzy3EBWnRpkcsq
eE6bsOQrD45mltr+0QECQQDynvhKEh+hD5xBpF/DIP8Fp6fizexHdA6+aZT/gLaF
A4XgZ9HEDDBhvNdadyYUNOLWhkxRHv6CkT5azfLXsJEhAkEA7begtbBCDXDf1+DR
h3j2S8zcv6+utYgcpjvxZqjbPi6UIWXLxI80PIwQ0uouHCUMjikBA6VX9vTbw9TZ
/IelAwJBAKI3W7baiz86mrTg3A4w/5GeWQexuurDVCBHo5F5U493nYk+oOe9ZpPS
mQIpa9JS0d+xB1GtsWlHBzPbQySnL0ECQA/btCjqvT1QTl6EbPXwp92eqQtQmQMb
NW4RiaUjlpyrVs5zkAho1T9EyMqJPNI71n6VVa/8k8WxyAdkZ7ZlBikCQEkNe1+s
AKnh+AFGCJ+6WAq1J2RuIgcA6bVL3ip7F2NHdE+N+tR9JqWw3JNCweWmAlzKIGs6
eKSVD5egzKaLXss=
-----END PRIVATE KEY-----

士兵们拿着公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhSzPPnFn41iaz+t4tI4kbaXNu
NFOsI8hFeCYtlwPFKRbETHbBS10bMvUbOWLFtRgZV3L924GQ9orbomEmJ1nWyaSO
8iBbZAyiWUP5PJJh/b9kHj1MMwG712bGfYYPdjkRprNpzU9w4UBzUMKKUoHU4c/G
bb4XeBK9LNTPWQL4YwIDAQAB
-----END PUBLIC KEY-----

某士兵给将军写信的过程——公钥加密

  1. I am soldier.就是士兵想要加密的文本;
  2. 用公钥加密文本,得到密文(如下)
l05JLkFyAY5W2AHnrufbPqPCU7VhfFmarBzLUgc/hIIdVVRZ2DUfCPACRUNmIhLWijaXYjHPvnD3QwxNmG4LynggWzDur2Ssj8Ng1EqmPEFA5ujlwUvZeqOENs/PnamTqrxlStxW2MOJZLUbxRsilIcK4807XBRYUThpsmUxZmU=
  1. 将这个密文通过邮件的方式发送给将军。

将军收到密文解密的过程——私钥解密

  1. 将军收到密文;
  2. 将军使用私钥来解密密文,得到信本身的内容,完成了可用性(确保系统正常提供服务);

只要将军不把私钥泄露出去,那这个密文就是安全的,即使英国佬拦截到了这个密文,也破译不了,只能看到一堆乱码,完成了机密性(确保信息不被非法获取)。

这个就是典型的:公钥加密、私钥解密场景。


这个是单向的传输,只能由士兵加密文本,传输给将军。

将军不能用私钥加密,让士兵解密。虽然技术上可以做到反向操作,用私钥加密。但是这里场景是10万名士兵都拥有这把公钥,假设将军想要给编号为999号的士兵发个密文,但是被敌军截获,敌军使用编号9527的内鬼士兵的公钥,就能轻松解密出来。

如何双向加密传输,需要学习更多知识(这个不是本文描述的重点)。

下面是切换另外的场景,讲解数字签名和验签,还是以将军和士兵举例。

将军给士兵们发命令的过程——私钥签名

这里的将军给士兵发命令过程,不考虑机密性,只考虑防篡改性。

  1. I am general.是将军写的文本;

  2. 用hash计算的方式,hash一下I am general.
    得到hash散列值:5244FAC4DB90120F1D833C687E0317FF , 这个hash出来的文本叫做数字摘要(digest)

  3. 使用私钥加密这个数字摘要,得到的密文,叫作数字签名(signature)

    EtWBVFsxMeP1TMHwGLPdCy9fzmon09b7YGqfcKFNS7F4Db9iFSVKC6gABxuqL59eV6Fm/3hPXZ2NQ+4eq/rY57GiT0kMP4e86gFmUSLwJNHQyuue2zIJrrhLp7/CyVGjKFIyM0KLr+NERt2bv4t5ZkbIJLuN+QLNZUV6WCFugHQ=
    
  4. 将军将I am general.文本和数字签名一起通过邮件的方式发送给士兵;

士兵们接收将军命令的过程——公钥验签

  1. 士兵用公钥解密这个数字签名, 得到摘要5244FAC4DB90120F1D833C687E0317FF

  2. 拿到I am general.hash计算,得到5244FAC4DB90120F1D833C687E0317FF

  3. 士兵对比明文的hash自己使用公钥解密出来的hash文本是否一致,只要一致,就能确认是将军发送的命令,并且没有被篡改过。

这样可以防止英国佬拦截了将军的信,作篡改。这里完成了完整性,完整性(确保能够发现信息是否被改动过)。这个场景是:私钥签名,公钥验签

以上的两个场景,演示如何防止了两种攻击形式:

  • 被动攻击(对机密性的破坏,窃听)
  • 主动攻击(对完整性,可用性的破坏,篡改,冒充)

参考

什么是数字签名?
http://www.youdzone.com/signature.html

posted on 2020-04-01 23:00  Mysticbinary  阅读(2844)  评论(0编辑  收藏  举报