日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

密码技术--非对称加密算法及Go语言应用

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 密码技术--非对称加密算法及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语言应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。