RSA加解密算法数学基础及python实现
步骤一
Alice
与 Bob
协商会话密钥。采用公钥密码体系,通过自选密码库实现密钥协商,session key
长度 1024 bits
.
注:密钥协商所需公钥与私钥,采用两种方式生成:
1、密码库实现; 若 RSA
体系至少为 2048
级,ECC
至少为 512
级,比较 1
和 2
的时空复杂度。
在对称密码体制中,密钥分发过程复杂,代价高;密钥量增大造成密钥管理困难;保密通信系统的开放性差;如果收发双方素不相识,或没有可靠的密钥传递渠道,则无法通信;当用对称密码算法实现数字签名时,由于通信双方拥有相同的密钥,使得接收方可以伪造数字签名,发送方可以抵赖发送过的消息。由于上述的一系列原因,使得对称密码体制难以在保证通信的安全性、可靠性。公钥密码是由 Diffie 和 Hellman 在 1976 年首次提出,每个用户都有一对选定的密钥,私钥保密,公钥可以公开。目前多采用混合体制:用对称体制加密数据,用公钥密码体制加密对称密码体制短期所需的一个密钥来进行分发,既保证了效率,又提高了安全性。
pycrypto
库不是Python的内置模块,pycrypto
模块是一个实现了各种算法和协议的加密模块的结合,提供了各种加密方式对应的多种加密算法的实现,包括单向加密、对称加密以及公钥加密和随机数操作。但在包导入过程中发现这个库已经停止更新了,如果直接导入这个库,在运行程序时可能会出现一些错误。这里有一个pycrypto
库的衍生版本,PyCryptodome
库,是一个强大的加密算法库,可以实现现代密码学中常见的一些加密、签名等算法,并在此基础上增加了一些协议。其上手简单,各个算法之间独立性较强,且结构封装一致,对于初学者阅读源码及快速上手是一个比较好的选择。PyCryptodome
库主要模块包含有单向加密、对称加密、非对称加密和签名、流密码算法。该库里还增加了SecretShare
协议。
下载并导入该库
pip install pycryptodome
但是这里要去本地库文件中进行一下名字的修改,首先找到该库的安装目录(鼠标停留在包名上会自动显示安装路径)
找到其中的crypto
文件夹,将名字改为Crypto
,之后编译环境中的包就显示成功导入可以使用。
下面是使用 pycryptodome
库生成 RSA 公私钥对:
from Crypto.PublicKey import RSA
def generate_key(bits):
return RSA.generate(bits)
if __name__ == "__main__":
key = generate_key(2048)
# 生成私钥文件
sk = key.export_key()
with open('master-private.pem', 'wb') as f:
f.write(sk)
# 生成公钥文件
pk = key.publickey().export_key()
with open('master-public.pem', 'wb') as f:
f.write(pk)
2、不采用密码库或大数库;
使用python
实现RSA
加密算法,先简单的对其进行说明:
①RSA密钥生成
选择两个随机的大素数p
和q
,并计算n=pq
和φ(n)=(p-1)(q-1)
;
选择一个随机数e
,1<e<φ(n)
,满足gcd(e,φ(n))=1
,并计算ed ≡ 1 (mod φ(n))
;
此时得出,公钥为(e, n)
,私钥为d
。
这里关于e
的选择,理论计算是产生一系列的随机数,检验每一个是否和φ(n)
互素,直到找到了一个这样的数为止。在实践中,为了提高RSA
的加密速度,通常用的三个e
值为3
、7
和65537
。X.509
中建议采用65537
,PEM
建议采用3
,PKCS#1
中建议采用3
或65537
。
②RSA加密
加密公式为c≡ m^e(mod n)
,m
明文需要满足0≤m<n
的条件,所以在加密前要对明文比特串分组,然后对每一个分组进行加密,最后得到所有分组的密文,这些密文构成的序列即明文加密的结果。
③RSA解密
解密公式为m≡ c^d(mod n)
,每组的密文c
要求同样需满足0≤c<n
。
这里选取小数据对上述的 RSA
算法进行说明:
产生密钥:Alice 选取素数 p = 2357 和 q = 2551,计算 n = pq = 6012707,𝜑(n) = (p −1)(q −1) = 6007800
Alice选取 e = 3674911,并运用欧几里德算法求出 d = 422191,使得 ed ≡ 1 (mod 𝜑(n))
Alice的公钥是 n = 6012707, e = 6374911 ,私钥 d = 422191
加密过程:加密信息为 m = 5234673,发送者 Bob 计算
c ≡ m^e (mod n) ≡ 5234673^6374911 (mod 6012707