95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
using Org.BouncyCastle.Crypto;
 | 
						||
using Org.BouncyCastle.Crypto.Encodings;
 | 
						||
using Org.BouncyCastle.Crypto.Engines;
 | 
						||
using Org.BouncyCastle.Crypto.Generators;
 | 
						||
using Org.BouncyCastle.OpenSsl;
 | 
						||
using Org.BouncyCastle.Security;
 | 
						||
using System;
 | 
						||
using System.IO;
 | 
						||
using System.Text;
 | 
						||
 | 
						||
namespace IRaCIS.Core.Infrastructure.Encryption;
 | 
						||
 | 
						||
/// <summary>
 | 
						||
/// https://www.cnblogs.com/NBDWDYS2214143926/p/13329231.html
 | 
						||
/// </summary>
 | 
						||
public class RSAEncryption
 | 
						||
{
 | 
						||
 | 
						||
    public static AsymmetricCipherKeyPair GenerateRSAKeyPair(int keySize)
 | 
						||
    {
 | 
						||
        var keyGenerationParameters = new KeyGenerationParameters(new SecureRandom(), keySize);
 | 
						||
        var keyPairGenerator = new RsaKeyPairGenerator();
 | 
						||
        keyPairGenerator.Init(keyGenerationParameters);
 | 
						||
        return keyPairGenerator.GenerateKeyPair();
 | 
						||
    }
 | 
						||
 | 
						||
    public static string ExportPublicKey(AsymmetricKeyParameter publicKey)
 | 
						||
    {
 | 
						||
        using (StringWriter sw = new StringWriter())
 | 
						||
        {
 | 
						||
            PemWriter pw = new PemWriter(sw);
 | 
						||
            pw.WriteObject(publicKey);
 | 
						||
            pw.Writer.Flush();
 | 
						||
            return sw.ToString();
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    public static string ExportPrivateKey(AsymmetricKeyParameter privateKey)
 | 
						||
    {
 | 
						||
        using (StringWriter sw = new StringWriter())
 | 
						||
        {
 | 
						||
            PemWriter pw = new PemWriter(sw);
 | 
						||
            pw.WriteObject(privateKey);
 | 
						||
            pw.Writer.Flush();
 | 
						||
            return sw.ToString();
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    /// <summary>
 | 
						||
    /// RSA解密
 | 
						||
    /// </summary>
 | 
						||
    /// <param name="privateKey">私钥</param>
 | 
						||
    /// <param name="decryptstring">待解密的字符串(Base64)</param>
 | 
						||
    /// <returns>解密后的字符串</returns>
 | 
						||
    public static string Decrypt(string privateKey, string decryptstring)
 | 
						||
    {
 | 
						||
        using (TextReader reader = new StringReader(privateKey))
 | 
						||
        {
 | 
						||
            dynamic key = new PemReader(reader).ReadObject();
 | 
						||
            var rsaDecrypt = new Pkcs1Encoding(new RsaEngine());
 | 
						||
            if (key is AsymmetricKeyParameter)
 | 
						||
            {
 | 
						||
                key = (AsymmetricKeyParameter)key;
 | 
						||
            }
 | 
						||
            else if (key is AsymmetricCipherKeyPair)
 | 
						||
            {
 | 
						||
                key = ((AsymmetricCipherKeyPair)key).Private;
 | 
						||
            }
 | 
						||
            rsaDecrypt.Init(false, key);  //这里加密是true;解密是false  
 | 
						||
 | 
						||
            byte[] entData = Convert.FromBase64String(decryptstring);
 | 
						||
            entData = rsaDecrypt.ProcessBlock(entData, 0, entData.Length);
 | 
						||
            return Encoding.UTF8.GetString(entData);
 | 
						||
        }
 | 
						||
    }/// <summary>
 | 
						||
 | 
						||
     /// 加密
 | 
						||
     /// </summary>
 | 
						||
     /// <param name="publicKey">公钥</param>
 | 
						||
     /// <param name="encryptstring">待加密的字符串</param>
 | 
						||
     /// <returns>加密后的Base64</returns>
 | 
						||
    public static string Encrypt(string publicKey, string encryptstring)
 | 
						||
    {
 | 
						||
        using (TextReader reader = new StringReader(publicKey))
 | 
						||
        {
 | 
						||
            AsymmetricKeyParameter key = new PemReader(reader).ReadObject() as AsymmetricKeyParameter;
 | 
						||
            Pkcs1Encoding pkcs1 = new Pkcs1Encoding(new RsaEngine());
 | 
						||
            pkcs1.Init(true, key);//加密是true;解密是false;
 | 
						||
            byte[] entData = Encoding.UTF8.GetBytes(encryptstring);
 | 
						||
            entData = pkcs1.ProcessBlock(entData, 0, entData.Length);
 | 
						||
            return Convert.ToBase64String(entData);
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |