Go語言與RSA演算法 —— RSA案例實現
阿新 • • 發佈:2018-12-21
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)) }
執行時,應先讓程式生成金鑰檔案
然後再將其執行加密解密!