1. 程式人生 > 其它 >C# RSA加密解密

C# RSA加密解密

public static void Generator(out string PrivarteKey, out string PublicKey, int KeySize = 1024)
{
RSACryptoServiceProvider rea = new RSACryptoServiceProvider(KeySize);
PrivarteKey = rea.ToXmlString(true);
PublicKey = rea.ToXmlString(false);

}

/// <summary>
/// RSA加密資料
/// </summary>
/// <param name="express">要加密資料</param>
/// <param name="KeyContainerName">密匙容器的名稱</param>
/// <returns></returns>
public static string RSAEncryption(string content, string publickey)
{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
return Convert.ToBase64String(cipherbytes);

}
/// <summary>
/// RSA加密PEM祕鑰
/// </summary>
/// <param name="publicKeyPEM"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string EncryptPEM(string publicKeyPEM, string data, string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.LoadPublicKeyPEM(publicKeyPEM);
cipherbytes = rsa.Encrypt(Encoding.GetEncoding(encoding).GetBytes(data), false);
//HashAlgorithmName hashName = new System.Security.Cryptography.HashAlgorithmName("SHA1");
//RSAEncryptionPadding padding = RSAEncryptionPadding.OaepSHA1;
//RSAEncryptionPadding.CreateOaep(hashName);//.NET 4.6以後特有
//cipherbytes = rsa.Encrypt(Encoding.GetEncoding(encoding).GetBytes(data), padding);

return Convert.ToBase64String(cipherbytes);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="privateKeyPEM"></param>
/// <param name="content"></param>
///<returns></returns>
public static string DecryptPEM(string privateKeyPEM, string data, string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.LoadPrivateKeyPEM(privateKeyPEM);

cipherbytes = rsa.Decrypt(Convert.FromBase64String(data), false);
//RSAEncryptionPadding padding = RSAEncryptionPadding.CreateOaep(new System.Security.Cryptography.HashAlgorithmName("SHA1"));//.NET 4.6以後特有

return Encoding.GetEncoding(encoding).GetString(cipherbytes);
}
/// <summary>
/// RSA解密資料
/// </summary>
/// <param name="express">要解密資料</param>
/// <param name="KeyContainerName">密匙容器的名稱</param>
/// <returns></returns>
public static string RSADecrypt(string content, string privatekey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);

return Encoding.UTF8.GetString(cipherbytes);

}


/// <summary>
/// 生成數字簽名
/// </summary>
/// <param name="originalText">原文</param>
/// <param name="privateKey"></param>
/// <returns></returns>
public static string GenSign(string originalText, string privateKey)
{
byte[] byteData = Encoding.UTF8.GetBytes(originalText);
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKey);
//使用SHA1進行摘要演算法,生成簽名
byteData = provider.SignData(byteData, new SHA1CryptoServiceProvider());
return Convert.ToBase64String(byteData);
}

/// <summary>
/// 驗證簽名
/// </summary>
/// <param name="originalText">原文</param>
/// <param name="SignedData">簽名</param>
/// <param name="publicKey">公鑰</param>
/// <returns></returns>
public static bool VerifySigned(string originalText, string signedData, string publicKey)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKey);
byte[] byteData = Encoding.UTF8.GetBytes(originalText);
byte[] signData = Convert.FromBase64String(signedData);
return provider.VerifyData(byteData, new SHA1CryptoServiceProvider(), signData);
}

/// <summary>
/// RSA簽名
/// </summary>
/// <param name="privateKeyPEM">私鑰</param>
/// <param name="data">待簽名的內容</param>
/// <returns></returns>
public static string RSASignPEM(string data, string privateKeyPEM, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.LoadPrivateKeyPEM(privateKeyPEM);//載入私鑰
var dataBytes = Encoding.GetEncoding(encoding).GetBytes(data);
var HashbyteSignature = rsa.SignData(dataBytes, hashAlgorithm);
return Convert.ToBase64String(HashbyteSignature);
}
/// <summary>
/// RSA簽名CSharp
/// </summary>
/// <param name="privateKeyCSharp">私鑰</param>
/// <param name="data">待簽名的內容</param>
/// <returns></returns>
public static string RSASignCSharp(string data, string privateKeyCSharp, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKeyCSharp);//載入私鑰
var dataBytes = Encoding.GetEncoding(encoding).GetBytes(data);
var HashbyteSignature = rsa.SignData(dataBytes, hashAlgorithm);
return Convert.ToBase64String(HashbyteSignature);
}

#region 驗籤

/// <summary>
/// 驗證簽名-方法一
/// </summary>
/// <param name="data"></param>
/// <param name="signature"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static bool VerifyJava(string data, string publicKeyJava, string signature, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//匯入公鑰,準備驗證簽名
rsa.FromPublicKeyJavaString(publicKeyJava);
//返回資料驗證結果
byte[] Data = Encoding.GetEncoding(encoding).GetBytes(data);
byte[] rgbSignature = Convert.FromBase64String(signature);

return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);

//return SignatureDeformatter(publicKeyJava, data, signature);

//return CheckSign(publicKeyJava, data, signature);

//return rsa.VerifyData(Encoding.GetEncoding(encoding).GetBytes(data), "MD5", Encoding.GetEncoding(encoding).GetBytes(signature));
}
/// <summary>
/// 驗證簽名PEM
/// </summary>
/// <param name="data"></param>
/// <param name="signature"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static bool VerifyPEM(string data, string publicKeyPEM, string signature, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//匯入公鑰,準備驗證簽名
rsa.LoadPublicKeyPEM(publicKeyPEM);
//返回資料驗證結果
byte[] Data = Encoding.GetEncoding(encoding).GetBytes(data);
byte[] rgbSignature = Convert.FromBase64String(signature);

return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);
}

/// <summary>
/// 驗證簽名CSharp
/// </summary>
/// <param name="data"></param>
/// <param name="signature"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static bool VerifyCSharp(string data, string publicKeyCSharp, string signature, string hashAlgorithm = "MD5", string encoding = "UTF-8")
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//匯入公鑰,準備驗證簽名
rsa.LoadPublicKeyPEM(publicKeyCSharp);
//返回資料驗證結果
byte[] Data = Encoding.GetEncoding(encoding).GetBytes(data);
byte[] rgbSignature = Convert.FromBase64String(signature);

return rsa.VerifyData(Data, hashAlgorithm, rgbSignature);
}

#region 簽名驗證-方法二
/// <summary>
/// 簽名驗證
/// </summary>
/// <param name="publicKey">公鑰</param>
/// <param name="p_strHashbyteDeformatter">待驗證的使用者名稱</param>
/// <param name="signature">註冊碼</param>
/// <returns>簽名是否符合</returns>
public static bool SignatureDeformatter(string publicKey, string data, string signature, string hashAlgorithm = "MD5")
{
try
{
byte[] rgbHash = ConvertToRgbHash(data);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//匯入公鑰,準備驗證簽名
rsa.FromPublicKeyJavaString(publicKey);

RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(rsa);
deformatter.SetHashAlgorithm("MD5");
byte[] rgbSignature = Convert.FromBase64String(signature);
if (deformatter.VerifySignature(rgbHash, rgbSignature))
{
return true;
}
return false;
}
catch
{
return false;
}
}

/// <summary>
/// 簽名資料轉化為RgbHash
/// </summary>
/// <param name="data"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static byte[] ConvertToRgbHash(string data, string encoding = "UTF-8")
{
using (MD5 md5 = new MD5CryptoServiceProvider())
{
byte[] bytes_md5_in = Encoding.GetEncoding(encoding).GetBytes(data);
return md5.ComputeHash(bytes_md5_in);
}
}
#endregion

#region 簽名驗證-方法三
/// <summary>
/// 驗證簽名
/// </summary>
/// <param name="data">原始資料</param>
/// <param name="sign">簽名</param>
/// <returns></returns>
public static bool CheckSign(string publicKey, string data, string sign, string encoding = "UTF-8")
{

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromPublicKeyJavaString(publicKey);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] Data = Encoding.GetEncoding(encoding).GetBytes(data);
byte[] rgbSignature = Convert.FromBase64String(sign);
if (rsa.VerifyData(Data, md5, rgbSignature))
{
return true;
}
return false;
}
#endregion
#endregion