python语言实现rsa公钥密码算法_python实现RSA算法

文章最后更新时间为:2018年12月26日 23:07:29

RSA是一种公钥密码算法,其影响力我就不多说了,算法原理网上多的是,看了几篇,还是觉得阮一峰写的好懂。

要想实现RSA,其关键在于大数运算,无论是大数之间的加减乘除还是模幂运算,都是普通的数据结构无法完成的,如果你是使用C语言来实现,那么你还需要首先解决五百位数字的加减乘除问题。

但是python语言有个好处,就是自动实现大数运算,其数据结构是不限制位数的。比如>>> x = 99999999999999999999999999999999999999999999999999

>>> x += 1

>>> x

100000000000000000000000000000000000000000000000000

>>> print(999**999)

36806348825922326789470084006052186583833823203735320465595962143702560930047223153010387361450517521869134525758989639113039318944796977164583238219236607653663113200177617597793217865870366077846576581183082787698201412402294867197567813172495806442794

但是如果用C语言就需要自己造轮子,手动构造函数实现大数运算。

没有大数运算的麻烦,实现RSA就简单的多了。现在思考一下,我们还有两个问题。怎么产生一个大素数

怎么实现大数的模幂运算

接下来我们就来一一解决这两个问题。

1.实现大数的模幂运算

为什么先解决这个呢,因为大素数的产生需要用到这个函数,所以我们首先实现大数的模幂运算。

先来考虑一个简单的问题,怎么计算 3 ^ 13 (mod 9)?

那还用想?直接用计算机算 3 ^ 13 不就好了,但是如果是33333 ^ 1333333333呢,这计算机得算到什么时候,所以我们得想个法子减少计算量。

这里要利用到我们所熟知的两个公式

(a * b) (mod n) = a (mod n) * b (mod n)

a ^ (b+c) = a^b * a^c

那么上面的13 = 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0。3^13就可以转化为3^(1*2^3) * 3^(1*2^2) * 3^(0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA算法是一种非对称加密算法,它的安全性基于大数分解的困难性。下面是Python实现RSA算法的步骤: 1. 选择两个大素数p和q,计算它们的乘积n=p*q。 2. 计算欧拉函数φ(n)=(p-1)*(q-1)。 3. 选择一个整数e,1<e<φ(n),且e与φ(n)互质。 4. 计算e关于模φ(n)的乘法逆元d,即满足e*d≡1(mod φ(n))的最小正整数d。 5. 公钥为(n,e),私钥为(n,d)。 6. 加密明文m,得到密文c,c=m^e(mod n)。 7. 解密密文c,得到明文m,m=c^d(mod n)。 下面是Python实现RSA算法的代码: ```python import random # 判断一个数是否为素数 def is_prime(n): if n <= 1: return False for i in range(2, int(n**0.5)+1): if n % i == 0: return False return True # 判断两个数是否互为素数 def is_coprime(a, b): while b != 0: a, b = b, a % b return a == 1 # 欧几里得算法求最大公约数 def gcd(a, b): while b != 0: a, b = b, a % b return a # 扩展欧几里得算法求模逆 def exgcd(a, b): if b == 0: return 1, 0, a x, y, d = exgcd(b, a % b) return y, x - a // b * y, d # 产生公私钥 def gen_key(p, q): n = p * q phi = (p - 1) * (q - 1) e = random.randrange(1, phi) while not is_coprime(e, phi): e = random.randrange(1, phi) d, _, _ = exgcd(e, phi) return (n, e), (n, d) # 加密明文 def encrypt(m, public_key): n, e = public_key c = pow(m, e, n) return c # 解密密文 def decrypt(c, private_key): n, d = private_key m = pow(c, d, n) return m # 测试代码 if __name__ == '__main__': p, q = 61, 53 public_key, private_key = gen_key(p, q) m = 123456789 c = encrypt(m, public_key) m1 = decrypt(c, private_key) print('p =', p) print('q =', q) print('public key =', public_key) print('private key =', private_key) print('m =', m) print('c =', c) print('m1 =', m1) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值