rsacode.zip

package main
import (
"io/ioutil"
"encoding/pem"
"crypto/x509"
"crypto/rsa"
"crypto/rand"
"fmt"
)
const privateKeyFile = "./RsaPrivateKey.pem"
const publicKeyFile = "./RsaPublicKey.pem"
func rsaPubEncrypt(filename string, plainText []byte) (error, []byte) {
//1. 通过公钥文件,读取公钥信息 ==》 pem encode 的数据
info, err := ioutil.ReadFile(filename)
if err != nil {
return err, nil
}
//2. pem decode, 得到block中的der编码数据
block, _ := pem.Decode(info)
//返回值1 :pem.block
//返回值2:rest参加是未解码完的数据,存储在这里
//type Block struct {
// Type string // 得自前言的类型(如"RSA PRIVATE KEY")
// Headers map[string]string // 可选的头项
// Bytes []byte // 内容解码后的数据,一般是DER编码的ASN.1结构
//}
//3. 解码der,得到公钥
//derText := block.Bytes
derText := block.Bytes
publicKey, err := x509.ParsePKCS1PublicKey(derText)
if err != nil {
return err, nil
}
//4. 公钥加密
//EncryptPKCS1v15使用PKCS#1 v1.5规定的填充方案和RSA算法加密msg。
//func EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) (out []byte, err error)
cipherData, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
if err != nil {
return err, nil
}
return nil, cipherData
}
func rsaPriKeyDecrypt(filename string, cipherData []byte) (error, []byte) {
//1. 通过私钥文件,读取私钥信息 ==》 pem encode 的数据
info, err := ioutil.ReadFile(filename)
if err != nil {
return err, nil
}
//2. pem decode, 得到block中的der编码数据
block, _ := pem.Decode(info)
//返回值1 :pem.block
//返回值2:rest参加是未解码完的数据,存储在这里
//type Block struct {
// Type string // 得自前言的类型(如"RSA PRIVATE KEY")
// Headers map[string]string // 可选的头项
// Bytes []byte // 内容解码后的数据,一般是DER编码的ASN.1结构
//}
//3. 解码der,得到私钥
//derText := block.Bytes
derText := block.Bytes
privateKey, err := x509.ParsePKCS1PrivateKey(derText)
if err != nil {
return err, nil
}
//4. 私钥解密
//DecryptPKCS1v15使用PKCS#1 v1.5规定的填充方案和RSA算法解密密文。如果random不是nil,函数会注意规避时间侧信道攻击。
//func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (out []byte, err error)
plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherData)
if err != nil {
return err, nil
}
return nil, plainText
}
func main() {
src := []byte("节日快乐")
err, cipherData := rsaPubEncrypt(publicKeyFile, src)
if err != nil {
fmt.Println("公钥加密失败!, err :", err)
}
fmt.Printf("cipherData : %x\n", cipherData)
fmt.Println("++++++++++++++++++++++++++++++")
err, plainText := rsaPriKeyDecrypt(privateKeyFile, cipherData)
if err != nil {
fmt.Println("私钥解密失败!, err : ", err)
}
fmt.Printf("plainText : %s\n", plainText)
}