加密过程:
1、明文-----转换----》byte[]数据
2、byte[]数据-----公钥--------》byte[]加密数据
解密过程:
1、byte[]加密数据-------私钥-------》byte[]数据
2、byte[]数据-----转换------》明文
------------------------------- 一、基础数据 ----------------------------------------------
#region 获取基础数据
string data = "{\"Name\":\"许未未\",\"Age\":18,\"CreatTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"}";
//服务器私钥、公钥
string server_PublicKey = "BgIAAACkAABSU0ExAAQAAAEAAQCrefAMBzFtmy+0MofGG/GIxE8a2W8qw6VkvJ6ZNHWek3Y9/9KDGVgZ8PAD3Wiqm/+bsdA0ympuuz/7CxVPBJXCMxD09if8qM/dBHsrsFZVOy9oHgT1L7WE4MHpf16G6j/+8a9DJ1xci274G+x8UXp2pcOCStM0rfdlUPqBwzt51Q==";
string server_PrivateKey = "BwIAAACkAABSU0EyAAQAAAEAAQCrefAMBzFtmy+0MofGG/GIxE8a2W8qw6VkvJ6ZNHWek3Y9/9KDGVgZ8PAD3Wiqm/+bsdA0ympuuz/7CxVPBJXCMxD09if8qM/dBHsrsFZVOy9oHgT1L7WE4MHpf16G6j/+8a9DJ1xci274G+x8UXp2pcOCStM0rfdlUPqBwzt51b3410FiMgWbtABPrZx5XIZI4/hFqpUiJi2WrtZxrOl+msWcRaIKWEyoThA8Z5QUFq1neEIf7K9SctfK8eBY7/aHZkXsrtC96oH3njxcwEVjrFPBMjjjhjHrdQZizkFOxMyDLf2Era72i2f9dKcP/LQMOzHkYPcP1yEMien/a0/dScWtmz4+xeExW4rSWbpPREZChl06iDSlc50eJ6uO3heujhw93cP4YC0G16AoxtFTtDSVZYT5XtVNb1Ix16bB6EEck2N7pmeRu8ylR5lg0cGKVT78N8KTgPklrMlmiL44ac1CYohSt/WDslcap1hMamoTqdfpktaCu/b9W1wjYAZ4izvaxXQc6x8EPHDldGb9m3NZ7D2KFv4Sg6yNC5dXQCrvnE4CI0d2Q5D3iaxFTrg9s1XVjq9lQBHERhWlVYFuIWntMpoKjKlOuaaCMvwdxPY2ljaYgui9KusTP773pNB48/S/JfM+fA5jtJdiJ+y5RMAu6pQBkaWuBkigcVK49UeE11GeDqfx27iYWMR8HZH3sFRwmtwWWStOMq+20D98PPbWawAsBPrHLdcW/nfMDDYWc+oXPfKYZvXyJNCJeVY=";
//客户端私钥、公钥
string client_PublicKey = "BgIAAACkAABSU0ExAAQAAAEAAQDTZuBk7qh0g90FyHAfR2cv9Zfc3YV35VGXNXf0terNwTVDL26BuoVb6FDnEmY1zrsANhPEhd4CqwuRDBtyF/XbSirlbr4LPJ3hWdtFwNJ+dixz3Ab1QIQr1Rh7hiJy/fehhlTj021ZDEQIX1NGohendfAVLoY1VD0FXvRtDxOf1Q==";
string client_PrivateKey = "BwIAAACkAABSU0EyAAQAAAEAAQDTZuBk7qh0g90FyHAfR2cv9Zfc3YV35VGXNXf0terNwTVDL26BuoVb6FDnEmY1zrsANhPEhd4CqwuRDBtyF/XbSirlbr4LPJ3hWdtFwNJ+dixz3Ab1QIQr1Rh7hiJy/fehhlTj021ZDEQIX1NGohendfAVLoY1VD0FXvRtDxOf1RE4t+cpTeIw1o5jLDZWIX9Yhf59IjcIDt0zzgwdSZ7ibIqwTxoeX19YGvrX3/B5K1sI1fyjacM9ZaDl2woWze2jdNDINm42S3QTRlXry5ofwan9tgHZaHBgYtfpW8bd+EvKKdSTPsfN47jRNaI30hU8puu52aB2PMBOYKyJRPjlIX9TuQImJkfp05d3xxvRMcInWM8Si9x9a0JeLUupMGf8qOA4d7NFXzXRr8sp5LCjkc6YKyARgaP9eR3sw+4rF2VXM5sTitT81irACMUZ7A274bLx6BMZhL1YNgJi3opjn6pm3HheZ9M/ntSOipYDj+3iqh9vJInv5zTvzIFTeGao3VIU5oa2GFw+oNn8jh+PesaEAaiszB/aq7k8XGygajUWcNSx8C82+6rVeXvJ3g0sbyqZVpbS5+rgd9OV4KfPMUoCQdU6ZCjtNO/S9k/zm0/7f5mv/NRNkiyLBfu+Tx2HkYVTxHjuYc6rYHt0Jc2aE1vR50tnrSnlW69q0xZbWBwUtVZcS2VGQ3cxopjd+ei6mu2+o3eOd7KAJcdx5vk9+PYaKdQ+pxRq1r6xNp5xFDEhoflQgNMUImjpxbP8FgU=";
#endregion
-------------------------------二、加密数据、签名数据、验证、解密----------------------------------------------
dynamic outText = new ExpandoObject();
//加密数据
outText.dataEncrypt = RSAHelper.RSAEncrypt(client_PublicKey, data);
//签名数据
outText.dataSignatureFormatter = RSAHelper.SignatureFormatter(server_PrivateKey, outText.dataEncrypt);
//解密
outText.dataDecrypt = RSAHelper.RSADecrypt(client_PrivateKey, outText.dataEncrypt);
//验证
outText.yz = RSAHelper.SignatureDeformatter(server_PublicKey, outText.dataEncrypt, outText.dataSignatureFormatter);
----------------------------- public-1、获取公钥私钥--------------------------------------------
//声明一个指定大小的RSA容器
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
string PublicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string PrivateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
-----------------------------public-2、Hash描述 【签名数据、验证】用到-------------------------------------------------------------------------
/// <summary>
/// 获取Hash描述表
/// </summary>
/// <param name="strSource">待签名的字符串</param>
/// <param name="strHashData">Hash描述</param>
/// <returns></returns>
public static bool GetHash(string strSource, ref string strHashData, out byte[] HashData)
{
try
{
//从字符串中取得Hash描述
byte[] Buffer;
System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);
HashData = MD5.ComputeHash(Buffer);
strHashData = Convert.ToBase64String(HashData);
return true;
}
catch (Exception ex)
{
throw ex;
}
}
-------------------------------public-3、 c# 加密数据【分段加密】----------------------------------------------
/// <summary>
/// RSA分段加密
/// </summary>
/// <param name="publickey">公钥</param>
/// <param name="content">明文</param>
/// <returns></returns>
public static string RSAEncrypt(string publickey, string content)
{
if (string.IsNullOrEmpty(content))
return null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
//加载明文
byte[] data = Encoding.UTF8.GetBytes(content);
//公钥
byte[] keyBytes = Convert.FromBase64String(publickey);
int keySize = rsa.KeySize / 8;
int bufferSize = keySize - 11;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(data);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, bufferSize);
rsa.ImportCspBlob(keyBytes);
while (readLen > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen);
//加密
byte[] encData = rsa.Encrypt(dataToEnc, false);
msOuput.Write(encData, 0, encData.Length);
readLen = msInput.Read(buffer, 0, bufferSize);
}
msInput.Close();
//得到密文
byte[] result = msOuput.ToArray();
msOuput.Close();
rsa.Clear();
return Convert.ToBase64String(result);
}
}
-------------------------------public-4、c# 签名数据----------------------------------------------
/// <summary>
/// RSA签名
/// </summary>
/// <param name="p_strKeyPrivate">私钥</param>
/// <param name="m_strHashbyteSignature">待签名数据</param>
/// <returns></returns>
public static string SignatureFormatter(string p_strKeyPrivate, string strHashbyteSignature)
{
byte[] Hashbyte;
GetHash(strHashbyteSignature, ref strHashbyteSignature, out Hashbyte);
byte[] HashbyteSignature = Convert.FromBase64String(strHashbyteSignature);
//私钥
byte[] keyBytes = Convert.FromBase64String(p_strKeyPrivate);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(keyBytes);
RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(rsa);
//设置签名的算法为MD5
formatter.SetHashAlgorithm("MD5");
byte[] inArray = formatter.CreateSignature(HashbyteSignature);
return Convert.ToBase64String(inArray);
}
}
-------------------------------public-5、c# 验证----------------------------------------------
/// <summary>
/// RSA验证
/// </summary>
/// <param name="p_strKeyPublic">公钥</param>
/// <param name="p_strHashbyteDeformatter">Hash描述</param>
/// <param name="p_strDeformatterData">要为 rgbHash 验证的签名。</param>
/// <returns></returns>
public static bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
{
try
{
byte[] keyBytes = Convert.FromBase64String(p_strKeyPublic);
byte[] Hashbyte;
GetHash(p_strHashbyteDeformatter, ref p_strHashbyteDeformatter,out Hashbyte);
byte[] rgbSignature = Convert.FromBase64String(p_strDeformatterData);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(keyBytes);
RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(rsa);
deformatter.SetHashAlgorithm("MD5");
if (deformatter.VerifySignature(Hashbyte, rgbSignature))
{
return true;
}
return false;
}
}
catch
{
return false;
}
}
-------------------------------public-6、c# 解密----------------------------------------------
/// <summary>
/// RSA解密
/// </summary>
/// <param name="privatekey">私钥</param>
/// <param name="content">密文</param>
/// <returns></returns>
public static string RSADecrypt(string privatekey, string content)
{
if (string.IsNullOrEmpty(content))
return null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
//加载密文
byte[] dataEnc = Convert.FromBase64String(content);
//私钥
byte[] keyBytes = Convert.FromBase64String(privatekey);
rsa.ImportCspBlob(keyBytes);
int keySize = rsa.KeySize / 8;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(dataEnc);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, keySize);
while (readLen > 0)
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, 0, dataToDec, 0, readLen);
byte[] decData = rsa.Decrypt(dataToDec, false);
msOuput.Write(decData, 0, decData.Length);
readLen = msInput.Read(buffer, 0, keySize);
}
msInput.Close();
//得到明文
byte[] result = msOuput.ToArray();
msOuput.Close();
rsa.Clear();
return Encoding.UTF8.GetString(result);
}
}