相关文章推荐
帅气的小熊猫  ·  mapbox gl 结合three.js ...·  1 月前    · 
博学的板凳  ·  c# ...·  6 月前    · 
爱健身的显示器  ·  Laravel Request ...·  1 年前    · 

问题:使用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"

 /// <summary>    
    /// RSA公钥pem-->XML格式转换, 
    /// </summary>    
    /// <param name="publicKey">pem公钥</param>    
    /// <returns></returns>    
    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"

/// <summary>
    /// 私钥转XML
    /// </summary>
    /// <param name="privateJavaKey"></param>
    /// <returns></returns>
    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算法使用公钥对数据加密

 /// <summary>
    /// RSA使用公钥对数据加密
    /// </summary>
    /// <param name="strText">加密数据</param>
    /// <param name="strPublicKey">公钥密文</param>
    /// <returns></returns>
    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算法使用公钥对数据加密

/// <summary> /// RSA使用私匙对签名内容加签名 /// </summary> /// <param name="privateKeyCSharp">私钥密文</param> /// <param name="data">待签名的内容</param> /// <returns></returns> 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 安装。