非对称加密RSA简介

19 阅读6分钟

非对称加密简介

数据加密大概分为对称加密和非对称加密两种

  • 对称加密

    只需要一个密钥,即可用同一套算法加密和解密

    用户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算法

算法原理

RSA 是目前最有影响力的非对称加密算法,其中有些细节涉及数论中的一些内容,比较烧脑。该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,「因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥」。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

类型公式 (mod是取余操作)
公钥KUn:两素数 p 和 q 的乘积(p 和 q 必须保密)
e:与(p - 1)(q - 1)互质
私钥KRd: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 请求。
  • 服务器将公钥证书发送给客户端。
  • 客户端验证服务器的证书。
  • 如果验证通过,客户端生成一个用于会话的对称密钥。
  • 客户端使用服务器的公钥对对称密钥进行加密,并将加密后的密钥发送给服务器。
  • 服务器使用私钥对客户端发送的加密密钥进行解密,得到对称密钥。
  • 服务器和客户端使用对称密钥进行加密和解密数据传输。