Go语言与RSA算法 —— RSA案例实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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))
}





执行时,应先让程序生成密钥文件 

然后再将其执行加密解密! 

猜你喜欢

转载自blog.csdn.net/The_Reader/article/details/83997795
今日推荐