class RSACryptoItem
{
public RSACryptoServiceProvider Provider;
public List<byte> PubKeyBytes;
} public class RSAManager
{
private RSACryptoItem item; public RSAManager()
{
item = GenRSACryptoItem();
} private RSACryptoItem GenRSACryptoItem()
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
List<byte> pubKeyBytes = new List<byte>(provider.ExportCspBlob(false));
return new RSACryptoItem
{
Provider = provider,
PubKeyBytes = pubKeyBytes,
};
} /// <summary>
/// 使用公钥加密
/// </summary>
/// <param name="inBytes"></param>
/// <param name="publicKey"></param>
/// <returns></returns>
public static byte[] EncryptDataByPublicKey(byte[] inBytes, string publicKey)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKey);
return provider.Encrypt(inBytes, false);
} /// <summary>
/// 使用私钥解密
/// </summary>
/// <param name="inBytes"></param>
/// <param name="privateKey"></param>
/// <returns></returns>
public static byte[] DecryptDataByPrivateKey(byte[] inBytes,string privateKey)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKey);
return provider.Decrypt(inBytes, false);
} /// <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);
} public byte[] EncryptData(byte[] inBytes)
{
if (item != null)
return item.Provider.Encrypt(inBytes, false);
return null;
} public byte[] DecryptData(byte[] inBytes)
{
if (item != null)
return item.Provider.Decrypt(inBytes,false);
return null;
}
}
使用例子:
static void Main(string[] args)
{
//rsa使用方法1
//RSAManager rsaManager = new RSAManager();
string str = "hello world!!!";
//byte[] encryptStr = rsaManager.EncryptData(Encoding.UTF8.GetBytes(str));
//Console.WriteLine("Encrypt Data:");
//foreach (var b in encryptStr)
//{
// Console.Write(b);
//}
//Console.WriteLine();
//Console.WriteLine("Decrypt Data:");
//Console.WriteLine(Encoding.UTF8.GetString(rsaManager.DecryptData(encryptStr))); //rsa使用方法2
//RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
//string publicKey = provider.ToXmlString(false);
//string privateKey = provider.ToXmlString(true);
//byte[] encryptStr = RSAManager.EncryptDataByPublicKey(Encoding.UTF8.GetBytes(str), publicKey);
//Console.WriteLine("Encrypt Data:");
//foreach (var b in encryptStr)
//{
// Console.Write(b);
//}
//Console.WriteLine();
//Console.WriteLine("Decrypt Data:");
//Console.WriteLine(Encoding.UTF8.GetString(RSAManager.DecryptDataByPrivateKey(encryptStr,privateKey))); //使用数字签名
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
string publicKey = provider.ToXmlString(false);
string privateKey = provider.ToXmlString(true);
string originalText = "hello world!!!";
string signStr = RSAManager.GenSign(originalText, privateKey);
Console.WriteLine("sign:\r\n" + signStr +"\r\n");
//Console.WriteLine($"VerifySigned:\r\n{RSAManager.VerifySigned(originalText, signStr, publicKey)}");
Console.WriteLine($"VerifySigned:\r\n{RSAManager.VerifySigned("error string code", signStr, publicKey)}"); Console.ReadKey();
}

C# RSA加密解密 签名实现的更多相关文章

  1. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  2. Java使用RSA加密解密签名及校验

    RSA加密解密类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  3. C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

    差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...

  4. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  5. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

  6. .NET Core 使用RSA算法 加密/解密/签名/验证签名

    前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...

  7. RSA加密解密及RSA签名和验证及证书

    RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...

  8. 【转】C#中RSA加密解密和签名与验证的实现

    [转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...

  9. RSA加密解密及RSA签名和验证

    原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是 ...

  10. python实现RSA加密和签名以及分段加解密的方案

    1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...

随机推荐

  1. 程序员大杀器?带你玩转ChatGPT

    作者:京东零售 栗鸿宇 ChatGPT简介 ChatGPT是一款基于AI技术的机器人对话软件,它能够与用户进行智能化的聊天对话,帮助用户解决日常生活中的问题,为用户提供丰富的信息和服务.它集成了海量知 ...

  2. Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

    前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集 ...

  3. C#小知识之中英文转换、去空格

    一.中英文转换 1.安装NPinYin 2.编写代码 string str = "这里是测试的中文字符串"; string str1 = Pinyin.GetChineseText ...

  4. 使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件

    使用vs2019学习xamarin时,创建新程序.使用模拟器真机等测试都报错如下图错误: 调整AndroidManifest.xml和设备调试属性,打开[Android SDK和工具]安装可能需要的S ...

  5. Portainer功能使用之开启远程访问

    配置远程连接Docker服务 1.配置 说明:docker默认没有打开"2375"端口,需要先进行配置开启端口 命令 修改配置:vim /usr/lib/systemd/syste ...

  6. java基础(完整版)

    java javaSE 注释: block块级 line 行 标识符和关键字 组成部分.变量名.类名.方法名--------标识符 $\数字._\字母 数据类型 强类型语言---安全性高--速度会慢 ...

  7. c语言以及高级语言中的float到底是什么以及IEEE754

    对内存里float4字节的好奇 初学计算机都要学那个什么二进制十进制什么补码 反码那些玩意儿哈,由于最近要做一个单片机往另外一个单片机发数据的需求,直接c语言指针 然后float4字节传过去不就得了吗 ...

  8. 3D场景建模零代码平台

    3D场景建模软件(零基础.零代码.**),是指用来制作场景的软件,分为2D建模和3D建模,二者使用的技术及原理不同. 2D软件:它是用3维几何图形绘制出三维图形的软件,其主要功能是利用软件中已经画好的 ...

  9. 前端随笔0:URL与状态的双向绑定

    记录一些最近写前端的思考总结,也算是给自己的技术随笔开个篇 在接触以 React,Vue 为代表的工程化前端框架前,我还是一个拿着 jQuery 手撸特效和手写 CSS 的切图仔,捣鼓 Vue 时接触 ...

  10. webgl 系列 —— 绘制一个点(版本2、版本3、版本4、版本5)

    绘制一个点 我们初步认识了 webgl,本篇主要围绕绘制一个点的示例,逐步实现下面功能: 点的位置从 js 传入着色器 点的大小由 js 传入着色器 通过鼠标点击绘点 通过鼠标点击绘点,并改变点的颜色 ...