为了用最简单的方式来讲解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-----
某士兵给将军写信的过程——公钥加密
I am soldier.
就是士兵想要加密的文本;- 用公钥加密文本,得到密文(如下)
l05JLkFyAY5W2AHnrufbPqPCU7VhfFmarBzLUgc/hIIdVVRZ2DUfCPACRUNmIhLWijaXYjHPvnD3QwxNmG4LynggWzDur2Ssj8Ng1EqmPEFA5ujlwUvZeqOENs/PnamTqrxlStxW2MOJZLUbxRsilIcK4807XBRYUThpsmUxZmU=
- 将这个密文通过邮件的方式发送给将军。
将军收到密文解密的过程——私钥解密
- 将军收到密文;
- 将军使用私钥来解密密文,得到信本身的内容,完成了可用性(确保系统正常提供服务);
只要将军不把私钥泄露出去,那这个密文就是安全的,即使英国佬拦截到了这个密文,也破译不了,只能看到一堆乱码,完成了机密性(确保信息不被非法获取)。
这个就是典型的:公钥加密、私钥解密场景。
这个是单向的传输,只能由士兵加密文本,传输给将军。
将军不能用私钥加密,让士兵解密。虽然技术上可以做到反向操作,用私钥加密。但是这里场景是10万名士兵都拥有这把公钥,假设将军想要给编号为999号的士兵发个密文,但是被敌军截获,敌军使用编号9527的内鬼士兵的公钥,就能轻松解密出来。
如何双向加密传输,需要学习更多知识(这个不是本文描述的重点)。
下面是切换另外的场景,讲解数字签名和验签,还是以将军和士兵举例。
将军给士兵们发命令的过程——私钥签名
这里的将军给士兵发命令过程,不考虑机密性,只考虑防篡改性。
-
I am general.
是将军写的文本; -
用hash计算的方式,hash一下
I am general.
;
得到hash散列值:5244FAC4DB90120F1D833C687E0317FF
, 这个hash出来的文本叫做数字摘要(digest); -
使用私钥加密这个
数字摘要
,得到的密文,叫作数字签名(signature);EtWBVFsxMeP1TMHwGLPdCy9fzmon09b7YGqfcKFNS7F4Db9iFSVKC6gABxuqL59eV6Fm/3hPXZ2NQ+4eq/rY57GiT0kMP4e86gFmUSLwJNHQyuue2zIJrrhLp7/CyVGjKFIyM0KLr+NERt2bv4t5ZkbIJLuN+QLNZUV6WCFugHQ=
-
将军将
I am general.
文本和数字签名
一起通过邮件的方式发送给士兵;
士兵们接收将军命令的过程——公钥验签
-
士兵用公钥解密这个数字签名, 得到摘要
5244FAC4DB90120F1D833C687E0317FF
; -
拿到
I am general.
hash计算,得到5244FAC4DB90120F1D833C687E0317FF
; -
士兵对比
明文的hash
和自己使用公钥解密出来的hash文本
是否一致,只要一致,就能确认是将军发送的命令,并且没有被篡改过。
这样可以防止英国佬拦截了将军的信,作篡改。这里完成了完整性,完整性(确保能够发现信息是否被改动过)。这个场景是:私钥签名,公钥验签。
以上的两个场景,演示如何防止了两种攻击形式:
- 被动攻击(对机密性的破坏,窃听)
- 主动攻击(对完整性,可用性的破坏,篡改,冒充)