golang 中,非對稱加密的實現

wangchunbo發表於2020-05-25

golang 中,非對稱加密的實現

mysra.go

package main

import (

"crypto/rand"

"crypto/rsa"

"crypto/sha256"

"crypto/x509"

"encoding/hex"

"encoding/pem"

"fmt"

"os"

)

// 生成rsa的金鑰對, 並且儲存到磁碟檔案中

func  GenerateRsaKey(keySize int) {

// 1. 使用rsa中的GenerateKey方法生成私鑰

privateKey, err := rsa.GenerateKey(rand.Reader, keySize)

if err != nil {

panic(err)

}

// 2. 通過x509標準將得到的ras私鑰序列化為ASN.1 的 DER編碼字串

derText := x509.MarshalPKCS1PrivateKey(privateKey)

// 3. 要組織一個pem.Block(base64編碼)

block := pem.Block{

Type : "rsa private key", // 這個地方寫個字串就行

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標準序列化

derstream, err := x509.MarshalPKIXPublicKey(&publicKey)

if err != nil {

panic(err)

}

// 3. 將得到的資料放到pem.Block中

block = pem.Block{

Type : "rsa public key",

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. 開啟檔案, 並且讀出檔案內容

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)

//斷言型別轉換

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. 開啟檔案, 並且讀出檔案內容

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

}

func  main() {

GenerateRsaKey(4096)

src := []byte(" 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上...")

cipherText := RSAEncrypt(src, "public.pem")

plainText := RSADecrypt(cipherText, "private.pem")

fmt.Println(string(plainText))

myHash()

}

// 使用sha256

func  myHash() {

// sha256.Sum256([]byte("hello, go"))

// 1. 建立雜湊介面物件

myHash := sha256.New()

// 2. 新增資料

src := []byte(" 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上... 好好學習,天天向上...")

myHash.Write(src)

myHash.Write(src)

myHash.Write(src)

// 3. 計算結果

res := myHash.Sum(nil)

// 4. 格式化為16進位制形式

myStr := hex.EncodeToString(res)

fmt.Printf("%s\n", myStr)

}

禁止 學習某地爬蟲,知乎爬蟲,CSDN 爬蟲。

本文,首發在 learnku 社群。

@author
汪春波(www.shxdledu.cn)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

上海PHP自學中心-免費程式設計視訊教學|
7Dn78VKKcW.jpg!large
S3d25uqwht.png!large

相關文章