安全(一)— 完全理解RSA加密算法


RSA加密算法

RSA加密算法 是一種 非對稱加密算法,在公開密鑰加密和電子商業中被廣泛使用。例如:

  • 在HTTPS協議的加密層(SSL/TLS)作爲密鑰交換的方法
  • 支付寶支付API作爲簽名算法
  • 銀聯支付API作爲簽名算法
  • Secure Shell(安全外殼協議,簡稱SSH)是一種加密的網絡傳輸協議

非對稱加密算法

公開密鑰密碼學 (英語:Public-key cryptography,也稱 非對稱式密碼學 )是密碼學的一種算法,它需要兩個密鑰,一個是公開密鑰,另一個是私有密鑰;一個用作加密,另一個則用作解密。 使用其中一個密鑰把明文加密後所得的密文,只能用相對應的另一個密鑰才能解密得到原本的明文;甚至連最初用來加密的密鑰也不能用作解密。由於加密和解密需要兩個不同的密鑰,故被稱爲非對稱加密; 不同於加密和解密都使用同一個密鑰的對稱加密。雖然兩個密鑰在數學上相關,但如果知道了其中一個,並不能憑此計算出另外一個;因此其中一個可以公開,稱爲公鑰,任意向外發布;不公開的密鑰爲私鑰,必須由用戶自行嚴格祕密保管,絕不透過任何途徑向任何人提供,也不會透露給被信任的要通信的另一方。
在這裏插入圖片描述


工作原理

本質就是依賴於三個自然數:n,e,dn,e,dnndd 構成一個密鑰,nnee 構成另一個密鑰。對於n,d(n, d)n,e(n, e)這兩個密鑰,無論用哪個密鑰加密出來的密文都可以用另一個密鑰解開, 所以不必強調哪個用於加密,哪個用於解密,只要把一個公佈出去(稱爲公鑰),另一個自己藏着(稱爲私鑰)就行了。

根據這種特性,通常,

  • 使用 公鑰加密私鑰解密 ,實現 加密
  • 使用 私鑰加密公鑰解密 ,實現 數字簽名
  • 代替 密碼散列函數+Token,比如MD5、SHA2,做 消息認證
    (關於加密、數字簽名,消息認證可以期待下篇文章。)

關於

  1. 如何確定n,e,dn,e,d這三個自然數?
  2. 如何進行加密解密?
  3. 已知公鑰如何破解私鑰?

我們需要了解RSA加解密的數學原理,主要包括

  • 互質
  • 歐拉函數
  • 同餘
  • 歐拉定理
  • 模反元素
  • 擴展歐幾里得算法

數學原理

你可以快速瀏覽這些定理和性質,然後進入下一章節,筆者在下一章節回答上述三個問題的同時,儘可能地將所需定理和性質做出了明確標註,閱讀過程中可以隨時回過頭來確認。

因子

一個整數被另一整數整除,後者即是前者的 因子,如1、2、4、8都爲8的因子。

質數

大於1的自然數,除1和本身外沒有其他正因子,稱爲 質數

互質

兩個自然數,除1以外沒有其他公因子,則稱它們爲 互質

互質性質

根據以上定理可以得出以下幾個性質(並不止於以下性質)

  1. 任意兩個不相等質數一定互質(因爲質數的因子只有1和本身,如果不相等則公因子只有1)
  2. 1和任意自然數都互質(只有1是公因子)
  3. 一個數是質數,另一個數只要不是前者的倍數,則二者互質(質數的因子只有1和本身,如果後者的因子不包含這個前者,那麼二者公因子只有1)
  4. 兩個數,較大的數是質數,那麼二者互質(可由 互質性質3 得到)
  5. 兩個不等質數之 的因子有4個,即,1,兩個不等質數以及積本身(由 質數定理組合 可以得到)

歐拉函數

我們把用來表示“ 小於或等於nn的正整數中與nn互質的數的數目 ”的函數,稱爲歐拉函數,計作φ(n)\varphi(n)

歐拉函數性質
  1. nn是質數,那麼
    φ(n)=n1\varphi(n)=n-1
    互質性質4 可得。

  2. n=pqn=pq,且ppqq兩個不相等的質數,那麼
    φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1)
    證明:

    1. φ(n)\varphi(n),即求:小於等於的nn的正整數,有多少數與nn互質
    2. 逆向思考,可以先求:小於等於的nn的正整數,有多少數與nn不互質
    3. 由於pqp、qnn的質因子,所以,如果一個數不與nn互質,那麼這個數一定是ppqq的整數倍(由 互質性質5 得)
    4. 由於n=pqn=pq,所以,(n1)(n-1)中包含1q,2q,3q...(p1)q1q,2q,3q...(p-1)q,一共(p1)(p-1)qq的倍數;同時包含1p,2p,3p...(q1)p1p,2p,3p...(q-1)p,一共(q1)(q-1)pp的倍數
    5. 又因爲pqp、qnn的質因子,所以,nnpqp、q的最小公倍數,即,在小於等於nn的正整數中不存在pqp、q的其它公倍數
    6. 所以,小於等於的nn的正整數,有(p1)+(q1)(p-1)+(q-1)個數與nn不互質
    7. 所以,小於等於的nn的正整數,與nn互質的數有
      φ(n)=n1((p1)+(q1))φ(n)=pqpq+1φ(n)=(p1)(q1)\varphi(n)=n-1-((p-1)+(q-1))\\ \varphi(n)=pq-p-q+1\\ \varphi(n)=(p-1)(q-1)

同餘

兩個整數aabb,若它們除以正整數mm所得的餘數相等,則稱aabb對於模mm同餘,記作
a%m=b%m    ab(modm)a\%m=b\%m\implies a\equiv b(\bmod m)

同餘性質
  1. b<mb<m時,b=a%mb=a\%m
  2. 整除性ab(modm)ab=cm,cZa\equiv b{(\bmod {m})}\Rightarrow a-b=c*m,c\in \mathbb {Z} ,(即是說 a 和 b 之差是 m 的整數倍)
  3. 保持基本運算ab(modm)cd(modm)}{a±cb±d(modm)acbd(modm)\left.{\begin{matrix}a\equiv b{(\bmod {m})}\\c\equiv d{(\bmod {m})}\end{matrix}}\right\}\Rightarrow \left\{{\begin{matrix}a\pm c\equiv b\pm d{(\bmod {m})}\\ac\equiv bd{(\bmod {m})}\end{matrix}}\right.
    這性質更可進一步引申成爲這樣:
    ab(modm){anbn(modm),nZanbn(modm),nN0{\displaystyle a\equiv b{(\bmod {m})}\Rightarrow {\begin{cases}an\equiv bn{(\bmod {m})},\forall n\in \mathbb {Z} \\a^{n}\equiv b^{n}{(\bmod {m})},\forall n\in \mathbb {N} ^{0}\end{cases}}}
  4. 放大縮小底數 ,k爲整數,n爲正整數,(km±a)n(±a)n(modm){\displaystyle (km\pm a)^{n}\equiv (\pm a)^{n}{(\bmod {m})}}

同餘性質3、4 可以根據 同餘性質2 整除性來證明。

例如,證明:ab(modm)anbn(modm)a\equiv b{(\bmod {m})}\Rightarrow an\equiv bn{(\bmod {m})}
a=cm+b,cZan=(cm+b)nan=cnm+bnanbn(modm)a=c*m+b,c\in \mathbb {Z}\\ a*n=(c*m+b)*n\\ an=cn*m+bn\\ an\equiv bn(\bmod m)

其它可同理證明。

同餘性質 是證明RSA加解密的關鍵。


歐拉定理

對任何兩個互質的正整數aannn2n\geq2,有
aϕ(n)1(modn)a^{\phi(n)} \equiv 1(\bmod n)

費馬小定理

如果n是質數p,那麼
ap11(modp)a^{p-1} \equiv 1(\bmod p)
歐拉函數性質1 可得


模反元素

如果兩個正整數aann互質,那麼一定可以找到整數bb,使得ab1ab-1nn整除
ab1(modn)ab \equiv 1(\bmod n)
此時bb就是aa關於nn模反元素。由 歐拉定理 可證,bb一定存在。
aϕ(n)=a×aϕ(n)11(modn)a^{\phi(n)}=a \times a^{\phi(n)-1} \equiv 1(\bmod n)
aϕ(n)1a^{\phi(n)-1}就是aa關於nn模反元素bb 。模反元素可以通過 擴展歐幾里得算法 求得。


歐幾里得算法

定義

又稱 輾轉相除法 ,是求最大公約數(最大公因子)的算法。兩個整數a,ba, b的最大公約數,記作gcd(a,b)\gcd(a,b)

計算過程

前兩次餘數分別作爲被除數除數,得到新的餘數
ri+1=ri1qiri,(r0=a,r1=b)r_{i+1}=r_{i-1}-q_{i} r_{i},(r_{0}= a,r_{1}=b)
遞歸計算,直到 ri+1=0r_{i+1}=0,那麼此時 最大公約數gcd(a,b)=ri\gcd(a,b)=r_{i}

證明

證明,ri+1=0r_{i+1}=0時,rir_{i}a,ba,b最大公因子g=gcd(a,b)g=\gcd(a,b)

  1. 因爲a=mg,b=nga=mg,b=ng,所以r2=r0r1=aq1b=mgq1ngr_{2}=r_{0}-r_{1}=a-q_{1}b=mg-q_{1}ng,所以r0,r1,r2r_{0},r_{1},r_{2}可以被gg整除,同理(遞降歸納)可求所有餘數r0,r1...ri1,rir_{0},r_{1}...r_{i-1},r_{i}都可以被gg整除,所以grig\leq r_{i}
  2. ri+1=0r_{i+1}=0,有0=ri1qiri0=r_{i-1}-q_{i} r_{i},即rir_{i}整除ri1r_{i-1}
  3. 又當ri=ri2qi1ri1,(r0=a,r1=b)r_{i}=r_{i-2}-q_{i-1} r_{i-1},(r_{0}= a,r_{1}=b),又因爲rir_{i}整除ri1r_{i-1},那麼rir_{i}可以整除ri2r_{i-2},同理(遞降歸納),rir_{i}可以整除所有餘數r0,r1...ri2,ri1r_{0},r_{1}...r_{i-2},r_{i-1}
  4. 又因爲r0=a,r1=br_{0}= a,r_{1}=b,所以,此時rigr_{i}\leq g
  5. 結論,由於grig\leq r_{i},當ri+1=0r_{i+1}=0時,rigr_{i}\leq g,所以當ri+1=0r_{i+1}=0時,ri=gr_{i}= g

擴展歐幾里得算法

定義

顧名思義是 歐幾里得算法 的擴展。已知整數aba、b擴展歐幾里得算法 可以在求得aba、b的最大公約數的同時,能找到整數xyx、y(其中一個很可能是負數),使它們滿足 貝祖等式
ax+by=gcd(a,b)ax + by = \gcd(a, b)
在歐幾里得算法中,我們僅僅利用了每步帶餘除法所得的餘數。擴展歐幾里得算法還利用了帶餘除法所得的商,在輾轉相除的同時也能得到 貝祖等式

計算過程

擴展歐幾里得算法歐幾里得算法 的基礎上增加了兩個遞歸等式的計算
ri+1=ri1qiri,(r0=a,r1=b)si+1=si1qisi,(s0=1,s1=0)ti+1=ti1qiti,(t0=0,t1=1)r_{i+1}=r_{i-1}-q_{i} r_{i},(r_{0}= a,r_{1}=b)\\ s_{i+1}=s_{i-1}-q_{i} s_{i},(s_{0}= 1,s_{1}=0)\\ t_{i+1}=t_{i-1}-q_{i} t_{i},(t_{0}= 0,t_{1}=1)

遞歸計算,直到 ri+1=0r_{i+1}=0,那麼此時
gcd(a,b)=ri=asi+bti\gcd(a,b)=r_{i}=as_{i}+bt_{i}

證明

證明,ri=asi+btiiNr_{i}=as_{i}+bt_{i},i\in\N(已知條件爲上述三等式),使用 完整歸納法

  1. i=0i=0r0=as0+bt0=a1+b0=ar_{0}=as_{0}+bt_{0}=a*1+b*0=a
  2. i=1i=1r1=as1+bt1=a0+b1=br_{1}=as_{1}+bt_{1}=a*0+b*1=b
  3. 假設ri=asi+btiri1=asi1+bti1r_{i}=as_{i}+bt_{i},r_{i-1}=as_{i-1}+bt_{i-1}成立,那麼
    ri+1=ri1qiri=(asi1+bti1)qi(asi+bti)=a(si1qisi)+b(ti1qiti)=asi+1+bti+1r_{i+1}=r_{i-1}-q_{i} r_{i}\\ =(as_{i-1}+bt_{i-1})-q_{i}(as_{i}+bt_{i})\\ =a*(s_{i-1}-q_{i}s_{i})+b*(t_{i-1}-q_{i}t_{i})\\ =as_{i+1}+bt_{i+1}

所以ri=asi+btiiNr_{i}=as_{i}+bt_{i},i\in\N成立si,tis_{i},t_{i}滿足 貝祖等式

Python實現
 #python3.7
 def ext_euclid(a, b):
    r0, r1 = a, b
    s0, s1 = 1, 0
    t0, t1 = 0, 1

    if a * b == 0:
        raise Exception("a,b must be nonzero!")
    while r1 != 0:
        q = r0 // r1
        r0, r1 = r1, r0 - q * r1
        s0, s1 = s1, s0 - q * s1
        t0, t1 = t1, t0 - q * t1
    return r0, s0, t0
Java實現
  public BigInteger[] extEuclid(String a, String  b) {
        BigInteger r0 = new BigInteger(a), r1 = new BigInteger(b),
                s0 = BigInteger.ONE, s1 = BigInteger.ZERO,
                t0 = BigInteger.ZERO, t1 = BigInteger.ONE;
        if(r0.multiply(r1).equals(BigInteger.ZERO))
            throw new IllegalArgumentException("a,b must be nonzero!");

        BigInteger q;
        BigInteger intermediate;
        while (!r1.equals(BigInteger.ZERO)){
            BigInteger[] quotientAndRemainder = r0.divideAndRemainder(r1);
            q = quotientAndRemainder[0];
            r0 = r1;r1 =quotientAndRemainder[1];
            intermediate = s0 ;s0 = s1;s1=intermediate.subtract(s1.multiply(q));
            intermediate = t0 ;t0 = t1;t1=intermediate.subtract(t1.multiply(q));
        }
        return new BigInteger[]{r0,s0,t0};
    }

確定n,e,dn,e,d

  1. 選擇兩個 不等質數 p,qp,q,讓n=pqn=pq。假設p=17,q=23p=17,q=23,那麼 n=1723=391n=17*23=391
  2. 由上述 歐拉函數性質2 得,φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1)。我們隨機選擇一個數ee,保證1<e<φ(n)1<e<\varphi(n),同時保證,eeφ(n)\varphi(n)互質。那麼 φ(n)=(171)(231)=352\varphi(n)=(17-1)*(23-1)=352,隨機選擇e=57e=57
  3. ee關於φ(n)\varphi(n)模反元素dd ,即, ed1(modφ(n))edkφ(n)=1k,dZed\equiv1(\bmod\varphi(n))\Rightarrow ed-k*\varphi(n)=1,k,d\in\Z
    57d+352k1=157d + 352k_{1}=1
    根據 擴展歐幾里得算法 可求,(d,k1)=(105,17),d=105(d,k_{1})=(105,-17),d=105

加密解密

計算過程

明文mm密文cc,如果用(n,e)(n,e)加密,(n,d)(n,d)解密,過程如下:

  1. 加密公式mec(modn),m<nc<nc=me%nm^e\equiv c(\bmod n),m<n \xRightarrow{c<n} c=m^e\%n

  2. 解密公式cdm(modn),m<nm=cd%nc^d\equiv m(\bmod n),m<n \Rightarrow m=c^d\%n

  3. 已知 明文m=38m=38,用(n,e)=(391,57)(n,e)=(391,57)加密c=me%n=3857%391=327c=m^e\%n=38^{57}\%391=327

  4. 已知 密文c=327c=327,用(n,d)=(391,105)(n,d)=(391,105)解密m=cd%n=327105%391=38m=c^d\%n=327^{105}\%391=38

Python實現

#python3.7 注意,pow()當包含第三個參數時,指數不可爲負值
print(pow(38, 57, 391))
print(pow(327, 105, 391))

Java實現

System.out.println(BigInteger.valueOf(38).modPow(BigInteger.valueOf(57), BigInteger.valueOf(391)));
System.out.println(BigInteger.valueOf(327).modPow(BigInteger.valueOf(105), BigInteger.valueOf(391)));

證明

證明,已知加密公式mec(modn),m<nm^e\equiv c(\bmod n),m<n,證明解密公式cdm(modn),m<nc^d\equiv m(\bmod n),m<n成立。

  1. 根據已知條件,得出公式
    mec(modn),m<n3medcd(modn)    cdmed(modn)ed1(modφ(n))cdm1+kφ(n)(modn)    cdmmkφ(n)(modn)m^e\equiv c(\bmod n),m<n\xRightarrow{同餘性質3,保持基本運算}m^{ed}\equiv c^d(\bmod n)\\ \implies c^d\equiv m^{ed}(\bmod n)\\ \xRightarrow{ed\equiv1(\bmod\varphi(n))}c^d\equiv m^{1+k\varphi(n)}(\bmod n)\\ \implies c^d\equiv m*m^{k\varphi(n)}(\bmod n)

  2. mnm與n互質,mφ(n)1(modn)m^{\varphi(n)}\equiv 1{(\bmod {n})}(根據 歐拉定理
    1mφ(n)(modn)cdmmkφ(n)(modn)}3cdm(modn)\left.{\begin{matrix}1 \equiv m^{\varphi(n)}{(\bmod {n})}\\c^d\equiv m*m^{k\varphi(n)}(\bmod n) \end{matrix}}\right\}\xRightarrow{同餘性質3,保持基本運算}c^d\equiv m(\bmod n)

  3. mnm與n不互質

    1. 因爲mnm與n不互質,所以mnm與n,除1外有額外公共因子(根據 互質 定理)
    2. 因爲n=pqn=pq,所以nn有四個因子,1npq1、n、p、q(根據 互質性質5
    3. 又因爲m<nm<n,所以m=hph<q,hNm=hp,h<q,h\in\N^*m=hqh<p,hNm=hq,h<p,h\in\N^*
    4. 假設m=hph<q,hNm=hp,h<q,h\in\N^*,此時hqh與q互質(根據 互質性質4 ),同時因爲pqp與q互質,所以mqm與q互質。
    5. cdmmkφ(n)(modn)2mmk(p1)(q1)(modn)    m(mq1)k(p1)(modn)c^d\equiv m*m^{k\varphi(n)}(\bmod n)\\ \xRightarrow{歐拉函數性質2}m*m^{k(p-1)(q-1)}(\bmod n)\\ \implies m*(m^{q-1})^{k(p-1)}(mod n)
    6. mqmφ(q)1(modq)1mq11(modq)3(mq1)k(p1)1k(p1)(modq)2(mq1)k(p1)=1+tq,tNm與q互質\xRightarrow{歐拉定理} m^{\varphi(q)}\equiv 1(\bmod q)\\ \xRightarrow{歐拉函數性質1}m^{q-1}\equiv1(\bmod q)\\ \xRightarrow{同餘性質3}(m^{q-1})^{k(p-1)}\equiv 1^{k(p-1)}(\bmod q)\\ \xRightarrow{同餘性質2,整除性} (m^{q-1})^{k(p-1)}=1+tq,t\in\N
    7. 由4,5,6可得
      cdm(mq1)k(p1)(modn)(mq1)k(p1)=1+tq,tNm=hp,hN}    cd[hp(1+tq)](modn)    cd(hp+thpq)(modn),thN    cd(hp+thn)(modn),thN4,cdhp(modn)    cdm(modn)\left.{\begin{matrix}c^d\equiv m*(m^{q-1})^{k(p-1)}(mod n)\\ (m^{q-1})^{k(p-1)}=1+tq,t\in\N \\ m=hp,h\in\N^*\end{matrix}}\right\}\implies c^d\equiv [hp*(1+tq)](\bmod n)\\ \implies c^d\equiv (hp+th*pq)(\bmod n),th\in\N\\ \implies c^d\equiv (hp+th*n)(\bmod n),th\in\N\\ \xRightarrow{同餘性質4,放大縮小底數 }c^d\equiv hp(\bmod n)\\ \implies c^d\equiv m(\bmod n)

破解私鑰

假如我們已知公鑰(n,e)(n,e),所謂破解私鑰(n,d)(n,d),就是通過n,en,e,求出dd
已知ed1(modφ(n))ed\equiv 1(\bmod \varphi(n)),所以要求dd,先求φ(n)\varphi(n)
加密時我們通過p,qp,q計算出φ(n)\varphi(n),而破解時我們根本不知道p,qp,q,需要通過對nn進行 因數分解 求出φ(n)\varphi(n)
所以,要破解私鑰,就要對nn進行 因數分解nn越大破解越困難。
目前已破解748-bit的密鑰,如果你覺得1024-bit還不夠安全,你可以使用2048-bit的密鑰,如果未來它們也被破解了,你只需要增加到更大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章