# 分解模数n
def rsa_moder(n):
base = 2
while base < n:
if n % base == 0:
return base, n // base
base += 1
# 求欧拉函数f(n)
def rsa_get_euler(prime1, prime2):
return (prime1 - 1) * (prime2 - 1)
# 求私钥
def rsa_get_key(e, euler):
k = 1
while True:
if (((euler * k) + 1) % e) == 0:
return (euler * k + 1) // e
k += 1
# 根据n,e计算d(或根据n,d计算e)
def get_rsa_e_d(n, e=None, d=None):
if e is None and d is None:
return
arg = e
if arg is None:
arg = d
primes = rsa_moder(n)
p = primes[0]
q = primes[1]
d = rsa_get_key(arg, rsa_get_euler(p, q))
return d
def test():
str_fmt = 'n: {:<10} e: {:<10} d: {:<10}'
# 导入rsa库
import rsa as rsa
key = rsa.newkeys(24)
# 产生rsa密钥对
if isinstance(key[1], rsa.PrivateKey):
print(str_fmt.format(key[1].n, key[1].e, key[1].d))
# 解密
n = 14666299
d = 2101153
e = get_rsa_e_d(n, None, d)
print(str_fmt.format(n, e, d))
n = 12748507
e = 65537
d = get_rsa_e_d(n, e, None)
print(str_fmt.format(n, e, d))
if __name__ == '__main__':
test()