版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/The_Reader/article/details/83997795
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))
}
执行时,应先让程序生成密钥文件
然后再将其执行加密解密!