加密密匙和解密密匙使用的是相同的密碼體制。html
RSA密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密算法是公開的。 由公鑰加密的內容能夠而且只能由私鑰進行解密,而且由私鑰加密的內容能夠而且只能由公鑰進行解密。也就是說,RSA的這一對公鑰、私鑰均可以用來加密和解密,而且一方加密的內容能夠由而且只能由對方進行解密。 算法
使用不一樣的加密密匙與解密密匙。這種密碼體制的產生是由於對稱密匙密碼體制的分配和數字簽名的需求。安全
在公鑰密碼體制中,加密密鑰PK(public key,即公鑰)是公開的,而解密密鑰SK(secret key,即私鑰)是須要保密的。假設A向B使用公鑰密碼體制發送消息,主要過程以下:服務器
做用:爲了向「客戶」證實本身是「服務器」, 「服務器」把一個字符串(也就是信息摘要)用本身的私鑰加密——即數字簽名,把明文和加密後的密文一塊兒發給「客戶」。網站
「客戶」收到信息後,她用本身持有的公鑰解密密文,和明文進行對比,若是一致,說明信息的確是由服務器發過來的。由於由「服務器」用私鑰加密後的內容,由而且只能由公鑰進行解密,私鑰只有「服務器」持有,因此若是解密出來的內容是可以對得上的,那說明信息必定是從「服務器」發過來的。加密
看別人的一個小例子:spa
注意上面的的信息 {你的餘額是100元}[私鑰],這個是「服務器」用私鑰加密後的內容,可是咱們以前說了,公鑰是發佈出去的,所以全部的人都知道公鑰,因此除了「客戶」,其它的人也能夠用公鑰對{你的餘額是100元}[私鑰]進行解密。因此若是「服務器」用私鑰加密發給「客戶」,這個信息是沒法保密的,由於只要有公鑰就能夠解密這內容。然而「服務器」也不能用公鑰對發送的內容進行加密,由於「客戶」沒有私鑰,發送個「客戶」也解密不了。操作系統
在實際的應用過程,通常是經過引入對稱加密來解決這個問題code
在上面的通訊過程當中,「客戶」在確認了「服務器」的身份後,「客戶」本身選擇一個對稱加密算法和一個密鑰,把這個對稱加密算法和密鑰一塊兒用公鑰加密後發送給「服務器」。注意,因爲對稱加密算法和密鑰是用公鑰加密的,就算這個加密後的內容被「黑客」截獲了,因爲沒有私鑰,「黑客」也無從知道對稱加密算法和密鑰的內容。htm
因爲是用公鑰加密的,只有私鑰可以解密,這樣就能夠保證只有服務器能夠知道對稱加密算法和密鑰,而其它人不可能知道(這個對稱加密算法和密鑰是「客戶」本身選擇的,因此「客戶」本身固然知道如何解密加密)。這樣「服務器」和「客戶」就能夠用對稱加密算法和密鑰來加密通訊的內容了。
RSA加密算法在這個通訊過程當中所起到的做用主要有兩個:
將消息哈希轉換成一個固定長度的值惟一的字符串。值惟一的意思是不一樣的消息轉換的摘要是不一樣的,而且可以確保惟一。該過程不可逆,即不能經過摘要反推明文(彷佛SHA1已經能夠被破解了,SHA2尚未。通常認爲不可破解,或者破解須要耗費太多時間,性價比低)。利用這一特性,能夠驗證消息的完整性。
「服務器」要對外發布公鑰,那「服務器」如何把公鑰發送給「客戶」呢?咱們第一反應可能會想到如下的兩個方法:
可是這個兩個方法都有必定的問題,
示意以下:
所以「黑客」只須要本身生成一對公鑰和私鑰,而後把公鑰發送給「客戶」,本身保留私鑰,這樣因爲「客戶」能夠用黑客的公鑰解密黑客的私鑰加密的內容,「客戶」就會相信「黑客」是「服務器」,從而致使了安全問題。這裏問題的根源就在於,你們均可以生成公鑰、私鑰對,沒法確認公鑰對究竟是誰的。 若是可以肯定公鑰究竟是誰的,就不會有這個問題了。例如,若是收到「黑客」冒充「服務器」發過來的公鑰,通過某種檢查,若是可以發現這個公鑰不是「服務器」的就行了。
爲了解決此問題,出現的數字證書。
數字證書能夠保證數字證書裏的公鑰確實是這個證書的全部者(Subject)的,或者證書能夠用來確認對方的身份。也就是說,咱們拿到一個數字證書,咱們能夠判斷出這個數字證書究竟是誰的
通訊過程:
「客戶」向服務端發送一個通訊請求:
「客戶」->「服務器」:你好
「服務器」向客戶發送本身的數字證書。證書中有一個公鑰用來加密信息,私鑰由「服務器」持有:
「服務器」->「客戶」:你好,我是服務器,這裏是個人數字證書
「客戶」收到「服務器」的證書後,它會去驗證這個數字證書究竟是不是「服務器」的,數字證書有沒有什麼問題,數字證書若是檢查沒有問題,就說明數字證書中的公鑰確實是「服務器」的。檢查數字證書後,「客戶」會發送一個隨機的字符串給「服務器」用私鑰去加密,服務器把加密的結果返回給「客戶」,「客戶」用公鑰解密這個返回結果,若是解密結果與以前生成的隨機字符串一致,那說明對方確實是私鑰的持有者,或者說對方確實是「服務器」。
「客戶」->「服務器」:向我證實你就是服務器,這是一個隨機字符串 //前面的例子中爲了方便解釋,用的是「你好」等內容,實際狀況下通常是隨機生成的一個字符串。
「服務器」->「客戶」:{一個隨機字符串}[私鑰|RSA]
驗證「服務器」的身份後,「客戶」生成一個對稱加密算法和密鑰,用於後面的通訊的加密和解密。這個對稱加密算法和密鑰,「客戶」會用公鑰加密後發送給「服務器」,別人截獲了也沒用,由於只有「服務器」手中有能夠解密的私鑰。這樣,後面「服務器」和「客戶」就均可以用對稱加密算法來加密和解密通訊內容了。
「服務器」->「客戶」:{OK,已經收到你發來的對稱加密算法和密鑰!有什麼能夠幫到你的?}[密鑰|對稱加密算法]
「客戶」->「服務器」:{個人賬號是aaa,密碼是123,把個人餘額的信息發給我看看}[密鑰|對稱加密算法]
「服務器」->「客戶」:{你好,你的餘額是100元}[密鑰|對稱加密算法]
假設咱們公司"ABC Company"花了1000塊錢,向一個證書發佈機構"SecureTrust CA"爲咱們本身的公司"ABC Company"申請了一張證書,注意,這個證書發佈機構"SecureTrust CA"是一個你們公認並被一些權威機構接受的證書發佈機構,咱們的操做系統裏面已經安裝了"SecureTrust CA"的證書。"SecureTrust CA"在給咱們發佈證書時,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式寫到證書裏面,而後用一個指紋算法計算出這些數字證書內容的一個指紋,並把指紋和指紋算法用本身的私鑰進行加密,而後和證書的內容一塊兒發佈,同時"SecureTrust CA"還會給一個咱們公司"ABC Company"的私鑰給到咱們。咱們花了1000塊錢買的這個證書的內容以下:
Issuer : SecureTrust CA Subject : ABC Company Valid from : 某個日期 Valid to: 某個日期 Public Key : 一串很長的數字 …… 其它的一些證書內容…… {證書的指紋和計算指紋所使用的指紋算法}[SecureTrust CA的私鑰|RSA]//這個就是"SecureTrust CA"對這個證書的一個數字簽名,表示這個證書確實是他發佈的,有什麼問題他會負責(收了咱們1000塊,
出了問題確定要負責任的)
咱們"ABC Company"申請到這個證書後,咱們把證書投入使用,咱們在通訊過程開始時會把證書發給對方,對方如何檢查這個證書的確是合法的而且是咱們"ABC Company"公司的證書呢?首先應用程序(對方通訊用的程序,例如IE、OUTLook等)讀取證書中的Issuer(發佈機構)爲"SecureTrust CA" ,而後會在操做系統中受信任的發佈機構的證書中去找"SecureTrust CA"的證書,若是找不到,那說明證書的發佈機構是個水貨發佈機構,證書可能有問題,程序會給出一個錯誤信息。 若是在系統中找到了"SecureTrust CA"的證書,那麼應用程序就會從證書中取出"SecureTrust CA"的公鑰,而後對咱們"ABC Company"公司的證書裏面的指紋和指紋算法用這個公鑰進行解密,而後使用這個指紋算法計算"ABC Company"證書的指紋,將這個計算的指紋與放在證書中的指紋對比,若是一致,說明"ABC Company"的證書確定沒有被修改過而且證書是"SecureTrust CA" 發佈的,證書中的公鑰確定是"ABC Company"的。對方而後就能夠放心的使用這個公鑰和咱們"ABC Company"進行通訊了。
密鑰分配中心(KDC),這是一個你們都信任的機構,其任務就是給須要進行祕密通訊的用戶臨時分配一個會話密鑰(僅使用一次),假設A和B都是KDC的登記用戶,A和B在KDC登記時就已經在KDC上安裝了各自和KDC進行通訊的主密鑰Ka和Kb,
若是每一個用戶都有其餘用戶的公鑰,就能夠實現通訊。
若是A想要欺騙B,A向B發送一份僞造是C發送的報文,A用本身的數字簽名和私鑰,並附上本身的公鑰,謊稱是C的,B如何知道這不是C的公鑰呢?
認證中心(CA)來發的證書包含公鑰的擁有者和標識信息,此證書被CA進行了數字簽名,任何用戶均可以從可信的地方得到CA的公鑰,來驗證某個公鑰是否爲某個實體全部