欧几里得算法及其扩展,RSA 算法
一、前言
2018年9月24日,阿蒂亚爵士完成黎曼猜想证明的演讲(黎曼猜想证明现场:3分钟核心讲解 提问陷沉默)。证明正确与否自有专业人士来解读,但其中涉及到的一些数学知识很有意思。对整数做因数分解是很困难的事情,所以人们把两个大质数相乘的乘积公开作为加密密钥,即RSA算法的原理。而RSA算法又使用到欧几里得算法的扩展,记一下。
二、欧几里得算法
欧几里得算法,又名辗转相除法,此算法可以求两个整数的公约数。例如 a = 1251 和 b = 390 两个数,计算过程如下:
1 | a b mod |
代码实现见 辗转相除法
三、扩展欧几里德算法
扩展欧几里得算法 是这样一个问题:
其中 gcd(a,b)
是a和b的最大公约数,求解x和y,使等式成立。
如对 43x+17y=1
的求解过程如下:
1 | 43 = 17 x 2 + 9 |
将上述等式倒过来:
1 | 9 = 8 x 1 + 1 |
为实现 ax + by = 1
,取值如下:
1 | a b x y |
将等式写为与原等式类似的格式:
1 | 9 + 8 x (-1) = 1 等式 1 |
将等式 2 和等式 3 代入到等式 1 中:
1 | 43 + 17 x (-2) + (17 + 9 x (-1)) x (-1) = 1 |
可以得到最终的结果如下:
1 | 43 17 2 -5 |
代码实现见 扩展欧几里得算法
四、RSA算法
RSA算法 是一种非对称加密算法,主要有3个作用:加密、解密和签名。
得到公钥和私钥的过程,在 RSA算法原理(二) 里有详细的阐述。我用go实现的demo如下:
1 | func rsa() (int, int, int) { |
代码实现见 RSA算法示例。
输出结果类似于如下:
1 | public key = 3,private key = 7,length = 33 |
以上是原理实现的demo,这里的公钥和私钥都是很小的质数。如果试着把p和q放大,会发现加密和解密时的复杂度快速提高,甚至int64类型的数字溢出了。应用到实际上,公钥和私钥都是很大的质数,一般是1024位,重要场合则为2048位。
五、参考链接
欧几里得算法及其扩展,RSA 算法