生活随笔
收集整理的這篇文章主要介紹了
四、非对称加密
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 非對稱加密也叫公鑰密碼: 使用公鑰加密, 使用私鑰解密
- 在對稱密碼中,由于加密和解密的密鑰是相同的,因此必須向接收者配送密鑰。用于解密的密鑰必須被配送給接收者,這一問題稱為密鑰配送問題。如果使用非對稱加密也可以稱為公鑰密碼,則無需向接收者配送用于解密的密鑰,這樣就解決了密鑰配送問題。可以說非對稱加密是密碼學歷史上最偉大的發明。
- 非對稱加密中,密鑰分為加密密鑰和解密密鑰兩種。發送者用加密密鑰對消息進行加密,接收者用解密密鑰對密文進行解密。要理解公鑰密碼,清楚地區分加密密鑰和解密密鑰是非常重要的。加密密鑰是發送者加密時使用的,而解密密鑰則是接收者解密時使用的。
- 也就是說,解密密鑰從一開始就是由接收者自己保管的,因此只要將加密密鑰發給發送者就可以解決密鑰配送問題了,而根本不需要配送解密密鑰。
- 非對稱加密中,加密密鑰一般是公開的。正是由于加密密鑰可以任意公開,因此該密鑰被稱為公鑰(publickey)。公鑰可以通過郵件直接發送給接收者,也可以刊登在報紙的廣告欄上,做成看板放在街上,或者做成網頁公開給世界上任何人,而完全不必擔心被竊聽者竊取。
- 當然,我們也沒有必要非要將公鑰公開給全世界所有的人,但至少我們需要將公鑰發送給需要使用公鑰進行加密的通信對象(也就是給自己發送密文的發送者)。
- 相對地,解密密鑰是絕對不能公開的,這個密鑰只能由你自己來使用,因此稱為私鑰(privatekey)。私鑰不可以被別人知道,也不可以將它發送給別人,甚至也不能發送給自己的通信對象。
- 公鑰和私鑰是一一對應的,一對公鑰和私鑰統稱為密鑰對(keypair)。由公鑰進行加密的密文,必須使用與該公鑰配對的私鑰才能夠解密。密鑰對中的兩個密鑰之間具有非常密切的關系(數學上的關系)一一因此公鑰和私鑰是不能分別單獨生成的。
1.非對稱加密通信流程
- 假設Alice要給Bob發送一條消息,Alice是發送者,Bob是接收者,而這一次竊聽者Eve依然能夠竊所到他們之間的通信內容。
- 在公非對稱加密通信中,通信過程是由接收者Bob來啟動的。
- 1.Bob生成一個包含公鑰和私鑰的密鑰對。
- 2.Bob將自己的公鑰發送給Alicea
- Bob的公鑰被竊聽者Eve截獲也沒關系。
- 將公鑰發送給Alice,表示Bob請Alice用這個公鑰對消息進行加密并發送給他。
- 3.Alice用Bob的公鑰對消息進行加密。
- 加密后的消息只有用Bob的私鑰才能夠解密。
- 雖然Alice擁有Bob的公鑰,但用Bob的公鑰是無法對密文進行解密的。
- 4.Alice將密文發送給Bobo
- 密文被竊聽者Eve截獲也沒關系。Eve可能擁有Bob的公鑰,但是用Bob的公鑰是無法進行解密的。
- 5.Bob用自己的私鑰對密文進行解密。
- 竊聽者Eve可能擁有Bob的公鑰,但是Bob的公鑰只是加密密鑰,而不是解密密鑰,因此竊聽者Eve就無法完成解密操作。
2.RSA
- 現在使用最廣泛的公鑰密碼算法一一RSA。RSA可以被用于非對稱加密和數字簽名。1983年,RSA公司為RSA算法在美國取得了專利,但現在該專利已經過期。
- RSA是一種非對稱加密算法,它的名字是由它的三位開發者,即RonRivest、AdiShamir和LeonardAdleman 的姓氏的首字母組成的(Rivest-Shamir-Leonard)。
2.1 RSA加密
- 在RSA中,明文、密鑰和密文都是數字。RSA的加密過程可以用下列公式來表達,如下:密文 = 明文 ^ E mod N (RSA加密)
- 也就是說,RSA的密文是對代表明文的數字的E次方求mod N的結果。換句話說,就是將明文自己做E次乘法,然后將其結果除以N求余數,這個余數就是密文。
- 對,就這么簡單。僅僅對明文進行乘方運算并求mod即可,這就是整個加密的過程。在對稱密碼中,出現了很多復雜的函數和操作,就像做炒雞蛋一樣將比特序列挪來挪去,還要進行XOR(按位異或)等運算才能完成,但RSA卻不同,它非常簡潔。
- 對了,加密公式中出現的兩個數一一一E和N,到底都是什么數呢?RSA的加密是求明文的E次方mod N,因此只要知道E和N這兩個數,任何人都可以完成加密的運算。所以說,E和N是RSA加密的密鑰,也就是說,E和N的組合就是公鑰。
- 不過,E和N并不是隨便什么數都可以的,它們是經過嚴密計算得出的。順便說一句,E是加密(Encryption)的首字母,N是數字(Number)的首字母。
- 有一個很容易引起誤解的地方需要大家注意一一E和N這兩個數并不是密鑰對(公鑰和私鑰的密鑰對)。E和N兩個數才組成了一個公鑰,因此我們一般會寫成 “公鑰是(E,N)” 或者 “公鑰是{E, N}" 這樣的形式,將E和N用括號括起來。
2.2 RSA解密
- RSA的解密和加密一樣簡單,可以用下面的公式來表達:明文 = 密文 ^ D mod N (RSA解密)
- 也就是說,對表示密文的數字的D次方求mod N就可以得到明文。換句話說,將密文自己做D次乘法,再對其結果除以N求余數,就可以得到明文。
- 這里所使用的數字N和加密時使用的數字N是相同的。數D和數N組合起來就是RSA的解密密鑰,因此D和N的組合就是私鑰。只有知道D和N兩個數的人才能夠完成解密的運算。
- 大家應該已經注意到,在RSA中,加密和解密的形式是相同的。加密是求 "E次方的mod N”,而解密則是求 "D次方的mod N”,這真是太美妙了。
- 當然,D也并不是隨便什么數都可以的,作為解密密鑰的D,和數字E有著相當緊密的聯系。否則,用E加密的結果可以用D來解密這樣的機制是無法實現的。
- 順便說一句,D是解密〈Decryption)的首字母,N是數字(Number)的首字母。
2.3 Go中生成公鑰和私鑰
package mainimport ("crypto/rsa""crypto/rand""crypto/x509""encoding/pem""os"
)// 參數bits: 指定生成的秘鑰的長度, 單位: bit
func RsaGenKey(bits int) error {// 1. 生成私鑰文件// GenerateKey函數使用隨機數據生成器random生成一對具有指定字位數的RSA密鑰// 參數1: Reader是一個全局、共享的密碼用強隨機數生成器// 參數2: 秘鑰的位數 - bitprivateKey, err := rsa.GenerateKey(rand.Reader, bits)if err != nil {return err}// 2. MarshalPKCS1PrivateKey將rsa私鑰序列化為ASN.1 PKCS#1 DER編碼derStream := x509.MarshalPKCS1PrivateKey(privateKey)// 3. Block代表PEM編碼的結構, 對其進行設置block := pem.Block{Type: "RSA PRIVATE KEY", //"RSA PRIVATE KEY",Bytes: derStream,}// 4. 創建文件privFile, err := os.Create("private.pem")if err != nil {return err}// 5. 使用pem編碼, 并將數據寫入文件中err = pem.Encode(privFile, &block)if err != nil {return err}// 6. 最后的時候關閉文件defer privFile.Close()// 7. 生成公鑰文件publicKey := privateKey.PublicKeyderPkix, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {return err}block = pem.Block{Type: "RSA PUBLIC KEY", //"PUBLIC KEY",Bytes: derPkix,}pubFile, err := os.Create("public.pem")if err != nil {return err}// 8. 編碼公鑰, 寫入文件err = pem.Encode(pubFile, &block)if err != nil {panic(err)return err}defer pubFile.Close()return nil}func main() {RsaGenKey(4096)
}
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----------BEGIN RSA PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuEDeTPbenFpRJ88WnQV7
fc74tmrsIKtrf/CV8x+LeN0fzcaBtnJeSpjrVtdS5hRxwm9szvxXbisvWTEhM/WX
uMgXt9xm/E8BwyOGwwE2DeKk+i3TOY7GPj1o9xwqIF9dtffhClfCv6Cm1zp9VVe3
hEeXtz9F53S/4HlBykys8o31ZaP2dIjS927LCr/wGtLnxEXkm6jHDuV8n7/SiRwb
DT6TQMAIpO7hhh94j2cAH7E64FXk6KHhWS/JowR8zmbiNVQUk/tpBv0SUIYQDJ1u
Mw4P3JhrWGn1dPc16qFDWL6Yt9rboFXnCKny1FgIi0np+OUWe1fQkcLelRGXHDqq
Y9TpmE9YWlSn/rd+zTjh4zIoTOSu8NxxZx2IraQw0JKShfweNFxZDA67cCa8m8Bv
FzusqFl9LbNxXKUsjZKHA9N0JkRRVeZGNyKPPFaPJJoscLWVX19AQBDLw8gO6rjq
ulGs6uq1pfMaQraGleVDhuKJBOZrtxn0IyoMcBYqeS3N9wq+Ze2D3tWDt/k96zPL
fCRyph/Fd13hzRnGzS6pm8xjJpwZr2ma7N53WktLrCEXNqotMqe8ZSokZzSCQbAb
fVmfnVcMMQUb3byWQZfLEBtHkNDzL9YPnXEsFKsklpk3iOtrEWXJpktNF599qNGc
1iV4vYU4R8lXoWhT6yA9V7UCAwEAAQ==
-----END RSA PUBLIC KEY-----
2.4 Go中使用RSA
package mainimport ("os""encoding/pem""crypto/x509""crypto/rsa""crypto/rand""fmt"
)//RSA公鑰加密
func RSAEncrypt(src []byte, filename string) []byte {// 1. 根據文件名將文件內容從文件中讀出file, err := os.Open(filename)if err != nil {return nil}// 2. 讀文件info, _ := file.Stat()allText := make([]byte, info.Size())file.Read(allText)// 3. 關閉文件file.Close()// 4. 從數據中查找到下一個PEM格式的塊block, _ := pem.Decode(allText)if block == nil {return nil}// 5. 解析一個DER編碼的公鑰pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {return nil}pubKey := pubInterface.(*rsa.PublicKey)// 6. 公鑰加密result, _ := rsa.EncryptPKCS1v15(rand.Reader, pubKey, src)return result
}//RSA私鑰解密
func RSADecrypt(src []byte, filename string) []byte {// 1. 根據文件名將文件內容從文件中讀出file, err := os.Open(filename)if err != nil {return nil}// 2. 讀文件info, _ := file.Stat()allText := make([]byte, info.Size())file.Read(allText)// 3. 關閉文件file.Close()// 4. 從數據中查找到下一個PEM格式的塊block, _ := pem.Decode(allText)// 5. 解析一個pem格式的私鑰privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)// 6. 私鑰解密result, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, src)return result
}func main() {//RsaGenKey(4096)src := []byte("我是小莊, 如果我死了, 肯定不是自殺...")cipherText := RSAEncrypt(src, "public.pem")plainText := RSADecrypt(cipherText, "private.pem")fmt.Println(string(plainText))
}
3.ECC橢圓曲線
- 橢圓曲線密碼學(英語:Elliptic curve cryptography,縮寫為 ECC),一種建立公開密鑰加密的算法,基于橢圓曲線數學。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
- ECC的主要優勢是在某些情況下它比其他的方法使用更小的密鑰——比如RSA加密算法——提供相當的或更高等級的安全。
- 橢圓曲線密碼學的許多形式有稍微的不同,所有的都依賴于被廣泛承認的解決橢圓曲線離散對數問題的困難性上。與傳統的基于大質數因子分解困難性的加密方法不同,ECC通過橢圓曲線方程式的性質產生密鑰。
- ECC 164位的密鑰產生的一個安全級相當于RSA 1024位密鑰提供的保密強度,而且計算量較小,處理速度更快,存儲空間和傳輸帶寬占用較少。目前我國居民二代身份證正在使用 256 位的橢圓曲線密碼,虛擬貨幣比特幣也選擇ECC作為加密算法。
- 具體算法詳解參考:
- https://www.cnblogs.com/Kalafinaian/p/7392505.html
- https://blog.csdn.net/taifei/article/details/73277247
- 不管是RSA還是ECC或者其它,公鑰加密算法都是依賴于某個正向計算很簡單(多項式時間復雜度),而逆向計算很難(指數級時間復雜度)的數學問題。
4.非對稱加密解惑
- 非對稱加密比對稱加密機密性更高嗎?
- 這個問題無法回答, 因為機密性高低是根據秘鑰長度而變化的
- 有了非對稱加密, 以后對稱加密會被替代嗎?
- 不會。一般來說,在采用具備同等機密性的密鑰長度的情況下,非對稱加密的處理速度只有對稱加密的幾百分之一。因此,非對稱加密并不適合用來對很長的消息內容進行加密。根據目的的不同,還可能會配合使用對稱加密和非對稱加密,例如,混合密碼系統就是將這兩種密碼組合而成的。
總結
以上是生活随笔為你收集整理的四、非对称加密的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。