壹 非对称加密算法介绍
对称加密目前存在的问题以下两个问题:
- 密钥管理困难,因为与每个人进行信息加密交流都需要一个密钥对,这时候如果上百万个人就会非常多,管理起来非常复杂
- 密钥分发困难,如果两个人相隔千里,那么要分发的话,相对比较困难
为了解决这两个问题,就出现了非对称加密算法。与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
特点:
- 优点:加密强度高,因为密钥比对称加密的长度长
- 缺点:加密效率低,加密解密速度慢
对称加密与非对称加密区别:
- 对称加密相较于非对称加密加密效率要快,但是由于对称加密的两个缺陷,导致非对称加密在安全性上要比对称加密强。
- 对称加密的密钥最有一个,是不能公开的,只能自己和对方保管,加密和解密都需要这个密钥,而非对称加密的密钥有两个,分别是公钥和私钥,公钥可以被所有人知道,私钥只能自己知道,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。非对称加密的公私钥虽然都可以加解密,但是一般情况下,都是使用公钥加密,私钥解密。
使用场景:
- 通信加密,一般使用私钥加密,公钥解密
- https,验证网站是否为官方网站
- 签名,为了防篡改
- 网银U盾,用于验证客户端一般私钥做U盾,公钥在服务器
secure shell
登录,就是ssh
免密登录
贰 RSA——RSA算法
2.1 概念
RSA算法是一种非对称加密算法,它的名字由三位开发者。即RonRivest
、AdiShamir
和LeonardAdleman
的姓氏的首字母组成的(Rivest-Shamir-Leonard
)。RSA的安全性主要是基于对大数进行因式分解,这个大数是两个素数的乘积得到的。这种方法公认很难被快速的分解。
- OpenSSL是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。我们也可以使用OpenSSL生成RSA公私密钥:
# 目前主流密钥长度至少都是1024bits以上,低于1024bit的密钥已经不建议使用(安全问题) # genrsa子命令主要用于生成RSA私钥 OpenSSL> genrsa -out rsa_private_key.pem 1024 #生成私钥,1024是密钥长度 # 可以不指定私钥长度,默认是2048位,长度建议1024以上,这样安全! ! # rsa子命令主要用于处理RSA公私钥文件 > rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥 openSSL> exit #退出OpenSSL程序
2.2 原理分析
这里我们使用公钥进行加密,私钥进行解密来阐述!
2.2.1 RSA算法加密简单介绍
RSA加密过程可以使用以下公式来表达:
$$
密文 = 明文^E mod N(RSA加密)
$$
可以看出RSA的加密就是明文(这里的明文是数字值,它与实际被加密的数据进行一一对应,这个对应会有一个字符对应表进行比对)的E(Encrypt)次方除以N取余数,这个余数就是密文,因此只需要知道E和N这两个数,即可进行RSA加密,而RSA的公钥就是由E和N的组合而成,所以公钥一般可以写成{E,N}
或者(E,N)
。
N
就是p
和q
两个素数的乘积(两个质数必须保密),E
是在1
到(p - 1)(q - 1)
之间并且与(p - 1)(q - 1)
得出的结果互质的数。
2.2.2 RSA算法解密简单介绍
RSA解密过程可以使用以下公式来表达:
$$
明文 = 密文^D mod N(RSA解密)
$$
可以看出RSA的解密就是密文的D(Decrypt)次方除以N取余数,这个余数就是明文(同样这里的明文也是数字值,它与实际被解密后的数据进行一一对应,这个对应会有一个字符对应表进行比对),同样只需要知道D和N这两个数,即可进行RSA加密,而RSA的私钥就是由D和N的组合而成,所以私钥一般可以写成{D,N}
或者(D,N)
。
N
就是两个素数的乘积(两个质数必须保密),D
是 $e^{-1}(mod(p-1)(q-1))$。
2.2.3 模指数运算
模指数运算是先做指数运算,取其结果再做模运算,而指数运算不用多说,例如:$2^3 = 8$、$3^5 = 243$,而模运算是以m mod n
的形式运算的,即让m
去被n
整除,只取所得的余数作为结果,就叫做模运算。例如:$10 mod 3 = 1$、$14 mod 3 = 2$,所以模指数运算的形式就是$5^3 mod 7 = 125mod7 = 6$。
2.2.4 RSA算法详细描述
RSA算法描述:
- 选择一对不同的且足够大的素数:
p
、q
- 计算两个素数的乘积
N
,即:$N = pq$ - 接着计算$f(N) = (p - 1)(q - 1)$,这里的
p
和q
不能被任何人知道 - 计算
E
,即找一个与f(N)
互质的数E
,且这个数E
需要在$1 < E < f(N)$之间 - 计算
D
,使得 $DE ≡ 1 mod f(N)$。这个公式也可以表达为$D ≡ E^{-1} mod f(N)$,≡
是数论中表示同余的符号,≡
符号的左边必须和符号右边同余,也就是说两边模运算结果相同 - 此时得到$公钥={E,N}$,$私钥={D,N}$
- 加密时,先将明文变换成
0
至n-1
的一个整数M
。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C
,则加密过程就是前面的RSA算法加密简单介绍 - 解密过程就是前面的RSA算法解密简单介绍
从上面我们可以看出如果我们知道公钥和两个素数,我们是可以推导出私钥的。
2.2.5 例子说明
假设两个素分别为p = 2
、q = 7
,那么$N = pq = 2 * 7 = 14$,接着$f(N) = (p - 1)(q - 1) = (2 - 1)(7 - 1) = 6$,然后E
在$1 < E< 6$区间里,即E = 5
(如果有多个互质的数,随便选一个),最后求D
,即$D ≡ 5^{-1} mod 6$,转换后就是$5 * D mod 6 ≡ 1$,我们可以列个表:
D |
E * D => 5 * D |
(E * D) mod (p - 1)(q - 1) => (5 * D) mod 6 |
---|---|---|
1 | 5 | 5 |
2 | 10 | 4 |
3 | 15 | 3 |
4 | 20 | 2 |
5 | 25 | 1(余数为1满足条件) |
通过运算得,当D = 5
时,E * D≡ 1 mod f(N)
同余等式成立。因此,可令D = 5
。从而我们得到的一对公私密钥,$公钥={E,N}={5,14}$,$私钥={D,N}={5,14}$。根据公式我们也可以发现,无论是E
或者D
,一定比N
小。
2.3 特点
- 解决了对称加密的两个问题
- 安全性较好,但效率较低
- 对于量大的数据,一般需要预先进行数据分割
- 由一对密钥对组成,公钥可以公开,私钥必须保存