非对称加密简介
数据加密大概分为对称加密和非对称加密两种
-
对称加密
只需要一个密钥,即可用同一套算法加密和解密
用户A要发送abc, 通过在abc后面加上密钥_key,得到abc_key发给用户B,用户B通过截取掉密钥_key,得到真实信息abc
用户A需要告知用户B密钥,线上传输密钥有泄露风险,用户A如果要给很多人发消息,那就得给每个用户告知密钥,网络传输密钥被截取时,即可解密数据
常用对称加密算法:AES(常用) 、DES(已不安全)、SM4(国产)
-
非对称加密
使用一对密钥(公钥、私钥)进行加解密,加密和解密用的不是同一个密钥
B先把公钥发给A,A用B的公钥加密,B再用自己的私钥解密,只有公钥在网络传输,第三方即使截取了公钥,也破解不了数据
常用非对称加密算法:RSA,SM2(中国自主研发)
虽然公钥私钥可以互相解密数据,但公钥、私钥需要严格区分,不能互换,因为通过公钥想暴力破解私钥很难,但是通过私钥暴力破解公钥会简单很多
常用场景:
场景 谁加密 谁解密 为什么 保密通信 他人(用你的公钥) 你(用你的私钥) 保证:只有你能看到内容 数字签名 你(用自己的私钥) 所有人(用你的公钥) 保证:消息确实来自你、未被篡改 登录认证 你(用自己的私钥) 所有人(用你的公钥) 和数字签名类似,可以免登录,比如git@xxx的方式克隆代码可以免输密码
RSA算法简介
参考阮一峰写的:RSA算法原理(二)
算法原理
RSA 是目前最有影响力的非对称加密算法,其中有些细节涉及数论中的一些内容,比较烧脑。该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,「因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥」。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
类型 | 公式 (mod是取余操作) |
---|---|
公钥KU | n:两素数 p 和 q 的乘积(p 和 q 必须保密) e:与(p - 1)(q - 1)互质 |
私钥KR | d:e^-1 (mod(p-1)(q-1))这是乘法逆元的表示方式 de%((p-1)(q-1)) = 1 这是没学过数论的能看懂的公式 n: p 和 q 的乘积 |
加密 | C ≡ m^e mod n |
解密 | m ≡ c^d mod n |
其中公钥一般表示为数字(e, n),私钥数字(d, n)
在加密通信中 明文M,密文C公式如下:
通过明文和公钥计算密文:C = M**e % n
密文C传输给用户,通过密文加密钥解密得到明文:M = C**d % n
密文C传输过程中即使被人截取也获取不了明文,实现加密
在数字签名中 在数字签名中,M是小明针对文件的数字签名,通过某种算法如sha256计算文件摘要C1
先通过密钥和C1算出数字签名M:M = C1**d % n
把数字签名和文件一起发给用户
- 通过数字签名和公钥算出文件摘要C2:C2 = M**e % n
- sha256计算文件摘要C1,比对C1和C2,如果相同,说明文件未被篡改,同时说明这个数字签名M确实是由小明签的,因为只有小明的公钥加小明的数字签名才能得到验证摘要正确
- 数字签名具有防文件篡改、防伪造、防抵赖的功能
如何攻破数字签名
何为攻破数字签名?发给用户假文件,令其以为是真的;或者即使是真文件,但不是真实的签名
- 方式一:把假文件的摘要C1和真文件的搞成一样,签名验证依然可以通过,这就是hash碰撞攻击
著名案例
MD5:2004年被王小云团队攻破,可在普通计算机上几小时内构造碰撞。典型案例包括伪造CA证书(2008年)。
SHA1:2017年Google团队公开SHAttered攻击,构造两个显示内容不同但哈希值相同的PDF文件,成本约11万美元(CPU+GPU集群运算数月)
- 方式二:让你得到错误的公钥,攻击者用自身的私钥签名任何文件都能通过验证
如何伪造公钥
中间人攻击:在用户获取公钥的过程中,用假公钥替换为真的
如何解决中间人攻击
CA登场了,CA (Certificate Authority)」证书中心,由一个CA认证中心通过他的私钥对公钥A签名得到一个数字证书(包含公钥A和CA签名等信息)传输给用户,用户先用CA的公钥验证签名信息确保公钥A真实,等于是又做了一层嵌套加密。
- 怎么保证CA的公钥又是如何传输的呢?
浏览器内置通过了WebTrust认证的CA的公钥,被称为根证书
用户手动导入
浏览器弹窗询问用户后自动导入
Https加密通信过程
非对称加解密数据比对称加密慢很多,实际应用中一般用于加密”对称加密密钥“,后续在用对称加密算法加密数据,https就是基于这个逻辑运行的
HTTPS 的加密过程可以分为以下步骤:
- 客户端向服务器发送 HTTPS 请求。
- 服务器将公钥证书发送给客户端。
- 客户端验证服务器的证书。
- 如果验证通过,客户端生成一个用于会话的对称密钥。
- 客户端使用服务器的公钥对对称密钥进行加密,并将加密后的密钥发送给服务器。
- 服务器使用私钥对客户端发送的加密密钥进行解密,得到对称密钥。
- 服务器和客户端使用对称密钥进行加密和解密数据传输。