RSA的python实现

一.完整代码

def gcd(a, b):
   if b == 0:
       return a
   else:
       return gcd(b, a % b)
def get_key(p, q):
   n = p * q
   N = (p - 1) * (q - 1)
   e = 2
   while gcd(e, N) != 1:
       e = e + 1
   d = 2
   while (e*d) % N != 1:
       d = d + 1
   return (n, e), (n, d)
def jiami(x, gongyao):
   n = gongyao[0]
   e = gongyao[1]
   y = x ** e % n
   return y
def jiemi(y, shiyao):
   n = shiyao[0]
   d = shiyao[1]
   x = y ** d % n
   return x
p = int(input("第一个质数p:"))
q = int(input("第二个质数q:"))
x = int(input("要加密的消息x:"))
gongyao, shiyao = get_key(p, q)
print("加密前:", x)
y = jiami(x,gongyao)
print("加密后:", y)
after_x = jiemi(y, shiyao)
print("解密后:", after_x)

二.解释

1.公约数

def gcd(a, b):
   if b == 0:
       return a
   else:
       return gcd(b, a % b)

  gcd()函数表示求两个数的公约数,首先定义一个def gcd(a, b)函数,利用该函数可以判断公钥对中(e,n)中的e与N的最大公约数是否为1。

2.得到密钥

def get_key(p, q):
   n = p * q
   N = (p - 1) * (q - 1)
   e = 2
   while gcd(e, N) != 1:
       e = e + 1
   d = 2
   while (e*d) % N != 1:
       d = d + 1
   return (n, e), (n, d)

e必须满足两个条件:e是一个比1大比N小的数,e和N的最大公约数为1;用while循环,直到取到合适的e值。

1<e<N
gcd(e,N)=1

利用取得的e值计算d:

1<d<N
e*d mod N=1

e,d求出,即公钥(e,n)与私钥(d,n)求出。

3.加解密

公钥和私钥已求出,利用:密文=明文EmodN密文=明文EmodN (加密)

明文=密文DmodN明文=密文DmodN (解密)

   注意  加密:准备的明文必须是小于N的数,因为加密或者解密都要 mod N,其结果必须小于N。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值