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);
 | ||
|         }
 | ||
|     }
 | ||
| }
 |