Https中公私钥加密算法和其使用的RSA算法分析
學(xué)習(xí)Https原理的過程中,對(duì)公鑰證書和私鑰證書交換的過程、公鑰算法、公鑰證書、RSA算法進(jìn)行了的學(xué)習(xí)。下面主要是對(duì)公鑰加密和RSA算法的分析。分析過程并沒有覆蓋https的方方面面,只是自己的一個(gè)筆記,希望在公私鑰加密中使用的RSA算法方面,能對(duì)大家有所幫助。
Public Key Encryption(公鑰加密)
公鑰加密有兩種用途:
Public key encryptography accomplishes two functions:
認(rèn)證過程https中APP客戶端通過公鑰證書中的publicKey驗(yàn)證服務(wù)器是否是希望訪問的服務(wù)器。
公鑰加密和數(shù)字簽名的區(qū)別
公鑰加密(public key encryption) 和 數(shù)字簽名(digital signatures)不是一回事,他們是兩種不同的公鑰加密算法(public key encryptography)。
- 作用:
- 加密 key pair的所有者(sender,S)將public key發(fā)送給使用者(recipient,R),R使用public key加密需要傳送給S的消息,然后發(fā)送給S。這個(gè)消息因?yàn)槭褂昧藀ublic key進(jìn)行了加密,任何人都不可能解密消息,除了private key的所有者S。這就保證了消息的安全性。
- 缺陷:
public key encryption本身并不能完成以下事項(xiàng):- 不能保證使用者拿到的是真正sender的public key,有可能拿到的是MITM攻擊者的public key。
- public key并不用來(lái)對(duì)sender發(fā)出的消息進(jìn)行任何處理,所以public key與sender所發(fā)出消息的安全性沒有關(guān)系,即不能通過public key保證發(fā)送給R的消息不被破解
- public key僅用來(lái)加密R發(fā)送回S的消息,保證發(fā)送回的消息是不能被破解的。
- public key和消息是一起發(fā)送給對(duì)方的,無(wú)法保證public key和消息是原配,中間過程中兩個(gè)東西有可能其中一個(gè)被篡改了。 綜上所述,如何保證給到使用者的public key是真的,以及所有者發(fā)送給使用者的消息不被破解,需要額外的加密方法。
a message is signed with the sender's private key and can be verified by anyone who has access to the sender's public key. This verification proves that the sender had access to the private key, and therefore is likely to be the person associated with the public key.
- 解決的主要問題是驗(yàn)證消息是否被改動(dòng)。
- 間接解決了public key encryption不能保證public key和消息是原配的問題
- 數(shù)字簽名可以保證消息沒有被改動(dòng)過,任何改動(dòng)均會(huì)造成簽名失效。S發(fā)送的消息經(jīng)過private key數(shù)字簽名后,用public key可以驗(yàn)證簽名的有效性,如果簽名有效,即保證消息是由private key的所有者發(fā)出的。
- 數(shù)字簽名的根本是將消息和key關(guān)聯(lián)起來(lái)。
RSA算法
Key Generation
RSA的基礎(chǔ): 如果兩個(gè)正整數(shù)a和n互質(zhì),則n的歐拉函數(shù) φ(n) 可以讓下面的等式成立:
歐拉函數(shù) φ(n)定義: 任意給定正整數(shù)n,請(qǐng)問在小于等于n的正整數(shù)之中,有多少個(gè)與n構(gòu)成互質(zhì)關(guān)系?計(jì)算這個(gè)結(jié)果的函數(shù)就叫歐拉函數(shù).RSA算法的關(guān)鍵:φ(n)的值,如果φ(n)計(jì)算出來(lái)了,就破解了。
n的選擇
-
為什么n的取值為兩個(gè)質(zhì)數(shù)的乘積,而不是直接隨機(jī)選取一個(gè)大整數(shù)?
因?yàn)樽鳛樗借€的d是通過求取n的歐拉函數(shù)得到的,所以有以下幾點(diǎn)不能直接選取n,而采取n=p*q的方式得到。直接獲取n,如果n是質(zhì)數(shù),那么n的歐拉函數(shù)就等于 φ(n)=n-1,那么私鑰d直接就被破解了,所以n絕對(duì)不能是一個(gè)質(zhì)數(shù)。如果直接選取一個(gè)極大的正整數(shù)作為n,那就要保證n不能是質(zhì)數(shù)。
但是直接選取n還有一個(gè)更大的問題,私鑰的d無(wú)法通過計(jì)算得到。因?yàn)閷?duì)于破解者因數(shù)分解是極其困難的,同樣對(duì)于生成秘鑰的人也是極其困難的。
所以就需要一種方式,讓破解者計(jì)算n的歐拉函數(shù)(即對(duì)n進(jìn)行因式分解)極其困難,而秘鑰生成者極容易計(jì)算。
綜上所述,產(chǎn)生了目前n的計(jì)算方式 n=p*q;p和q是兩個(gè)極大的質(zhì)數(shù)。因?yàn)棣?n)=(p-1)(q-1),所以秘鑰生成者很容易計(jì)算出n的歐拉函數(shù)。而破解者因?yàn)椴恢纏和q的數(shù)值,所以必須暴力進(jìn)行因數(shù)分解,從而使得破解極其困難。
e和(n)為什么要互質(zhì)?
根據(jù)歐拉定理,a和n必須互質(zhì),在RSA中,a=e,n=φ(n),所以這兩個(gè)數(shù)值必須是互質(zhì)的。
e為什么要小于(n)?
未知。
為什么選取φ(n)作為歐拉定理中的n?
如果RSA中,不使用e和φ(n)作為互質(zhì)的兩個(gè)元素,而使用e和n作為互質(zhì)的兩個(gè)元素。那么在公布公鑰(e,n)之后,d極容易被破解。
因?yàn)闅W拉定理
可以表示為通過上面的等式可以發(fā)現(xiàn),d有兩種計(jì)算方式:
第一種:
通過如下公式:
第二種:
可以通過擴(kuò)展歐幾里得算法求二元一次方程e·d-1=kn,e和n已知。這種方式因?yàn)閑和n均為已知量,所以很容易求得d。
綜上所述,如果直接用n作為歐拉定理中的n,那么因?yàn)楣€提供了e和n的值,私鑰的極容易通過上面的第二種方法計(jì)算得到,從而被破解。所以不能直接使用n作為互質(zhì)數(shù)值中的一個(gè),而應(yīng)該采用φ(n)和e配對(duì)。采用φ(n)的情況下,第二種方式就無(wú)法計(jì)算出d的值,從而保證d在任何情況下都極不容易被破解。
Encryption and Decryption
因?yàn)楦鶕?jù)歐拉定理得到的三個(gè)數(shù)值n,d,e,可以使上面兩個(gè)公式同時(shí)成立,并能夠保證d的不可破解性。
因?yàn)樯厦娴膬蓚€(gè)公式中的n,d,e,必須是由key generation中的方式得到時(shí),兩個(gè)公司才成立。所以根據(jù)公式,n,d,e被分為了兩組(e,n)和(d,n)。那為什么選擇(e,n)為公鑰呢?顯而易見,d是破解這種加密方式的關(guān)鍵,所以d一定是需要保存在安全位置的數(shù)值,那(d,n)就不可能作為公鑰,而只能作為私鑰。
最后來(lái)個(gè)項(xiàng)目自薦
- 一個(gè)為Android系統(tǒng)源碼,JDK源碼,OkHttp源碼等,進(jìn)行注釋的項(xiàng)目,主要是對(duì)源碼的一種學(xué)習(xí):github.com/kishimotoin… ,做過注釋的類在commit里可以看到。覺得好可以給顆星,多謝啦!
總結(jié)
以上是生活随笔為你收集整理的Https中公私钥加密算法和其使用的RSA算法分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【技能】小白耳机维修入门--各种耳机插头
- 下一篇: POJ4084: 拓扑排序