C# RSA加密解密 签名实现
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加密解密 签名实现的更多相关文章
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- 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 ...
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...
- Java RSA 加密 解密 签名 验签
原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- .NET Core 使用RSA算法 加密/解密/签名/验证签名
前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...
- RSA加密解密及RSA签名和验证及证书
RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...
- 【转】C#中RSA加密解密和签名与验证的实现
[转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...
- RSA加密解密及RSA签名和验证
原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是 ...
- python实现RSA加密和签名以及分段加解密的方案
1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...
随机推荐
- 笔记:C#Quart帮助类 定时器 拿来即用
using Quartz.Impl; using Quartz.Impl.Triggers; using System; using System.Collections.Generic; using ...
- python正则查找
a = "#1+#5+#8+#10+#11+#12+#13+#14+#15-#22-#23-#24-#25-#26-#27-#28" b = re.findall("#\ ...
- oasys系统_JAVA代码审计
oasys系统_JAVA代码审计 一.前言 oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目.可以看到该项目的资源文件中是mappers且pom. ...
- java反序列化基础
前言:最近开始学习java的序列化与反序列化,现在从原生的序列化与反序列化开始,小小的记录一下 参考文章:https://blog.csdn.net/mocas_wang/article/detail ...
- SpringBoot+mybatis的驼峰命名转换不生效
使用SpringBoote+mybatis在mybatis-config.xml的配置文件内配置的驼峰命名不生效 然后我就将mybatis的配置写在application.yml内,然后就生效了 用注 ...
- Java Day 2
标识符 凡是变量中需要自己命名的地方都是标识符,例如:包名.类名.变量名等等 标识符的命名规则 1.Java的标识符只能用26个英文字母大小写,0-9的数字,下划线(_),和美元的符号($). 2.标 ...
- windows10、windows server 2016激活方法
1.激活准备 管理员打开cmd命令窗口(或者Windows+X组合键选择下图标注选项),复制对应版本命令回车即可 2.激活命令: 2.1 win 10 专业版 slmgr /ipk W269N-WFG ...
- 在vs code中进行本地调试和开启本地服务器
https://blog.csdn.net/tangxiujiang/article/details/80927699
- angular 封装http请求、解决跨域问题
第一部分:封装http请求 1.定义 ResultDataModel export interface ResultDataModel<T> { success: boolean; err ...
- 单兵 Web 快速开发框架!
Jmix 是低代码? 自从 Jmix 2018 年在中国推广以来(那时叫 CUBA 平台),很多开发者会在使用之前询问我们,Jmix 是不是低代码,扩展性怎么样? 低代码应用程序平台(LCAP)是当今 ...