# 非对称加解密概述

加解密采用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);
            }
        }

    }
}