RSA 加密算法原理
前置知识
互质
两个正整数,除了1之外没有公共因子,那么就称这两个数互为质数。互质关系
欧拉函数
对于正整数
比如
欧拉函数的一些特性:
-
时, -
为质数时, -
为质数的幂时,比如 时有 这是因为当前仅当此数不包含质数 时,才互质,总数 减包含质数的个数 -
如果
可以被分解为两个互质数 的积,那么 ,证明见 中国剩余定理
欧拉定理
欧拉函数计算通式
因为任意一个正整数都可以写成一系列质数的积,所以对于
根据特性4有
使用上面的特性3,进一步等于
也就是
这个就是计算欧拉函数的通用公式。比如
欧拉定理和应用
如果两个正整数
即
证明比较复杂略过,应用上,欧拉定理可以简化一些特定的运算,比如求解
因为
和 互质,所以有 , 而 所以 ,
特殊的,当欧拉定理里的
模反元素(模逆元)
如果两个正整数
or:
此时就称
至此,所有需要了解的数学知识都在上面了,后面正式进入 RSA 算法的原理
公私钥生成过程
1. 随机生成两个质数 和
实际应用中,这两个质数是写成十进制都有几十位的非常大的质数,这里为了简单说明算法,我们挑选质数
2. 计算 和 的乘积
3. 满足一定条件挑选一个随机整数
需要有
首先计算一下
挑选了
4. 计算 对 的模反元素
即满足
等价于
也就是二元一次方程
5. 封装公私钥
实际情况中,公私钥的内容会按照 ASN.1 规范来编码。
公私钥安全证明
上面的例子里一共出现了6个数字:
有无可能在知道公钥
因为
而 想要算出欧拉函数
也就是说,能分解因数
这里举的简单例子里,
加密解密举例
公钥加密
假设有信息
- 必须是整数,字符串可以取 ascii 值等方法转换出数字表达
-
值必须小于
,虽然正式场合下的 确实很大,但还是限制了加密的内容长度不能太长。
加密,实际上就是计算出满足下面式子的
带入我们上面的例子:公钥
也就是
12**13 % 1517
423
这里直接用 python 算出来
私钥解密
加密使用私钥
带入上面例子里的:私钥
也就是
423**997%1517
12L
解除原文
可以看出想要解密就需要知道
实际应用:
实际情况中因为只能加密小于
- 把待加密消息分成若干段分别加密发送。
- 或者使用对称加密(比如AES)来加密原消息,使用 RSA 来加密 对称加密 的密钥
解密证明
上面的信息汇总:
-
公钥:
-
私钥:
-
加密
得到 : -
解密
得到 :
来证明一下为什么解密公式
证明过程
证明:
带入证明式子
分类讨论:
① 当
带入上述待证明式:
② 当
以
根据欧拉定理有
带入
原式得证。