博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang实现RSA加密解密
阅读量:5891 次
发布时间:2019-06-19

本文共 2698 字,大约阅读时间需要 8 分钟。

非对称加密示意图:

在此可以看到,非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。

RSA公钥和私钥生成:

package main

import (

"crypto/rsa"

"crypto/rand"

"fmt"

"crypto/x509"

"encoding/pem"

"os"

"flag"

)

func RSAKeyGen(bits int) error {

privatekey, err := rsa.GenerateKey(rand.Reader, bits)

if err != nil {

fmt.Println("私钥文件生成失败")

}

fmt.Println("私钥为:", privatekey)

derStream := x509.MarshalPKCS1PrivateKey(privatekey)

block := &pem.Block{

Type:"RSA Private key",

Bytes: derStream,

}

privatefile, err := os.Create("myprivatekey.pem")

defer privatefile.Close()

err = pem.Encode(privatefile, block)

if err != nil {

fmt.Println(err.Error())

return err

}

publickey := &privatekey.PublicKey;

fmt.Println("公钥为:", publickey)

derpkix, err := x509.MarshalPKIXPublicKey(publickey)

block = &pem.Block{

Type:"RSA Public key",

Bytes: derpkix,

}

if err != nil {

fmt.Println(err.Error())

return err

}

publickfile, err := os.Create("mypublic.pem")

defer publickfile.Close()

err = pem.Encode(publickfile, block)

if err != nil {

fmt.Println(err.Error())

return err

}

return nil

}

func main() {

var bits int

flag.IntVar(&bits,"b",1024,"密码默认长度1024")

err := RSAKeyGen(bits)

if err != nil{

fmt.Println("RSA密码文件生成失败")

}

fmt.Println("RSA密码生成成功")

}

利用公钥和私钥进行加密解密:

package main

import (

"encoding/pem"

"errors"

"crypto/x509"

"crypto/rsa"

"crypto/rand"

"fmt"

"encoding/base64"

"os"

)

var publickey = FileLoad("mypublic.pem")

var privatekey = FileLoad("myprivatekey.pem")

func RSAEncrypt(orgidata []byte) ([]byte, error) {

block, _ := pem.Decode(publickey)

if block == nil {

return nil, errors.New("public key is bad")

}

pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)

if err != nil {

return nil, err

}

pub := pubInterface.(*rsa.PublicKey)

return rsa.EncryptPKCS1v15(rand.Reader, pub, orgidata)//加密

}

func RSADecrypt(cipertext []byte) ([]byte, error) {

block, _ := pem.Decode(privatekey)

if block == nil {

return nil, errors.New("public key is bad")

}

priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

return nil, err

}

return rsa.DecryptPKCS1v15(rand.Reader, priv, cipertext)

}

func FileLoad(filepath string) ([]byte) {

privatefile,err := os.Open(filepath)

defer privatefile.Close()

if err!=nil{

return nil

}

privateKey := make([]byte,2048)

num,err := privatefile.Read(privateKey)

return privateKey[:num]

}

func main() {

var data []byte

var err error

data, err = RSAEncrypt([]byte("QQ77025077"))

if err != nil {

fmt.Println("错误", err)

}

fmt.Println("加密:", base64.StdEncoding.EncodeToString(data))

origData, err := RSADecrypt(data)//解密

  if err != nil {

fmt.Println("错误", err)

}

fmt.Println("解密:", string(origData))

//pk := FileLoad("myprivatekey.pem")

//fmt.Println(string(pk))

}

 

转载于:https://www.cnblogs.com/dfsxh/p/10825460.html

你可能感兴趣的文章
GitOps:Weaveworks通过开发者工具实现CI/CD
查看>>
《A Seat at the Table》作者访谈录
查看>>
Kubernetes 状态管理与扩展
查看>>
Three.js 最新版本改进了对WebGL的支持
查看>>
在Hyperledger Indy中实现隐私设计
查看>>
Apache Ignite 初探
查看>>
阿里云技术动态:Xen漏洞热补丁修复、异地双活、ODPS新功能与金融互联网
查看>>
京东618:ReactNative框架在京东无线端的实践
查看>>
Criteo使用Cassandra存储后端实现Graphite的规模化
查看>>
运满满CTO:学会享受挑战,做事儿得有要性
查看>>
MesosCon D2 | Google系统构建的故事,Mesos之父登场
查看>>
bootstrap - responsive layout
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
bootstrap - image
查看>>
spring-boot 和 webpack-dev-server联合开发
查看>>
从TimSort说起
查看>>
构建 iOS 界面:子类化 Views
查看>>
笨办法学C 练习1:启用编译器
查看>>
用Golang写一个搜索引擎(0x01)--- 基本概念
查看>>
【算法之美】logn 时间复杂度求解两个有序数组的中位数
查看>>