這是一篇轉載合並文章,主要內容來自一下兩篇:
- RSA加解密,Java和C#互通 - 掘金
- C# RSA加密、解密、加簽、驗簽、支持JAVA格式公鑰私鑰、PEM格式公鑰私鑰、.NET格式公鑰私鑰 -變態模式【支持私鑰加密,公鑰解密】(二) - kevin860 - 博客園
使用的庫 bouncycastle
加密解密
加密解密相關的代碼,見:
-
第一篇博客的代碼整理
https://gist.github.com/JasonGrass/b773dd4fca392abe86f582876b6f470c -
加密解密2
C# RSA加密、解密、加簽、驗簽、支持JAVA格式公鑰私鑰、PEM格式公鑰私鑰、.NET格式公鑰私鑰、一般模式【支持公鑰加密,私鑰解密】(一) - kevin860 - 博客園
簽名,驗證簽名
#region 加簽
/// <summary>
/// 基於BouncyCastle的RSA簽名
/// </summary>
/// <param name="data"></param>
/// <param name="privateKeyJava"></param>
/// <param name="hashAlgorithm">JAVA的和.NET的不一樣,如:MD5(.NET)等同於MD5withRSA(JAVA)</param>
/// <param name="encoding"></param>
/// <returns></returns>
public static string RSASignJavaBouncyCastle(string data, string privateKeyJava, string hashAlgorithm = "MD5withRSA", string encoding = "UTF-8")
{
RsaKeyParameters privateKeyParam = (RsaKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyJava));
ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);
signer.Init(true, privateKeyParam);//參數為true驗簽,參數為false加簽
var dataByte = Encoding.GetEncoding(encoding).GetBytes(data);
signer.BlockUpdate(dataByte, 0, dataByte.Length);
//return Encoding.GetEncoding(encoding).GetString(signer.GenerateSignature()); //簽名結果 非Base64String
return Convert.ToBase64String(signer.GenerateSignature());
}
#endregion
#region 驗簽
/// <summary>
/// 基於BouncyCastle的RSA簽名
/// </summary>
/// <param name="data">源數據</param>
/// <param name="publicKeyJava"></param>
/// <param name="signature">base64簽名</param>
/// <param name="hashAlgorithm">JAVA的和.NET的不一樣,如:MD5(.NET)等同於MD5withRSA(JAVA)</param>
/// <param name="encoding"></param>
/// <returns></returns>
public static bool VerifyJavaBouncyCastle(string data, string publicKeyJava, string signature, string hashAlgorithm = "MD5withRSA", string encoding = "UTF-8")
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyJava));
ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);
signer.Init(false, publicKeyParam);
byte[] dataByte = Encoding.GetEncoding(encoding).GetBytes(data);
signer.BlockUpdate(dataByte, 0, dataByte.Length);
//byte[] signatureByte = Encoding.GetEncoding(encoding).GetBytes(signature);// 非Base64String
byte[] signatureByte = Convert.FromBase64String(signature);
return signer.VerifySignature(signatureByte);
}
hash 算法如果使用 SHA256,則使用 SHA256withRSA
C# 原生自帶的類,不支持 OpenSSL 生成的密鑰。
rsa - C# 如何使用OpenSSL生成的公鑰秘鑰對進行加密解密? - SegmentFault 思否
END