最近自己在弄RSA的加簽和驗簽相關的東西,也感謝網上各位大牛提供的代碼,自己在巨人的肩膀上再留下一些自己的一些踩過坑的經驗。
public class RSAHelper { public string privateKey { get; set; } public string publicKey { get; set; } public RSAHelper() { //初始化時生成公鑰和私鑰 RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); privateKey=provider.ToXmlString(true);//生成私鑰 publicKey=provider.ToXmlString(false);//生成公鑰 } /// <summary> /// 生成公鑰、私鑰 /// </summary> /// <param name="PrivateKeyPath">私鑰文件保存路徑,包含文件名</param> /// <param name="PublicKeyPath">公鑰文件保存路徑,包含文件名</param> public void RSAKey() { RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); provider.ToXmlString(true);//生成私鑰文件 provider.ToXmlString(false);//生成公鑰文件 } /// <summary> /// 簽名 /// </summary> /// <param name="str">需簽名的數據</param> /// <returns>簽名后的值</returns> public string Sign(string str) { //根據需要加簽時的哈希算法轉化成對應的hash字符節 byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str); var sha256 = new SHA256CryptoServiceProvider(); byte[] rgbHash = sha256.ComputeHash(bt); RSACryptoServiceProvider key = new RSACryptoServiceProvider(); key.FromXmlString(privateKey); RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key); formatter.SetHashAlgorithm("SHA256");//此處是你需要加簽的hash算法,需要和上邊你計算的hash值的算法一致,不然會報錯。 byte[] inArray = formatter.CreateSignature(rgbHash); return Convert.ToBase64String(inArray); } /// <summary> /// 簽名驗證 /// </summary> /// <param name="str">待驗證的字符串</param> /// <param name="sign">加簽之后的字符串</param> /// <returns>簽名是否符合</returns> public bool SignCheck(string str, string sign) { try { byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str); var sha256 = new SHA256CryptoServiceProvider(); byte[] rgbHash = sha256.ComputeHash(bt); RSACryptoServiceProvider key = new RSACryptoServiceProvider(); key.FromXmlString(publicKey); RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key); deformatter.SetHashAlgorithm("SHA256"); byte[] rgbSignature = Convert.FromBase64String(sign); if (deformatter.VerifySignature(rgbHash, rgbSignature)) { return true; } return false; } catch { return false; } } }
借鑒與:https://www.cnblogs.com/lijialong/archive/2010/07/12/rsa.html