1. 程式人生 > >Go語言與RSA演算法 —— RSA案例實現

Go語言與RSA演算法 —— RSA案例實現

package main

import (
	"crypto/rsa"
	"crypto/rand"
	"crypto/x509"
	"encoding/pem"
	"os"
	"fmt"
	"encoding/hex"
)

//生成私鑰和公鑰
//bits:私鑰的長度
func RsaGenKey(bits int) error {
	//生成公鑰和私鑰
	//rand.Reader全域性,共享的密碼隨機生成器
	privKey, err := rsa.GenerateKey(rand.Reader, bits)
	if err != nil {
		return err
	}
	//將私鑰轉換為位元組切片
	//x509通用的證書格式:序列號,簽名演算法,頒發者,有效時間,持有者
	privStream := x509.MarshalPKCS1PrivateKey(privKey)
	/*
	---------------------BEGIN RSA Private Key----------------------------



	--------------------END RSA Private Key-------------------------------

	*/
	//將私鑰寫入pem格式的塊中
	block := pem.Block{
		Type: "RSA Private Key",
		Bytes: privStream,
	}
	//建立私鑰檔案
	privFile, err := os.Create("private.pem")
	if err != nil {
		return err
	}
	//延遲關閉檔案
	defer privFile.Close()
	//將塊編碼到檔案
	err = pem.Encode(privFile, &block)
	if err != nil {
		return err
	}
	//從私鑰物件中獲取公鑰
	pubKey := privKey.PublicKey
	//將公鑰轉換為位元組切片
	pubStream, err := x509.MarshalPKIXPublicKey(&pubKey)
	if err != nil {
		return err
	}
	block = pem.Block{
		Type:"RSA public Key",
		Bytes:pubStream,
	}
	//建立公鑰檔案
	pubFile, err := os.Create("public.pem")
	if err != nil {
		return err
	}
	//將塊編碼到檔案
	err = pem.Encode(pubFile, &block)
	if err != nil {
		return err
	}
	pubFile.Close()
	return nil
}

//RSA加密
//src:待加密的明文, pathName:公鑰的名稱
//返回值:加密之後的資訊
func EncryptRSA(src []byte, pathName string) ([]byte, error) {
	msg := []byte("")
	//開啟公鑰檔案
	file, err := os.Open(pathName)
	if err != nil {
		return msg, err
	}
	info, _ := file.Stat()
	//開闢空間
	resevBuf := make([]byte, info.Size())
	//讀取公鑰檔案
	file.Read(resevBuf)
	//將公鑰檔案解碼
	block, _ := pem.Decode(resevBuf)
	//將塊中內容轉換為介面
	pubInter, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return msg, err
	}
	//斷言
	pubKey := pubInter.(*rsa.PublicKey)
	//加密
	msg, err = rsa.EncryptPKCS1v15(rand.Reader, pubKey, src)
	if err != nil {
		return msg, err
	}
	return msg, err
}

//RSA解密
//src:密文  pathName:私鑰的名稱
func DecryptRSA(src []byte, pathName string) ([]byte, error) {
	msg := []byte("")
	//代開私鑰檔案
	file, err := os.Open(pathName)
	if err != nil {
		return msg, err
	}
	info, _ := file.Stat()
	//建立切片
	recevBuf := make([]byte, info.Size())
	//讀取檔案
	file.Read(recevBuf)
	//私鑰內容解碼
	block, _ := pem.Decode(recevBuf)
	//將塊的內容解析成私鑰
	privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return msg, err
	}
	//解密
	msg, err = rsa.DecryptPKCS1v15(rand.Reader, privKey, src)
	if err != nil {
		return msg, err
	}
	return msg, nil
}


func main() {
/*	err := RsaGenKey(1024)
	if err == nil {
		fmt.Println("金鑰對生成成功!")
	}else {
		fmt.Println("金鑰對生成失敗!")
	}*/

	src := []byte("i  am   wek &&   i am  The_Reader")
	encrypt_msg, _ := EncryptRSA(src, "public.pem")
	fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))
	decrypt_msg , _ := DecryptRSA(encrypt_msg, "private.pem")
	fmt.Println("decrypt_msg = ", string(decrypt_msg))
}





 

執行時,應先讓程式生成金鑰檔案 

然後再將其執行加密解密!