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. QtQuick使用MediaPlayer抓取摄像头影响报错Error: "Your GStreamer installation is missing a plug-in."

    环境:ubuntu18.04 Qt5.9.5 描述:项目需要使用qtquick作为显示界面用于播放从网络摄像头抓取的影像,海康网络摄像头,摄像头源协议使用的是rtsp,影像数据格式为x-h264,但在 ...

  2. 【学习笔记】C/C++ 设计模式 - 工厂模式(上)

    介绍说明 在年初七的时候,学习了工厂模式,今天在复习的时候发现漏了几个知识点,因此重写这篇文章,以循环渐进的描述方式来对比不同的使用技巧. 工厂设计模式属于 "创建型设计模式",在 ...

  3. Android第六次作业

    图片一 用内部存储实现文件写入和读取功能 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  4. 笔记: C#RabbitMQ初步使用记录

    Rabbitmq 的使用场景有哪些? ①. 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列.就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通讯方式. ②. 多个应用之间 ...

  5. 计算机网络12 TCP

    1 TCP简介 CP的全称是Transmission Control Protocol,即传输控制协议,TCP工作在传输层上 其职责是:实现主机间进程到进程的通信,其次还需要保证可靠性(不是安全性,换 ...

  6. Windows/office常用的激活工具有哪些

    Windows/office常用的激活方式 Windows激活方式有两种 Kms激活与数字权利永久激活,这两种激活方式各有优势,KMS激活通用性强(支持Windows+Office),但只能激活180 ...

  7. Opengl ES之踩坑记

    前因 最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们, 希望同在学习Opengl ES的朋友们能少走弯 ...

  8. 下午小博(java小知识)

    抽象类: 抽象类中可以构造方法 抽象类中可以存在普通属性,方法,静态属性和方法 抽象类中可以存在抽象方法如果一个类中有一个抽象方法,那么当前类一定是抽象类:抽象类中不一定有抽象方法 抽象类中的抽象方法 ...

  9. vscode在UBUNTU下使用CMAKE编译

    打开一个含有CMakeLists.txt的文件夹 在.vscode要建立三个json文件才能对Cmake工程进行编译和调试,分别是c_cpp_properties.json,launch.json和t ...

  10. Vue的基础-属性

    VUE vue-cli脚手架,vue-router路由 vuex做状态管理 vue ui 界面 1.下载node.js 2.下载vue-cli cnpm install vue-cli -g 查看模版 ...