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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

golang非对称加密

發(fā)布時(shí)間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang非对称加密 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

密鑰生成流程

  • 生成私鑰操作流程概述

  • 使用rsa中的GenerateKey方法生成私鑰

    func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)

    • rand.Reader -> import "crypto/rand"
    • 1024 的整數(shù)倍 - 建議
  • 通過(guò)x509標(biāo)準(zhǔn)將得到的ras私鑰序列化為ASN.1 的 DER編碼字符串

    func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte

  • 將私鑰字符串設(shè)置到pem格式塊中

    初始化一個(gè)pem.Block塊

    type Block struct {Type string // 得自前言的類(lèi)型(如"RSA PRIVATE KEY")Headers map[string]string // 可選的頭項(xiàng)Bytes []byte // 內(nèi)容解碼后的數(shù)據(jù),一般是DER編碼的ASN.1結(jié)構(gòu) }
  • 通過(guò)pem將設(shè)置好的數(shù)據(jù)進(jìn)行編碼, 并寫(xiě)入磁盤(pán)文件中

    func Encode(out io.Writer, b *Block) error

    • out - 準(zhǔn)備一個(gè)文件指針
  • 生成公鑰操作流程

  • 從得到的私鑰對(duì)象中將公鑰信息取出

    type PrivateKey struct {PublicKey // 公鑰D *big.Int // 私有的指數(shù)Primes []*big.Int // N的素因子,至少有兩個(gè)// 包含預(yù)先計(jì)算好的值,可在某些情況下加速私鑰的操作Precomputed PrecomputedValues }
  • 通過(guò)x509標(biāo)準(zhǔn)將得到 的rsa公鑰序列化為字符串

    func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)
  • 將公鑰字符串設(shè)置到pem格式塊中

    type Block struct {
    Type string // 得自前言的類(lèi)型(如"RSA PRIVATE KEY")
    Headers map[string]string // 可選的頭項(xiàng)
    Bytes []byte // 內(nèi)容解碼后的數(shù)據(jù),一般是DER編碼的ASN.1結(jié)構(gòu)
    }

  • 通過(guò)pem將設(shè)置好的數(shù)據(jù)進(jìn)行編碼, 并寫(xiě)入磁盤(pán)文件

    func Encode(out io.Writer, b *Block) error

RSA加解密

RSA加密

  • 將公鑰文件中的公鑰讀出, 得到使用pem編碼的字符串

    -- 讀文件

  • 將得到的字符串解碼

    -- pem.Decode

  • 使用x509將編碼之后的公鑰解析出來(lái)

    -- func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error)

  • 使用得到的公鑰通過(guò)rsa進(jìn)行數(shù)據(jù)加密

  • RSA解密

  • 將私鑰文件中的私鑰讀出, 得到使用pem編碼的字符串
  • 將得到的字符串解碼
  • 使用x509將編碼之后的私鑰解析出來(lái)
  • 使用得到的私鑰通過(guò)rsa進(jìn)行數(shù)據(jù)解密
  • 使用

    import ("crypto/rand""crypto/rsa""crypto/sha256""crypto/x509""encoding/hex""encoding/pem""fmt""os" )// 生成rsa的密鑰對(duì), 并且保存到磁盤(pán)文件中 func GenerateRsaKey(keySize int) {// 1. 使用rsa中的GenerateKey方法生成私鑰privateKey, err := rsa.GenerateKey(rand.Reader, keySize)if err != nil {panic(err)}// 2. 通過(guò)x509標(biāo)準(zhǔn)將得到的ras私鑰序列化為ASN.1 的 DER編碼字符串derText := x509.MarshalPKCS1PrivateKey(privateKey)// 3. 要組織一個(gè)pem.Block(base64編碼)// 里面還有個(gè)Headers屬性可以寫(xiě)可以不寫(xiě)block := pem.Block{Type : "rsa private key", // 這個(gè)地方寫(xiě)個(gè)字符串就行Bytes : derText,}// 4. pem編碼file, err := os.Create("private.pem")if err != nil {panic(err)}pem.Encode(file, &block)file.Close()// ============ 公鑰 ==========// 1. 從私鑰中取出公鑰publicKey := privateKey.PublicKey// 2. 使用x509標(biāo)準(zhǔn)序列化derstream, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {panic(err)}// 3. 將得到的數(shù)據(jù)放到pem.Block中block = pem.Block{Type : "rsa public key", // 這個(gè)地方寫(xiě)個(gè)字符串就行Bytes : derstream,}// 4. pem編碼file, err = os.Create("public.pem")if err != nil {panic(err)}pem.Encode(file, &block)file.Close() }// RSA 加密, 公鑰加密 func RSAEncrypt(plainText []byte, fileName string) []byte{// 1. 打開(kāi)文件, 并且讀出文件內(nèi)容file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())file.Read(buf)file.Close()// 2. pem解碼block, _ := pem.Decode(buf)pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)//斷言類(lèi)型轉(zhuǎn)換pubKey := pubInterface.(*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. 打開(kāi)文件, 并且讀出文件內(nèi)容file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())file.Read(buf)file.Close()// 2. pem解碼block, _ := pem.Decode(buf)privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {panic(err)}// 3. 使用私鑰解密plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, cipherText)if err != nil {panic(err)}return plainText }//測(cè)試文件 func main() {GenerateRsaKey(4096)src := []byte("abc abc...")cipherText := RSAEncrypt(src, "public.pem")plainText := RSADecrypt(cipherText, "private.pem")fmt.Println(string(plainText))myHash()myHash() }// 使用sha256 func myHash() {// sha256.Sum256([]byte("hello, go"))// 1. 創(chuàng)建哈希接口對(duì)象myHash := sha256.New()// 2. 添加數(shù)據(jù)src := []byte("123 123...")myHash.Write(src)myHash.Write(src)myHash.Write(src)// 3. 計(jì)算結(jié)果res := myHash.Sum(nil)// 4. 格式化為16進(jìn)制形式myStr := hex.EncodeToString(res)fmt.Printf("%s\n", myStr) }

    總結(jié)

    以上是生活随笔為你收集整理的golang非对称加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。