golang非对称加密
密鑰生成流程
-
生成私鑰操作流程概述
-
使用rsa中的GenerateKey方法生成私鑰
func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)
- rand.Reader -> import "crypto/rand"
- 1024 的整數倍 - 建議
-
通過x509標準將得到的ras私鑰序列化為ASN.1 的 DER編碼字符串
func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
-
將私鑰字符串設置到pem格式塊中
初始化一個pem.Block塊
type Block struct {Type string // 得自前言的類型(如"RSA PRIVATE KEY")Headers map[string]string // 可選的頭項Bytes []byte // 內容解碼后的數據,一般是DER編碼的ASN.1結構 } -
通過pem將設置好的數據進行編碼, 并寫入磁盤文件中
func Encode(out io.Writer, b *Block) error
- out - 準備一個文件指針
-
生成公鑰操作流程
-
從得到的私鑰對象中將公鑰信息取出
type PrivateKey struct {PublicKey // 公鑰D *big.Int // 私有的指數Primes []*big.Int // N的素因子,至少有兩個// 包含預先計算好的值,可在某些情況下加速私鑰的操作Precomputed PrecomputedValues } -
通過x509標準將得到 的rsa公鑰序列化為字符串
func MarshalPKIXPublicKey(pub interface{}) ([]byte, error) -
將公鑰字符串設置到pem格式塊中
type Block struct {
Type string // 得自前言的類型(如"RSA PRIVATE KEY")
Headers map[string]string // 可選的頭項
Bytes []byte // 內容解碼后的數據,一般是DER編碼的ASN.1結構
} -
通過pem將設置好的數據進行編碼, 并寫入磁盤文件
func Encode(out io.Writer, b *Block) error
RSA加解密
RSA加密
將公鑰文件中的公鑰讀出, 得到使用pem編碼的字符串
-- 讀文件
將得到的字符串解碼
-- pem.Decode
使用x509將編碼之后的公鑰解析出來
-- func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error)
使用得到的公鑰通過rsa進行數據加密
RSA解密
使用
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編碼)// 里面還有個Headers屬性可以寫可以不寫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("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. 創建哈希接口對象myHash := sha256.New()// 2. 添加數據src := []byte("123 123...")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) }總結
以上是生活随笔為你收集整理的golang非对称加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的对称加密
- 下一篇: golang单向散列函数