RSA算法
一.基础知识
1.互质的关系
2.取余操作
\(a\ mod\ b =3\)
\(a\ \equiv\ 3(mod\ b)\)
java/python代码
a%b = 3
3.欧拉函数
定义-给定正整数n,小于n的正整数中有多少个与n互质?
4.欧拉函数的性质
\(4.1.\phi(1)=1\)
\(4.2.如果n是质数,\phi(n)=n-1\)
\(4.3.如果n分为 n=p^k,p是质数,phi(p^k) = (p)^k - (p-1)^k =(p^k)(1-\frac{1}{p})\)
\(比如\phi(8)=\phi(2^3) = 2^3-2^2 =4\)
\(4.4.如果n分为两个"互质的"质数相乘 n=p_1 * p_2 ,则\phi(p_1 p_2)=\phi(p_1)\phi(p_2)\)
\(比如\phi(56)=\phi(7)\phi(8)\)
\(4.5.任意n可以写成几个质数的乘数 n=p1^{k_1}p2^{k_2}....\)
\(\phi(n)=\phi(p_1^{k_1})\phi(p_2^{k_2})...... = [(p_1)^{k_1} - (p_1-1)^{k_1}] [(p_2)^{{k_2}} - (p2-1)^{k_2}] ... = p_1^{k_1} p_2^{k_2} ... (1-\frac{1}{p_1})(1-\frac{1}{p_2})\)
\(=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})....\)
5.欧拉定理
\(若a,n互质,a^{\phi(n)} = 1 (mod\ n)\)
6.费马小定理
\(在欧拉定理的基础上,若n为质数,a^{n-1} = 1 (mod\ n)\)
7.模逆,模反的概念
\(若a,n互质则必然有 b,a,b互为模反元素\)
\(ab \equiv 1(mod\ n) ,a,n互质\)
模逆的存在性
\(a^{\phi(n)} = 1 (mod\ n) -> a * a^{\phi(n)-1} = 1 (mod\ n)\)
\(b= a^{\phi(n)-1} 必然存在b\)
二.RSA算法流程
1.选两个质数 p q
2.n=p * q
3.计算欧拉函数 phiN = phi n = (p-1)(q-1)
4.选一个与phiN 互质的数 e 一般选 65537
5.计算e 对于 phiN的模反 d
\(ed=1(mod\ phiN)\)
\(d=a^{\phi(phiN)-1}\)
至此我们得到有以下参数
参数 | 含义 |
---|---|
\(p\) | 质数 |
\(q\) | 质数 |
\(dp\) | \(=p-1\) |
\(dq\) | \(=q-1\) |
\(n\) | \(= p * q\) |
\(phiN\) | \(= \phi(n) = (p-1)(q-1)\) |
\(e\) | \(与phiN 互质,一般取 65537\) |
\(d\) | 与\(e\)互为模逆 |
结果
公钥(n,e)
私钥(n,d) 或者 (n,p,q)
加密,解密过程
\(m-明文\)
\(c-密文\)
加密
\(c = m^e mod\ n\)
解密
\(m = c^d mod\ n\)
证明过程
待补充
加解密思考
攻击方只有公钥 (n,e),攻破私钥,需要参数d或者phiN,此时就需要因式分解得到 p 和 q才能得到phiN,d
因此是否能攻破私钥取决于质数因数分解的效率
待遗留的事项
1.欧拉函数性质证明
\(如果n分为 n=p^k,p是质数,phi(p^k) = (p)^k - (p-1)^k =(p^k)(1-1/p)\)
\(如果n分为两个"互质的"质数相乘 n=p1 * p2 ,则phi(p1 p2)=phi(p1)phi(p2)\)
2.欧拉定理证明
3.模反计算
辗转相除法/扩展欧几里德算法
4.最后加密算法怎么优化-蒙哥马利幂模运算
\(c = m^e\ mod\ n , e是一个质数\)
python RSA 代码
点击查看代码
# -*- coding: utf-8 -*-
if __name__ == "__main__":
p = 103 # P Q都是质数
q = 107
N = p * q
M = (q - 1) * (p - 1)
PublicEnKey = 47 # 找一个与M互为质数的整数
print("p=" + str(p))
print("q=" + str(q))
print("N=" + str(N))
print("M=" + str(M))
print("PublicEnKey=" + str(PublicEnKey))
PrivateDeKey = 0
for i in range(1, 10000):
x = (PublicEnKey * i) % M
y = 1
if x == y:
PrivateDeKey = i
print("PrivateDeKey=" + str(PrivateDeKey))
text = 2440
print("Text=" + str(text))
# EncryptÏ
enText = text ** PublicEnKey % N
print("EnCryptedText=" + str(enText))
# Decrypt
deText = enText ** PrivateDeKey % N
print("DeCryptedText=" + str(deText))