问题:使用OPENSSL生成的公钥和私钥,需要使用RSA算法对AES密钥和参数进行加密、签名,java中可以直接识别pem格式的公钥和私钥文件,但是C#中只能识别XML格式的,所以需要进行转换
注意:pem转XML时。需要依赖一个第三方库,叫BouncyCastle。官网地址:
BouncyCastle
(如果从官网下载太慢或无法下载可通过百度网盘下载:https://pan.baidu.com/s/1I7URHC7C89MlqT2OfZUSig
提取码:ri2v )
1.公钥pem格式文件转XML
注意:传递的私钥需要剔除开头"-----BEGIN PUBLIC KEY-----“和结尾”-----END PUBLIC KEY-----“以及密文中的”\n"和"\r"
public static string RSAPublicKey(string publicKey)
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
return XML;
2.私钥pem格式文件转XML
注意:传递的私钥需要剔除开头"-----BEGIN PRIVATE KEY-----“和结尾”-----END PRIVATE KEY-----“以及密文中的”\n"和"\r"
public static string ConvertToXmlPrivateKey(string privateJavaKey)
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey));
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()));
3.RSA算法使用公钥对数据加密
public static string RSAEncrypt(string strText, string strPublicKey)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(RSAPublicKey(strPublicKey));
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(strText), false);
return Convert.ToBase64String(cipherbytes);
4.RSA算法使用公钥对数据加密
public static string RSASignCSharp(string data, string privateKeyCSharp, string hashAlgorithm = "MD5", string encoding = "UTF-8")
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(ConvertToXmlPrivateKey(privateKeyCSharp));
var dataBytes = Encoding.GetEncoding(encoding).GetBytes(data);
var HashbyteSignature = rsa.SignData(dataBytes, hashAlgorithm);
return Convert.ToBase64String(HashbyteSignature);
问题:使用OPENSSL生成的公钥和私钥,需要使用RSA算法对AES密钥和参数进行加密、签名,java中可以直接识别pem格式的公钥和私钥文件,但是C#中只能识别XML格式的,所以需要进行转换注意:pem转XML时。需要依赖一个第三方库,叫BouncyCastle。官网地址:BouncyCastle(如果从官网下载太慢或无法下载可通过百度网盘下载:https://pan.baidu.com/s/1I7URHC7C89MlqT2OfZUSig提取码:ri2v )1.公钥pem格式文件转XML注
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥、一般模式【支持公钥加密,私钥解密】(一)
2017-12-04日更新:增加支持微信支付。代码注释中//☆☆☆☆.NET 4.6以后特有☆☆☆☆的别用,那个不对。
RSA非对称加密。简明扼要吧,直说干货。(在此特别感谢下貳进制,提供JAVA版的公钥私钥)
C#RSA加签解签加密比较常见,一般遇到的问题是非.NET代码的加签验签、加密解密。以下就是解决此类问题的。
一般情况下是【...
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
1、第一步先用openssl将pem的key转换为der的key //E:\01Doc\bin>openssl.exe rsa -in rsakeydec.pem -outform der -out pri.der
2、调用下面的程序直接读取der转换为c#所需要的xml Key,之后进行密文解密
3、openssl下载地址
http://download.csdn.net/d
c# rsa加密需要xml公钥 如何将pem格式转换成xml (c# rsa只支持XML格式的)
RSA PEM格式(蓝色部分是公钥=publicKey):
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUABgQD5MIb5ZQhNGhsUjfFbn7y6nY6tsqV9LcC2s/rLpu9sz8CplsTy2SuTG0o7y9ICXW6oRUC9bVxI8TfTK4bbSrNQ6UoExzQFdbc3pEGun3iCy+inBhIC6xf5Z7..
PEM私钥文件格式与使用
使用微软的.Net开发时,使用System.Security.Cryptography.RSACryptoServiceProvider类实现RSA算法,其直接使用的公钥/私钥格式为XML,这是一种特有的格式,其它语言如Java中一般使用PEM或DER等格式,OpenSSL规范中特荐为PEM格式。
如何在C#中使用PEM格式密钥?今天先从分析PEM公钥开始,后面再分析私钥...
C#使用pem格式的密钥对文件来做RSA加解密接签名和验证签名,这里的pem文件是openssl命令生成的密钥对文件,其中私钥pem文件需要用openssl命令转换成pkcs8格式的pem文件。如果已有pem文件,也可以通过openssl命令转换成pkscs8格式的。转换命令为:openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out private_pk8.pem
完整的C#代码,vs2008工程,可编译和测试。
差点造了一整个轮子
.Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8、PKCS#1格式密钥对的导入导出。
Github: github.com/xiangyuecn/…
本文内容来自README,主要介绍了PEM PKCS#8、PKCS#1公钥和私钥格式,并以此为基础...
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider
DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密
对称加密的意思:有一个密钥 相当于加密算法,加密用它来加密,解密也需要用到它。因为加密解密都是用同一个密钥所以叫对称加密。 对称加密有一个坏处只要拥有密钥的人都可以解密。
非对称加密:就是有2个...
引用第三方类库 BouncyCastle nuget: https://www.nuget.org/packages/BouncyCastle网址: http://www.bouncycastle.org/csharp/index.html1.生成 pem 私钥TextWriter textWriter = new StringWriter();
PemWriter pemWriter = n...
using System.Security.Cryptography;
using System.Xml;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
class Program
static void Main(string[] args)
string publicKeyPath = "public_key.pem";
string privateKeyPath = "private_key.pem";
// Read public key
AsymmetricKeyParameter publicKeyParam;
using (var reader = File.OpenText(publicKeyPath))
publicKeyParam = (AsymmetricKeyParameter)new PemReader(reader).ReadObject();
// Convert public key to XML format
var rsa = (RSA)RSA.Create();
rsa.ImportParameters(DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKeyParam));
var publicKeyXml = rsa.ToXmlString(false);
// Read private key
AsymmetricCipherKeyPair keyPair;
using (var reader = File.OpenText(privateKeyPath))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
// Convert private key to XML format
rsa = (RSA)RSA.Create();
rsa.ImportParameters(DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyPair.Private));
var privateKeyXml = rsa.ToXmlString(true);
// Print public and private keys in XML format
Console.WriteLine("Public key in XML format:");
Console.WriteLine(publicKeyXml);
Console.WriteLine();
Console.WriteLine("Private key in XML format:");
Console.WriteLine(privateKeyXml);
注意:BouncyCastle 库需要通过 NuGet 安装。