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))

posted @ 2021-12-15 17:32  筷点雪糕侠  阅读(192)  评论(0编辑  收藏  举报