# 非对称加解密概述
加解密采用RSA-OAEP(SHA512 填充)算法。
# 生成公私钥对示例
GO
// GenerateKeyPair 公私钥对生成
func GenerateKeyPair() (pri *rsa.PrivateKey, pub *rsa.PublicKey, err error) {
pri, err = rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return
}
pub = &pri.PublicKey
return
}
openssl 命令行工具
openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -pubout > pub.pem
# 加密示例
GO
// Encrypt 公钥加密
func Encrypt(msg []byte, pub []byte) (ciphertext []byte, err error) {
block, _ := pem.Decode(pub)
b := block.Bytes
ifc, err := x509.ParsePKIXPublicKey(b)
if err != nil {
return
}
key, ok := ifc.(*rsa.PublicKey)
if !ok {
err = errors.New("not ok")
return
}
hash := sha512.New()
ciphertext, err = rsa.EncryptOAEP(hash, rand.Reader, key, msg, nil)
if err != nil {
return
}
return
}
.NET 6
using System.Security.Cryptography;
using System.Text;
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
var publicKey = @"-----BEGIN PUBLIC KEY-----
[pem格式内容]
-----END PUBLIC KEY-----";
var str = "RSA-OAEP SHA512 加密解密测试";
var strEncrypt = "";
using (var rsa = RSA.Create())
{
rsa.ImportFromPem(publicKey.ToCharArray());
strEncrypt = Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(str), RSAEncryptionPadding.OaepSHA512));
Console.WriteLine("密文:");
Console.WriteLine(strEncrypt);
}
}
}
}
# 解密示例
GO
// Decrypt 私钥解密
func Decrypt(ciphertext []byte, priv []byte) (plaintext []byte, err error) {
block, _ := pem.Decode(priv)
b := block.Bytes
key, err = x509.ParsePKCS1PrivateKey(b)
if err != nil {
return
}
hash := sha512.New()
plaintext, err = rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil)
if err != nil {
return
}
return
}
.NET 6
using System.Security.Cryptography;
using System.Text;
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
var privateKey = @"-----BEGIN RSA PRIVATE KEY-----
[pem格式内容]
-----END RSA PRIVATE KEY-----";
var strEncrypt = "xxxxxxxxxxxxxxxxx";
using (var rsa = RSA.Create())
{
rsa.ImportFromPem(privateKey.ToCharArray());
var strDecrypt = Encoding.UTF8.GetString(rsa.Decrypt(Convert.FromBase64String(strEncrypt), RSAEncryptionPadding.OaepSHA512));
Console.WriteLine("明文:");
Console.WriteLine(strDecrypt);
}
}
}
}