using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace TestConsoleApplication
{
public class RSAHelper
{
public static void Test()
{
try
{
var privateKey = ReadKeyFile("rsa.xml");
var publicKey = ReadKeyFile("rsa_pub.xml");
var dataToEncrypt = "123456中文";
var encryptedData = EncryptBase64(dataToEncrypt, publicKey);
Console.WriteLine("加密后:\n{0}", encryptedData);
var decryptedData = DecryptBase64(encryptedData, privateKey);
Console.WriteLine("解密后:\n{0}", decryptedData);
}
catch (ArgumentNullException)
{
Console.WriteLine("Encryption failed.");
}
Console.ReadLine();
}
public static string ReadKeyFile(string filePath)
{
using (var fs = new FileStream(filePath, FileMode.Open))
{
var certBytes = new byte[fs.Length];
fs.Read(certBytes, 0, (int)fs.Length);
return Encoding.UTF8.GetString(certBytes);
}
}
public static string EncryptBase64(string dataToEncrypt, string keyContent, bool doOAEPPadding = false)
{
var byteConverter = new UTF8Encoding();
var bytesToEncrypt = byteConverter.GetBytes(dataToEncrypt);
var data = Encrypt(bytesToEncrypt, keyContent, doOAEPPadding);
if (data == null)
{
return null;
}
var b64Data = Convert.ToBase64String(data);
return b64Data;
}
public static string DecryptBase64(string dataToDecrypt, string keyContent, bool doOAEPPadding = false)
{
var bytesToEncrypt = Convert.FromBase64String(dataToDecrypt);
var data = Decrypt(bytesToEncrypt, keyContent, doOAEPPadding);
var byteConverter = new UTF8Encoding();
return byteConverter.GetString(data);
}
public static byte[] Encrypt(byte[] dataToEncrypt, string keyContent, bool doOAEPPadding = false)
{
try
{
byte[] encryptedData;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(keyContent);
encryptedData = rsa.Encrypt(dataToEncrypt, doOAEPPadding);
}
return encryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
}
public static byte[] Decrypt(byte[] dataToDecrypt, string keyContent, bool doOAEPPadding = false)
{
try
{
byte[] decryptedData;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(keyContent);
decryptedData = rsa.Decrypt(dataToDecrypt, doOAEPPadding);
}
return decryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
RSAHelper.Test();
}
}
}