Skip to content
当前页

非对称加密简介

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

  • 对称加密

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

    用户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))这是乘法逆元的表示方式
d*e%((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 请求。
  • 服务器将公钥证书发送给客户端。
  • 客户端验证服务器的证书。
  • 如果验证通过,客户端生成一个用于会话的对称密钥。
  • 客户端使用服务器的公钥对对称密钥进行加密,并将加密后的密钥发送给服务器。
  • 服务器使用私钥对客户端发送的加密密钥进行解密,得到对称密钥。
  • 服务器和客户端使用对称密钥进行加密和解密数据传输。

GPG软件的使用

RSA公钥和私钥的生成,不可能直接手算,因此出现了相关软件GPG(GnuPG)

shell
# linux环境 安装gpg软件
sudo apt-get install gnupg

# 生成密钥
gpg --gen-key

# 查看生成的公钥
gpg --list-keys 

#/home/mazca/.gnupg/pubring.kbx   gpg数据库文件
#------------------------------
#pub   rsa3072 2025-07-07 [SC] [expires: 2027-07-07] 公钥特征
#      96A6F7DDF6E70D36561DFCE47B94F8CCED1FC1D4  公钥id, 可以取整,也可以取后8位或者后16位,导出时需要这个id
#uid           [ultimate] mazhichao <mazhichao@jxcc.com>  用户信息
#sub   rsa3072 2025-07-07 [E] [expires: 2027-07-07]

# 导出公钥
# -a是--armor的缩写,公钥id可以通过gpg --list-keys获取
gpg -a --export 公钥id # 这会把公钥打印到屏幕上
gpg -a --export 公钥id > public-key.txt # 把公钥以文件形式导出到当前目录

# 查看生成的私钥
gpg --list-secret-keys

# 导出私钥
gpg -a --export-secret-key 私钥id # 公钥id和私钥id是一样的

ssh-keygen软件使用

这是一个用于生成ssh密钥的工具,用于ssh远程登录免密码

shell
# 软件安装 安装了openSSH则自带了ssh-keygen,否则需要手动安装openSSH
# 一般linux和win都带了openSSH

# 生成密钥,和GPG是数据库存储不同,ssh-keygen直接生成明文文件
ssh-keygen  # 生成的私钥文件~/.ssh/id_rsa  公钥文件~/.ssh/id_rsa.pub

# 复制公钥
clip < ~/.ssh/id_rsa.pub  # 或者下面的命令或者直接打开目录找到文件,编辑器中打开复制
cat ~/.ssh/id_ed25519.pub | clip

ssh密钥登录过程

SSH 密钥登录分为以下的步骤。

预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。

第一步,手动将客户端的公钥放入远程服务器的指定位置。

第二步,客户端向服务器发起 SSH 登录的请求。

第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。

第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。

第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

github中添加ssh key就可以拉代码免登录了

Last updated: