一、非对称加密
1.对称加密
- 对称密码的核心是一把密钥,使用相同的密钥进行加密和解密。
- 如移位密码、
S-DES
- 但密匙本身也是信息,对称密码中它的安全得不到保障。
2.非对称加密
-
非对称密码的核心是公钥和私钥。
-
公钥是用于加密数据的密钥,而私钥则用于解密数据
-
发送方使用接收方的公钥来加密,接收方使用自己的私钥来解密
-
公钥公开,只要私钥保密即可
-
如
RSA
,相对来说更安全
二、RSA
1.算法思想
- RSA算法是一种非对称加密算法,其核心思想建立在数学上的“大整数分解”的难度性之上。
- 主要思想是基于两个大质数的乘积很容易计算,但是从乘积中分解出这两个质数却非常困难。
2.公钥私钥的生成
- 选择两个大素数
p
和q
,并计算它们的乘积n=p*q
- 计算n的欧拉函数
φ(n)=(p-1)*(q-1)
- 选择一个小于φ(n)且与φ(n)互质的整数
e
作为公钥指数 - 扩展欧几里德计算e的模反元素
d
,使得(d * e) mod φ(n) = 1
- 公钥是
(n, e)
,私钥是(n, d
)
- 明文长度小于
n
- P和Q通常是相近长度的大素数
- p和q的值往往较大,通常超过
2048
位或更大的数字(否则易破解)- 通常,e可以选为固定值
65537
(随机生成的可能不够随机,可能造成私钥泄漏)- 加密时可以对消息进行填充处理,避免一些攻击
3.加密和解密
- 要加密一个明文m,使用公式
c = m^e mod n
,其中c是密文 - 要解密一个密文c,使用公式
m = c^d mod n
,其中m是明文
- 加密必须用公钥,解密必须用配套密钥
- RSA算法中的指数函数(加密)和对数函数(解密)都具有单向性质,也就是难以逆推。
- 公钥和私钥的功能是由数学特性和限制决定的。
三、python简单实现
import random
from sympy import isprime
def modinv(a, m):
"""计算a关于模数m的模反元素"""
def egcd(a, b):
"""扩展欧几里得算法,用于计算最大公约数和系数"""
if a == 0: