密码技术--非对称加密算法及Go语言应用
非對稱加密算法
1.對稱加密的弊端
-
秘鑰分發困難
-
可以通過非對稱加密完成秘鑰的分發
Alice和Bob通信,Alice給Bob發送數據,使用對稱加密的流程
1.Bob生成一個非對稱的密鑰對,
2.Bob將公鑰發送給Alice
3.Alice生成一個用于對稱加密的秘鑰
4.Alice使用Bob的公鑰就對對稱加密的秘鑰進行加密,并發送給Bob
5.Bob使用私鑰對數據解密,得到對稱加密的私鑰
通信的雙方使用寫好的秘鑰進行對稱加密對數據加密
-
場景分析
1.通信流程,信息加密(A寫數據給B,信息只允許B讀)
A: 公鑰
B:私鑰
2.登錄認證(客戶端要登錄,連接服務器,向服務器請求個人數據)
客戶端:私鑰
服務端:公鑰
3.數字簽名(表明信息沒有受到篡改,確實是信息擁有者發出來的,附在信息原文的后面)
發送端:私鑰
接受端:公鑰
4.網銀U盾
個人:私鑰
銀行:公鑰.
總結: 數據對誰更重要,誰就拿私鑰
2. 非對稱加密的秘鑰
- 不存在秘鑰分發的困難問題
3.生成RSA的密鑰對
概念
x509證書規范、pem、base64
- pem是一種源自保密增強郵件協議的編碼規范,可進行數據加密
- base64也是一種編碼規范,過程可逆
- 無論原始數據是什么,將原始數據使用64個字符來代替(a-z、A-Z、0-9、/、+)
ASN.1抽象語法標記
PKCS1標準
密鑰對生成流程
- 私鑰生成
1.使用rsa中的GenerateKey方法生成私鑰
func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)
- rand.Reader -> import “crypto/rand”
- bits 1024的整數倍-建議
2.通過x509標準將得到的rsa私鑰序列化為ASN.1的DER編碼字符串
func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
3.將私鑰字符串設置到pem格式塊中
初始化一個pem.Block塊
4.通過pem將設置好的數據進行編碼,并寫入磁盤文件
func Encode(out io.Writer, b *Block) error
out - 準備一個文件指針
- 公鑰生成
1.從得到的私鑰對象中將公鑰信息取出
type PrivateKey struct {PublicKey // 公鑰D *big.Int // 私有的指數Primes []*big.Int // N的素因子,至少有兩個// 包含預先計算好的值,可在某些情況下加速私鑰的操作Precomputed PrecomputedValues }2.通過x509標準將得到的rsa公鑰序列化為字符串
func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)3.將公鑰字符串設置到pem格式塊中
4.通過pem將設置好的數據進行編碼,并寫入磁盤文件
4.RSA加解密
package mainimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""os" )//生成rsa私鑰和公鑰并寫入磁盤文件 func GenerateRsaKey(keySize int) {//1.生成rsa秘鑰privateKey, err := rsa.GenerateKey(rand.Reader, keySize)if err != nil {panic(err)}//2.通過x509標準將得到的rsa私鑰序列化為ASN.1的DER編碼字符串derText := x509.MarshalPKCS1PrivateKey(privateKey)//3.創建一個pem.Block結構體block := pem.Block{Type: "rsa private key",Bytes: derText,}//4.通過pem將設置好的私鑰數據進行編碼,并寫入磁盤文件file, err := os.Create("private.pem")if err != nil {panic(err)}err = pem.Encode(file, &block)if err != nil {panic(err)}// ==========公鑰==================//1.從私鑰中取出公鑰publicKey := privateKey.PublicKey//2.使用x509序列化公鑰為字符串marshalPKIXPublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {panic(err)}//3.通過公鑰字符串設置到pem格式塊中block = pem.Block{Type: "rsa public key",Headers: nil,Bytes: marshalPKIXPublicKey,}//4.pem編碼file, err = os.Create("public.pem")if err != nil {panic(err)}err = pem.Encode(file, &block)if err != nil {panic(err)}file.Close() }//rsa加密 func RSAEncrypt(plainText []byte, fileName string) []byte {//1.打開公鑰文件file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())_, err = file.Read(buf)if err != nil {panic(err)}file.Close()//2.pem decodeblock, _ := pem.Decode(buf)publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {panic(err)}pubKey := publicKey.(*rsa.PublicKey)//3.使用公鑰加密cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, plainText)if err != nil {panic(err)}return cipherText }//rsa解密 func RSADecrypt(cipherText []byte, fileName string) []byte {//1.打開私鑰文件file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())_, err = file.Read(buf)if err != nil {panic(err)}//2.pem decodeblock, _ := pem.Decode(buf)privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {panic(err)}//3.解密數據plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)if err != nil {panic(err)}return plainText }func main() {GenerateRsaKey(1024)src := []byte("解決了秘鑰分發的困難問題,不能加密稍長一點的數據,主要用來加密對稱秘鑰")cipherText := RSAEncrypt(src, "public.pem")plainText := RSADecrypt(cipherText, "private.pem")fmt.Println("解密結果:", string(plainText)) }總結
以上是生活随笔為你收集整理的密码技术--非对称加密算法及Go语言应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密码技术--对称加密算法及Go语言应用
- 下一篇: 密码技术--消息认证码及go语言应用