> ### 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
- 第五十例 對象池
- 第五十一例 相關閱讀