简介
RSA是第一个安全,实用的公钥加密算法,已成为国家标准,是目前应用广泛的公钥加密体制,RSA的基础是数论的欧拉定理 ,它的安全性依赖于大整数因子分解的困难性,因为加解密次序可换,可用于加解密,可用于设计数字签名体制。
算法流程
- 选取两个安全的大素数p和q(其长度要足够长至少要是1024位)
- 计算乘积n = p * q, 计算phi(n) = (p-1)*(q-1),其中phi(n)为n的欧拉函数
- 随机选取整数e,作为公钥,要求满足gcd(e, phi(n)) =1 ,即e与phi(n)互素
- 用扩展欧几里得算法计算私钥d。满足d * e=1(mod phi(n)),e和n是公钥,d是秘钥。
我的代码是固定了公钥为65537,产生的两个大素数是通过Miller-Rabin算法进行塑素性检测并且产生素数p还有q。
核心代码及分析
首先是先产生两个大素数p和q,这里的核心代码是下面的代码,这里是根据消息的长度去产生p和q,怎么知道这两大数是个素数呢?就得通过Miller-Rabin概率素数测试算法,先判断一次费马小定理,满足的话就有可能是一个素数,然后再经过5次的Miller-Rabin素性测试,这样就可以很大概率说明其是素数,两次调用这样的过程就可以产生p和q。
#辗转相除法求最大公因数
def gcd(a, b):
if a > b: a, b = b, a
while b != 0:
a, b = b, a%b
return a
def isPrime(n):
"""
判断一个数是否为素数
厄拉托塞师除法
"""
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i== 0: