> ### RSA
~~~
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
)
// 私钥生成
//openssl genrsa -out rsa_private_key.pem 1024
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDKogrjd6Sj/atsQpdbJsvp/s5c0As8edgJ/6ol23aNVzBde9Rk
lxBEH1plvKR+5iq8YPwhU5JPYBfO73wlMqQj7hLeQTde1ll8UR0lUkYSrxuZG2NC
HDBxOYiqfMBH+PJYQcN9veJa6Y6l9J0yY4/bXRfaaJdnbn/EqMhARHBMcQIDAQAB
AoGAHxLOXKeCReummAl2MHI4nv+GIdF9h56ftJjSPM/01CPktNFCdtJ7mha8xBEz
oIonT5AH2gx4yVdRD1jGTuX/KYUtj15BRWsZTaPrbOCAvZZq/ZmVGBINI2uzk7Bw
wALAdJXhXHNYteTChJOFE62LPbF5/hV9U6Ug/DrqxcMRweECQQD7S/1wJLEJtb57
SvgtL+1+TppFQVEaMdGFdjKE5/IJ/7fFMX36SNZXxt7MwRoVz/ulyAM4II/ddqfC
HjSc8p6dAkEAzmzlGc54tHkh6VtaB4xI+cPgNCjuBhckV/ALjmCNRcwuGx0FMnpb
06RjTVA4Owd4r7qiEQvG8mA+4k7wJdjy5QJBAMIVVpAeRn1xWMRwimyb75j1rECA
ydqpT2D8gNgVK+J9Fbm/F8UOLD1u4vTQzwy5rWnEqHfY7kPlOHu8SHZPDCECQAkT
3NdPrxswoH8kl0bxslvZc0iX7C+0YNLFKZzvPgctvXFPy2S24Mbj2cISnwZpg7Mm
n+3j+LG77cgB9KmVaskCQAjwtwarWuUeuB3D1PBmoA0HXifmUBl8EMHBdqg+4HtK
rgIM5CiOS33aa4ZYZTbuCFadFLxWH2QOeCiHRRERTAk=
-----END RSA PRIVATE KEY-----
`)
// 公钥: 根据私钥生成
//openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKogrjd6Sj/atsQpdbJsvp/s5c
0As8edgJ/6ol23aNVzBde9RklxBEH1plvKR+5iq8YPwhU5JPYBfO73wlMqQj7hLe
QTde1ll8UR0lUkYSrxuZG2NCHDBxOYiqfMBH+PJYQcN9veJa6Y6l9J0yY4/bXRfa
aJdnbn/EqMhARHBMcQIDAQAB
-----END PUBLIC KEY-----
`)
func main() {
stringVal := "Hello World"
fmt.Println("加密前内容: ", stringVal)
encryptCode, err := RsaEncrypt([]byte(stringVal))
if err != nil{
fmt.Println(err.Error())
return
}
fmt.Println("公钥加密后内容: ", base64.StdEncoding.EncodeToString(encryptCode))
decryptCode , err:= RsaDecrypt(encryptCode)
if err != nil{
fmt.Println(err.Error())
return
}
fmt.Println("私钥解密后内容: ", string(decryptCode))
}
// 加密
func RsaEncrypt(origData []byte) ([]byte, error) {
//解密pem格式的公钥
block, _ := pem.Decode(publicKey)
if block == nil {
return nil, errors.New("public key error")
}
// 解析公钥
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
// 类型断言
pub := pubInterface.(*rsa.PublicKey)
//加密
return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}
// 解密
func RsaDecrypt(ciphertext []byte) ([]byte, error) {
//解密
block, _ := pem.Decode(privateKey)
if block == nil {
return nil, errors.New("private key error!")
}
//解析PKCS1格式的私钥
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
// 解密
return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}
~~~
- 第一例 留言板
- 第二例 gRPC使用例子
- 第三例 基于go-micro做服务注册和服务发现
- 第四例 聊天室
- 第五例 工具库 第五例 并发安全字典
- dao
- common
- common.go
- config
- config.go
- gorm
- grom.go
- sqlx
- sqlx.go
- kafka
- kafka.go
- log
- log.go
- log2.go
- redis
- redis.go
- zookeeper
- zookeeper.go
- init
- main.go
- 第六例 原生sql操作
- 第七例 sqlx操作
- 第八例 Redis数据库(gomodule/redigo)
- 第九例 Redis消息队列
- 第十例 Redis集群连接
- 第十一例 Zookeeper操作
- 第十二例 Kafka操作
- 第十三例 NSQ操作
- 第十四例 二分查找
- 第十五例 交换排序 - 冒泡排序
- 第十六例 插入排序 - 直接插入排序
- 第十七例 插入排序 - 希尔排序
- 第十八例 交换排序 - 快速排序
- 第十九例 算法求解应用
- 第二十例 pprof性能分析
- 第二一例 CPU信息采集
- 第二二例 Heap信息采集
- 第二三例 Http信息采集
- 第二四例 单元测试(功能测试)
- 第二五例 基准测试(压力测试/性能测试)
- 第二六例 gdb调试
- 第二七例 json序列化和反序列化
- 第二八例 protobuf序列化和反序列化
- 第二九例 包管理工具 go vendor
- 第三十例 包管理工具 go mod
- 第三一例 zip压缩
- 第三二例 交叉编译
- 第三三例 线上环境部署
- 第三四例 业务:实现固定周期维护
- 第三五例 聊天室(精简版)
- 第三六例 并发安全字典
- 第三七例 导出Excel表格
- 第三八例 导出CSV表格
- 第三九例 聊天室(高并发)
- 第四十例 JWT (Json Web Token)
- 第四一例 雪花算法生成 Id
- 第四二例 对称加密 AES
- 第四三例 非对称加密 RSA
- 第四四例 签名算法 SHA1
- 第四五例 数据库操作 gorm
- 第四六例 数据库操作 gorm 集合
- 数据库连接和创建表
- 查询 - 分页
- 查询所有数据
- 查询单条数据
- 插入一条或多条数据
- 更新一条或多条数据
- 更新一条或多条数据(有零值)
- 第四七例 RSA(MD5WithRSA 算法)签名和验签方式
- 第四八例 线上部署脚本
- 第四九例 Elasticsearch
- 第五十例 对象池
- 第五十一例 相关阅读