1、产生密钥:

private static void CreateKey()
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
string publicKey = rsa.ToXmlString(false); // 公钥
string privateKey = rsa.ToXmlString(true); // 私钥
}
}

这里产生的密钥是xml格式的,这也是.net的rsa的密钥格式。但有时候在.net项目中,我们只有java格式的密钥,具体的来说密钥就是一个字符串,这时候需要将其转换为xml格式的。

//公钥格式的转换
public static string RsaPublicKeyToXml(string publicKey)
{
try
{
if (string.IsNullOrWhiteSpace(publicKey))
return "";
if (publicKey.Contains("<RSAKeyValue>"))
return publicKey;
RsaKeyParameters publicKeyParam;
//尝试进行java格式的密钥读取
try
{
publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
}
catch
{
publicKeyParam = null;
}
//非java格式密钥进行pem格式的密钥读取
if (publicKeyParam == null)
{
try
{
var pemKey = publicKey;
if (!pemKey.Contains("BEGIN RSA PRIVATE KEY"))
{
pemKey = @"-----BEGIN RSA PRIVATE KEY-----
" + publicKey + @"
-----END RSA PRIVATE KEY-----";
}
var array = Encoding.ASCII.GetBytes(pemKey);
var stream = new MemoryStream(array);
var reader = new StreamReader(stream);
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(reader);
publicKeyParam = (RsaKeyParameters)pemReader.ReadObject();
}
catch
{
publicKeyParam = null;
}
}
//如果都解析失败,则返回原串
if (publicKeyParam == null)
return publicKey;
//输出XML格式密钥
return string.Format(
"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())
);
}
catch (Exception)
{
return "error";
}
}
//私钥格式转换
public static string RsaPrivateKeyToXml(string privateKey)
{
try
{
if (string.IsNullOrWhiteSpace(privateKey))
return "";
if (privateKey.Contains("<RSAKeyValue>"))
return privateKey;
RsaPrivateCrtKeyParameters privateKeyParam;
//尝试进行java格式的密钥读取
try
{
privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
}
catch
{
privateKeyParam = null;
}
//非java格式密钥进行pem格式的密钥读取
if (privateKeyParam == null)
{
try
{
var pemKey = privateKey;
if (!pemKey.Contains("BEGIN RSA PRIVATE KEY"))
{
pemKey = @"-----BEGIN RSA PRIVATE KEY-----
" + privateKey + @"
-----END RSA PRIVATE KEY-----";
}
var array = Encoding.ASCII.GetBytes(pemKey);
var stream = new MemoryStream(array);
var reader = new StreamReader(stream);
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(reader);
var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
privateKeyParam = (RsaPrivateCrtKeyParameters)keyPair.Private;
}
catch
{
privateKeyParam = null;
}
}
//如果都解析失败,则返回原串
if (privateKeyParam == null)
return privateKey;
//输出XML格式密钥
return string.Format(
"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned())
);
}
catch (Exception)
{
throw PayException.New("RSA私钥密钥格式转换失败");
}
}

2、公钥加密,私钥解密(包括超长字符串的分段加密解密)

public static string RsaEncrypt(string rawInput, string publicKey)
{
if (string.IsNullOrEmpty(rawInput))
{
return string.Empty;
} if (string.IsNullOrWhiteSpace(publicKey))
{
throw new ArgumentException("Invalid Public Key");
} using (var rsaProvider = new RSACryptoServiceProvider())
{
var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流
rsaProvider.FromXmlString(publicKey);//载入公钥
int bufferSize = (rsaProvider.KeySize / ) - ;//单块最大长度
var buffer = new byte[bufferSize];
using (MemoryStream inputStream = new MemoryStream(inputBytes),
outputStream = new MemoryStream())
{
while (true)
{ //分段加密
int readSize = inputStream.Read(buffer, , bufferSize);
if (readSize <= )
{
break;
} var temp = new byte[readSize];
Array.Copy(buffer, , temp, , readSize);
var encryptedBytes = rsaProvider.Encrypt(temp, false);
outputStream.Write(encryptedBytes, , encryptedBytes.Length);
}
return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输
}
}
} public static string RsaDecrypt(string encryptedInput, string privateKey)
{
if (string.IsNullOrEmpty(encryptedInput))
{
return string.Empty;
} if (string.IsNullOrWhiteSpace(privateKey))
{
throw new ArgumentException("Invalid Private Key");
} using (var rsaProvider = new RSACryptoServiceProvider())
{
var inputBytes = Convert.FromBase64String(encryptedInput);
rsaProvider.FromXmlString(privateKey);
int bufferSize = rsaProvider.KeySize / ;
var buffer = new byte[bufferSize];
using (MemoryStream inputStream = new MemoryStream(inputBytes),
outputStream = new MemoryStream())
{
while (true)
{
int readSize = inputStream.Read(buffer, , bufferSize);
if (readSize <= )
{
break;
} var temp = new byte[readSize];
Array.Copy(buffer, , temp, , readSize);
var rawBytes = rsaProvider.Decrypt(temp, false);
outputStream.Write(rawBytes, , rawBytes.Length);
}
return Encoding.UTF8.GetString(outputStream.ToArray());
}
}
}

3、私钥加密,公钥解密(包括超长字符串的分段加密解密)

/// <summary>
/// RSA加密 使用私钥加密
/// </summary>
/// <param name="byteData"></param>
/// <param name="key"></param>
/// <returns></returns>
private static string RSAEncrypt(string data, string key)
{
byte[] byteData = Encoding.UTF8.GetBytes(data);
var privateRsa = GetRsaCryptoFromXml(key);
//转换密钥 下面的DotNetUtilities来自Org.BouncyCastle.Security
var keyPair = DotNetUtilities.GetKeyPair(privateRsa); var c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); c.Init(true, keyPair.Private);//取私钥(true为加密) int bufferSize = (privateRsa.KeySize / ) - ;//单块最大长度
var buffer = new byte[bufferSize];
using (MemoryStream inputStream = new MemoryStream(byteData), outputStream = new MemoryStream())
{
while (true)
{ //分段加密
int readSize = inputStream.Read(buffer, , bufferSize);
if (readSize <= )
{
break;
} var temp = new byte[readSize];
Array.Copy(buffer, , temp, , readSize);
//var encryptedBytes = rsaProvider.Encrypt(temp, false);
var encryptedBytes = c.DoFinal(temp);
outputStream.Write(encryptedBytes, , encryptedBytes.Length);
}
return Convert.ToBase64String( outputStream.ToArray());//转化为字节流方便传输
} } /// <summary>
/// RSA解密 使用公钥解密
/// </summary>
/// <param name="byteData"></param>
/// <param name="key"></param>
/// <returns></returns>
private static string RSADecrypt(string data, string key)
{
byte[] byteData= Convert.FromBase64String(data);
var privateRsa = GetRsaCryptoFromXml(key);
//转换密钥
var keyPair = DotNetUtilities.GetRsaPublicKey(privateRsa); var c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); c.Init(false, keyPair);//取公钥(false为解密) using (MemoryStream inputStream = new MemoryStream(byteData), outputStream = new MemoryStream())
{
int restLength = byteData.Length;
while (restLength > )
{
int readLength = restLength < ? restLength : ;
restLength = restLength - readLength;
byte[] readBytes = new byte[readLength];
inputStream.Read(readBytes, , readLength);
byte[] append = c.DoFinal(readBytes);
outputStream.Write(append, , append.Length);
}
//注意,这里不一定就是用utf8的编码方式,这个主要看加密的时候用的什么编码方式
return Encoding.UTF8.GetString(outputStream.ToArray());
} }

.net中RSA加密解密的更多相关文章

  1. OpenSSL 中 RSA 加密解密实现源代码分析

    1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...

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

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

  3. C#中RSA加密解密和签名与验证的实现

    RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Le ...

  4. php中rsa加密解密验证

    RSA非对称加密,对敏感的数据传输进行数据加密.验证等.测试环境:wamp.aliyun虚拟主机(lamp)一.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以).下载生 ...

  5. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  6. RSA加密解密中pkcs1与pkcs8格式私钥互相转换

    net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8 如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812.如果是pkcs8的格式的密钥长度为861. ...

  7. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

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

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

  9. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

随机推荐

  1. [bzoj1978][BeiJing2010]取数游戏 game_动态规划_质因数分解

    取数游戏 game bzoj-1978 BeiJing-2010 题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数.假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j&l ...

  2. 更新数据库中数据时出现: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences 问题

    使用workbench在数据库中更新数据时报错: You are using safe update mode and you tried to update a table without a WH ...

  3. php-fpm回顾和总结

    时间久了很容易忘,这里做个备份 FastCGI协议php语言的实现,可以高效处理来自web端的动态请求 php-fpm维护一个或者多个php-cgi进程池,处理请求时不需要频繁创建进程 所以比传统的C ...

  4. FDMemTable内存表操作

    unit Umemtable; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System ...

  5. &quot;Simple Factory&quot; vs &quot;Factory Method&quot; vs &quot;Abstract Factory&quot; vs &quot;Reflect&quot;

    ref: http://www.cnblogs.com/zhangchenliang/p/3700820.html 1. "Simple Factory" package torv ...

  6. GitHub现VMware虚拟机逃逸EXP,利用三月曝光的CVE-2017-4901漏洞

    今年的Pwn2Own大赛后,VMware近期针对其ESXi.Wordstation和Fusion部分产品发布更新,修复在黑客大赛中揭露的一些高危漏洞.事实上在大赛开始之前VMware就紧急修复了一个编 ...

  7. 利用Python爬虫实现百度网盘自动化添加资源

    事情的起因是这样的,由于我想找几部经典电影欣赏欣赏,于是便向某老司机寻求资源(我备注了需要正规视频,绝对不是他想的那种资源),然后他丢给了我一个视频资源网站,说是比较有名的视频资源网站.我信以为真,便 ...

  8. mac 终端经常使用命令(三)

    基本命令 1.列出文件 ls 參数 文件夹名        例: 看看驱动文件夹下有什么:ls /System/Library/Extensions 參数 -w 显示中文,-l 具体信息. -a 包含 ...

  9. 经典面试题回答——学习Java基础的目的

    本系列知识解释:相信每个学习Java的人都是从JavaSE開始的,也就是Java基础開始. 可是却并不清楚学习Java基础究竟有什么用?        首先我来回答这个问题,学习Java基础是有两个目 ...

  10. Visual Studio静态编译

    1.Visual Studio静态编译设置: [Project]-[prj_name Properties],按例如以下框设置 2.why配置成静态编译? 假设动态编译,在没有安装Visual Stu ...