文章最后更新时间为: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