// 大数转换、SetString中“1”为大数字符串样式
var n, _ = new(big.Int).SetString("1", 10)
var e = 65537
var d, _ = new(big.Int).SetString("2", 10)
package xrsa
import (
"bytes"
"crypto/rand"
"crypto/rsa"
"encoding/base64"
"errors"
"math/big"
)
type Key struct {
N *big.Int
D *big.Int
E int
}
type XRsa struct {
publicKey *rsa.PublicKey
privateKey *rsa.PrivateKey
}
// NewXRsa 构造非对称加密
func NewXRsa(k Key) (*XRsa, error) {
pub := &rsa.PublicKey{
N: k.N,
E: k.E,
}
pri := &rsa.PrivateKey{
PublicKey: *pub,
D: k.D,
}
return &XRsa{
publicKey: pub,
privateKey: pri,
}, nil
}
// PublicEncrypt 公钥加密
func (r *XRsa) PublicEncrypt(data string) (*bytes.Buffer, error) {
partLen := r.publicKey.N.BitLen()/8 - 11
chunks := split([]byte(data), partLen)
buffer := bytes.NewBufferString("")
for _, chunk := range chunks {
bytesInfo, err := rsa.EncryptPKCS1v15(rand.Reader, r.publicKey, chunk)
if err != nil {
return buffer, err
}
buffer.Write(bytesInfo)
}
return buffer, nil
}
// PrivateDecrypt 私钥解密、支持传入字符串和字节切片类型
// 可使用string()或Bytes()等获取数据信息
func (r *XRsa) PrivateDecrypt(encrypted interface{}) (*bytes.Buffer, error) {
var data string
switch t := encrypted.(type) {
case string:
data = t
case []byte:
data = base64.RawURLEncoding.EncodeToString(t)
default:
return nil, errors.New("type-error")
}
partLen := r.publicKey.N.BitLen() / 8
raw, err := base64.RawURLEncoding.DecodeString(data)
if err != nil {
return nil, errors.New("EnCode-error")
}
chunks := split(raw, partLen)
buffer := bytes.NewBufferString("")
for _, chunk := range chunks {
decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, r.privateKey, chunk)
if err != nil {
return buffer, err
}
buffer.Write(decrypted)
}
return buffer, nil
}
// 将数据按照加密长度进行拆分
func split(buf []byte, lim int) [][]byte {
var chunk []byte
chunks := make([][]byte, 0, len(buf)/lim+1)
for len(buf) >= lim {
chunk, buf = buf[:lim], buf[lim:]
chunks = append(chunks, chunk)
}
if len(buf) > 0 {
chunks = append(chunks, buf[:])
}
return chunks
}
RSA非对称加密-GO
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 坚持原创,如有错误请指正 非对称加密是区块链常用的一类加密方式,比如说有下面几种: RSA secp256k1 (...
- 一、非对称加密概述 对称加密有非常好的安全性,其加解密计算的性能也较高,但其有两个重要缺点: 加密的安全性依赖于秘...
- 一 : 对称加密(DES、AES) 1.DES 2 : AES 二 : 非对称加密(RSA) 三 :MD5、SHA...
- 参考【philippica】萌萌哒弱受RSA和强攻wiener想像这样一个场景,一堆情侣,每天早上alice站在东...