golang非对称加密
密鑰生成流程
-
生成私鑰操作流程概述
-
使用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解密
使用
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)題。
- 上一篇: golang中的对称加密
- 下一篇: golang单向散列函数