对于上上篇博客中我讲的一个故事,本文引用: https://www.cnblogs.com/ButterflyEffect/p/9851403.html

故事中提到的关于加密会出现,私钥加密,公钥解密的情况,这种情况我们将它称为【私钥加签,公钥验签】
说句好理解的话:
既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出【公钥负责加密,私钥负责解密】
同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出【私钥负责加签,公钥负责验签】

由以上得出关于安全性的问题,再举个好例子:
现在有A(私钥A、公钥A),B(私钥B、公钥B) ,A向B发送消息,用私钥A加签、用公钥B加密,发送给B,B用私钥B解密,然后用公钥A验签。
这样的话就能保证是A发的消息,并且只有B自己才能解密。这样是非常安全的!!!

话不多少,下面直接撸代码,以下代码是实现【私钥加签公钥验签】的功能,公钥加密私钥解密的功能在我其它博客有讲过...

 #region 私钥加密,公钥解密/// <summary>/// 私钥加密/// </summary>/// <param name="privateKey">RSA私钥 base64格式</param>/// <param name="contentData">待加密的数据</param>/// <param name="algorithm">加密算法</param>/// <returns></returns>public static string EncryptWithPrivateKey(string privateKey, byte[] contentData, string algorithm = "RSA/ECB/PKCS1Padding"){return Convert.ToBase64String(EncryptWithPrivateKey(Convert.FromBase64String(privateKey), contentData, algorithm));}/// <summary>/// 私钥加密/// </summary>/// <param name="privateKey">RSA私钥</param>/// <param name="contentData">待加密的数据</param>/// <param name="algorithm">加密算法</param>/// <returns></returns>public static byte[] EncryptWithPrivateKey(byte[] privateKey, byte[] contentData, string algorithm = "RSA/ECB/PKCS1Padding"){RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(privateKey);return Transform(privateKeyParam, contentData, algorithm, true);}/// <summary>/// 公钥解密/// </summary>/// <param name="publicKey">RSA公钥  base64格式</param>/// <param name="content">待解密数据 base64格式</param>/// <param name="encoding">解密出来的数据编码格式,默认UTF-8</param>/// <param name="algorithm">加密算法</param>/// <returns></returns>public static string DecryptWithPublicKey(string publicKey, string content, string encoding = "UTF-8", string algorithm = "RSA/ECB/PKCS1Padding"){return Encoding.GetEncoding("GB2312").GetString(DecryptWithPublicKey(Convert.FromBase64String(publicKey), Convert.FromBase64String(content), algorithm));}/// <summary>/// 公钥解密/// </summary>/// <param name="publicKey">RSA公钥</param>/// <param name="contentData">待解密数据</param>/// <param name="algorithm">加密算法</param>/// <returns></returns>public static byte[] DecryptWithPublicKey(byte[] publicKey, byte[] contentData, string algorithm = "RSA/ECB/PKCS1Padding"){RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKey);return Transform(publicKeyParam, contentData, algorithm, false);}#endregionprivate static byte[] Transform(AsymmetricKeyParameter key, byte[] contentData, string algorithm, bool forEncryption){var c = CipherUtilities.GetCipher(algorithm);c.Init(forEncryption, new ParametersWithRandom(key));return c.DoFinal(contentData);}

顺带提下,这里的第三方RSA引用包可以在【程序包管理器控制台】输入命令提示
PM> Install-Package BouncyCastle
完成包的安装

static void Main(string[] args)
{RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();string xmlPrivateKey = rsa.ToXmlString(true);//XML密钥string xmlPublicKey = rsa.ToXmlString(false);//XML公钥string str = "测试数据";byte[] b = System.Text.Encoding.Default.GetBytes(str);//字符串转字节数组,byte[]string EncryptedData = EncryptWithPrivateKey(B(xmlPrivateKey), b);//返回加密后的base64格式数据Console.WriteLine("私钥加密结果:" + EncryptedData);string DecipheringData = DecryptWithPublicKey(A(xmlPublicKey), EncryptedData);//返回解密后的明文数据Console.WriteLine("公钥解密结果:" + DecipheringData);Console.ReadLine();
}//XML格式转base64格式,公钥
public static string A(string xml)
{var rsa = new RSACryptoServiceProvider();rsa.FromXmlString(xml);var p = rsa.ExportParameters(false);RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent));SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key);byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();string publicKey = Convert.ToBase64String(serializedPublicBytes);return publicKey;
}//XML格式转base64格式,私钥
public static string B(string xml)
{var rsa = new RSACryptoServiceProvider();rsa.FromXmlString(xml);var p = rsa.ExportParameters(true);var key = new RsaPrivateCrtKeyParameters(new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D),new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ),new BigInteger(1, p.InverseQ));PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(key);byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();string privateKey = Convert.ToBase64String(serializedPrivateBytes);return privateKey;
}

最后加密测试可以在这个网站去测试 http://tool.chacuo.net/cryptrsapubkey

转载于:https://www.cnblogs.com/ButterflyEffect/p/9858092.html

【绝迹篇】RSA加密算法(私钥加签公钥验签)相关推荐

  1. 网络--keytool自签名SSL证书(免费)以及私钥签名、公钥验签

    本文主要介绍keytool自签名SSL证书(免费)以及私钥签名.公钥验签流程,点击查看keytool CA签名SSL证书(收费) 最近给银行做一个系统,虽说是给行内使用的,但是系统要同时支持内外网方式 ...

  2. 公钥加密,私钥解密;私钥签名,公钥验签。

    加密.解密:这个好理解.例如 A.B之间相互传东西,A拥有A的私钥.B的公钥:B拥有B的私钥.A的公钥:这样当A给B传信息的时候,用B的公钥加密,这样只有B才能解密,保证了信息的安全.同理,B给A传信 ...

  3. 公钥加密,私钥解密;私钥签名,公钥验签

    数字签名是什么? 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 苏珊要给鲍勃写一封保密的信.她写完后用鲍勃的公钥加密,就可以达到保密的 ...

  4. PHP实现RSA与RSA256加密,解密,加签,验签

    1.RSA加密简介 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私 ...

  5. golang RSA base64 加解密 签名验签

    1.秘钥.加密/签名字符串加密的格式 目前主要见到有hex及base64 (1)hex 针对hex的加解密 import ("encoding/hex" ) hex.DecodeS ...

  6. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  7. RSA-公钥加密,私钥解密 、私钥加密,公钥解密、私钥加签,公钥验签

    https://blog.csdn.net/qq_31289187/article/details/85234044 一.案例内容: RSA 公钥加密,私钥解密:     RSA 私钥加密,公钥解密: ...

  8. asp版 vbscript RSA公钥加密 / 私钥解密 / 私钥签名 / 公钥验签(支持中文)分段加密解密

    最近有空在把自己的asp站点后端函数全部整理了下,在弄RSA的时候遇到了坑了,然后找到下面这位兄弟刚好发布的文章: https://blog.csdn.net/todaygods/article/de ...

  9. 公钥、私钥、证书、加密、解密、加签、验签

    https://blog.csdn.net/woniu211111/article/details/108114402 明文.密文.密钥.加密.解密 明文:指没有经过加密的信息/数据. 密文:明文被加 ...

  10. ASP VBSCRIPT VBA RSA 公钥加密 私钥解密 私钥签名 公钥验签

    <% '@title: Class_Crypt_Rsa '@author: ekede.com '@date: 2020-10-28 '@description: RSA 公钥加密->私钥 ...

最新文章

  1. linux命令:grep
  2. Jmeter加Fiddler对web项目测试
  3. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)
  4. 最大子序列求和_最大子序列和问题
  5. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
  6. [原创]IrrLicht的GUI使用
  7. Spring Boot基础学习笔记01:Spring Boot入门程序
  8. python 字典默认会引用 除非深拷贝
  9. linux通过数字权限设置密码,linux--权限管理和用户管理
  10. 如何查看IOS系统APP的包名
  11. C0型单元刚度矩阵的性质
  12. 如何设计接口测试用例?(文末送接口测试用例模板)
  13. mouseenter鼠标事件
  14. 机器学习(二)--新加坡国立大学寒假学习项目总结
  15. 使用redis实现附近的人
  16. ICC---data setup
  17. LaneLoc:基于高精地图的车道线定位
  18. 【LOJ3055】「HNOI2019」JOJO
  19. csu 1020 真三国无双
  20. hpprobook440g1拆机_hp prodesk 400 g1 是如何拆机的

热门文章

  1. 寄售Consignment和VMI有什么区别?
  2. 1.1确定分数与浮点数值之间的近似相等性。
  3. WinForm窗体生命周期
  4. vmware16安装centos7超详细说明
  5. Thingsboard 3.1.0 - 规则链:转换数据结构
  6. GitStats-Git历史统计信息工具(转载)
  7. jquery 自定义正方形图标_当你在玩 iOS14自定义图标时,有人用它赚了70万了!
  8. TypeError: can only concatenate str (not “list“) to str 报错
  9. hbase动态更改行键设计_nosql – HBase行键设计,用于单调递增键
  10. 机器学习分类算法_收藏:机器学习算法分类图谱及其优缺点分析