C# 与JAVA 的RSA 加密解密交互,互通。C# 与JAVA 的密钥格式的转换

创建帮助类RSAUtil
---------------------------------------------------加密(社保解密)-----------------------------------------------------------
(BouncyCastle.Crypto.dll)使用到的DLL下载:

下载链接 https://downloads.bouncycastle.org/csharp/bccrypto-csharp-1.8.1-bin.zip 文件
链接: https://pan.baidu.com/s/1eyDePQf5K017R0ft2eUCKg 提取码: nkhn

源码:

using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace WinTest
{
public static class RSAUtil
{
public static string PublicKey = “”;
public static string PrivateKey = “”;
public static void deom()
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string PrivateKey = RSAUtil.PrivateKey = rsa.ToXmlString(true);
string PublicKey = RSAUtil.PublicKey = rsa.ToXmlString(false);
}
///
/// RSA 加密(分段)
///
///
///
///
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 / 8) - 11;//单块最大长度
            var buffer = new byte[bufferSize];
            using (MemoryStream inputStream = new MemoryStream(inputBytes),
            outputStream = new MemoryStream())
            {
                while (true)
                { //分段加密
                    int readSize = inputStream.Read(buffer, 0, bufferSize);
                    if (readSize <= 0)
                    {
                        break;
                    }

                    var temp = new byte[readSize];
                    Array.Copy(buffer, 0, temp, 0, readSize);
                    var encryptedBytes = rsaProvider.Encrypt(temp, false);
                    outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);
                }
                return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输
            }
        }
    }

    /// <summary>
    ///  RSA 解密(分段)
    /// </summary>
    /// <param name="encryptedInput"></param>
    /// <param name="privateKey"></param>
    /// <returns></returns>
    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 / 8;
            var buffer = new byte[bufferSize];
            using (MemoryStream inputStream = new MemoryStream(inputBytes),
            outputStream = new MemoryStream())
            {
                while (true)
                {
                    int readSize = inputStream.Read(buffer, 0, bufferSize);
                    if (readSize <= 0)
                    {
                        break;
                    }

                    var temp = new byte[readSize];
                    Array.Copy(buffer, 0, temp, 0, readSize);
                    var rawBytes = rsaProvider.Decrypt(temp, false);
                    outputStream.Write(rawBytes, 0, rawBytes.Length);
                }
                return Encoding.UTF8.GetString(outputStream.ToArray());
            }
        }
    }
    /// <summary>    
    /// RSA私钥格式转换,.net->java   (提供转义后的秘钥社保解密) 
    /// </summary>    
    /// <param name="privateKey">.net生成的私钥</param>    
    /// <returns></returns>   
    public static string RSAPrivateKeyDotNet2Java(this string privateKey)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(privateKey);
        BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
        BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
        BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
        BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
        BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
        BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
        BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
        BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
        RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
        PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
        byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
        return Convert.ToBase64String(serializedPrivateBytes);
    }
    /// <summary>    
    /// RSA公钥格式转换,.net->java     (提供转义后的秘钥社保加密) 
    /// </summary>    
    /// <param name="publicKey">.net生成的公钥</param>    
    /// <returns></returns>   
    public static string RSAPublicKeyDotNet2Java(this string publicKey)
    {
        XmlDocument doc = new XmlDocument(); doc.LoadXml(publicKey);
        BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
        BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
        RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
        SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
        byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
        return Convert.ToBase64String(serializedPublicBytes);
    }
    /// <summary>    
    /// RSA私钥格式转换,  //java->.net  (社保提供秘钥,.NET先转换再使用解密)  
    /// </summary>    
    /// <param name="privateKey">java生成的RSA私钥</param>    
    /// <returns></returns>   
    public static string RSAPrivateKeyJava2DotNet(this string privateKey)
    {
        RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
        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()));
    }
    /// <summary>    
    /// RSA公钥格式转换,java->.net  (社保提供秘钥,.NET先转换再使用加密)  
    /// </summary>    
    /// <param name="publicKey">java生成的公钥</param>    
    /// <returns></returns>    
    public static string RSAPublicKeyJava2DotNet(this string publicKey)
    {
        RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
        return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
            Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
            Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
    }

    /// <summary>
    /// 社保返回的加密数据先处理特殊字符,再解密
    /// </summary>
    /// <param name="content"></param>
    /// <param name="bReset"></param>
    /// <returns></returns>
    public static string ReplaceSpecialCharacter(string content, bool bReset)
    {
        if (bReset)
        {
            content = content.Replace("_", "/").Replace("-", "+");
           
            switch (content.Length % 4)
            {
                case 2:
                    content += "==";
                    break;
                case 3:
                    content += "=";
                    break;
                default:
                    break;
            }
            string dummyData = content.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
            if (dummyData.Length % 4 > 0)
            {
                dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
            }
            return dummyData;
        }
        else
        {
            return content.Replace("/", "_").Replace("+", "-");
        }
    }

}

}

测试源码:

 //生成.NET 公钥和私钥
        RSAUtil.deom();

        //.NET 公钥
        string PublicKey = @"<RSAKeyValue><Modulus>nwbjN1znmyL2KyOIrRy/PbWZpTi+oekJIoGNc6jHCl0JNZLFHNs70fyf7y44BH8L8MBkSm5sSwCZfLm5nAsDNOmuEV5Uab5DuWYSE4R2Z3NkKexJJ4bnmXEZYXPMzTbXIpyvU2y9YVrz1BjjRPeHsb6daVdrBgjs4+2b/ok9myM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        //.NET 私钥
        string PrivateKey = @"<RSAKeyValue><Modulus>nwbjN1znmyL2KyOIrRy/PbWZpTi+oekJIoGNc6jHCl0JNZLFHNs70fyf7y44BH8L8MBkSm5sSwCZfLm5nAsDNOmuEV5Uab5DuWYSE4R2Z3NkKexJJ4bnmXEZYXPMzTbXIpyvU2y9YVrz1BjjRPeHsb6daVdrBgjs4+2b/ok9myM=</Modulus><Exponent>AQAB</Exponent><P>2PfagXD2zKzUGLkAXpC+04u0xvESpO1PbTUOGA2m8auviEMNz8VempJ/reOlJjEO2q2nrUsbtqKd0m96Cxz0Fw==</P><Q>u6Kiit1XhIgRD9jQnQh36y28LOmku2Gqn9KownMSVGhWzkkHQPw77A2h1OirQiKe6aOIO/yxdwTI/9Ds4Kwc1Q==</Q><DP>GfwtPj1yQXcde8yEX88EG7/qqbzrl7cYQSMOihDwgpcmUbJ+L/kaaHbNNd1CxT0w4z3TDC0np4r4TeCuBDC2hw==</DP><DQ>hl8I0jOC2klrFpMpilunLUeaa/uCWiKuQzhkXKR1qvbxu1b3F+XKr9hvXX6mLn2GmkDfbj4fhOFrZC/lg1weZQ==</DQ><InverseQ>P1y+6el2+1LsdwL14hYCILvsTKGokGSKD35N7HakLmHNjXiU05hN1cnXMsGIZGg+pNHmz/yuPmgNLJoNZCQiCg==</InverseQ><D>D27DriO99jg2W4lfQi2AAaUV/Aq9tUjAMjEQYSEH7+GHe0N7DYnZDE/P1Y5OsWEC76I8GV0N9Vlhi9EaSiJndRvUgphTL2YuAjrVr59Il+lwh/LUBN46AX3cmQm3cFf1F1FXKj4S+QCx/qrCH4mmKpynuQsPL/1XiQSWpugI30E=</D></RSAKeyValue>";
        //JAVA 社保使用公钥
        string javaPublicKey = RSAUtil.RSAPublicKeyDotNet2Java(RSAUtil.PublicKey/*PublicKey*/);
        //JAVA 社保使用私钥
        string javaPrivateKey = RSAUtil.RSAPrivateKeyDotNet2Java(RSAUtil.PrivateKey/*PrivateKey*/);

        //加密字符串参数
        string str = "<?xml version=\"1.0\" encoding=\"UTF - 8\" standalone=\"no\"?><HNISI><Head><Version>1.0</Version></Head><Info><Output><HashParams><HashParam Name=\"YYBH\" Value=\"113001\"/><HashParam Name=\"XM\" Value=\"张三\"/><HashParam Name=\"DJH\" Value=\"ME0008\"/><HashParam Name=\"DJLB\" Value=\"1\"/></HashParams><DataPackage/></Output></Info></HNISI>";

        //(数据参数)分段加密
        string strMessPublic = RSAUtil.RsaEncrypt(str, RSAUtil.PublicKey);

        //C# 使用公钥(社保提供公钥先转换再使用)
        string WinFormPublicKey = RSAUtil.RSAPublicKeyJava2DotNet(javaPublicKey);

        //(数据参数)分段解密
        string strMessPrivate = RSAUtil.RsaDecrypt(strMessPublic, RSAUtil.PrivateKey);

效果:
输入字符串,加密
在这里插入图片描述
解密后:
在这里插入图片描述

调试结果:
字符串参数:
string str = “<?xml version=\"1.0\" encoding=\"UTF - 8\" standalone=\"no\"?>1.0<HashParam Name=“YYBH” Value=“113001”/><HashParam Name=“XM” Value=“张三”/><HashParam Name=“DJH” Value=“ME0008”/><HashParam Name=“DJLB” Value=“1”/>”;
C#
PublicKey:
nzGdMOWU7tSc9WdR7JzKdMjKVqyNbNSg6tHld3c6u33p08g7wVYv388l+WHTOQ64bdT4//nJRZbSRj00JMb8Ej3OHqPMjIbt7vlJoaXnvvTrwMvZBl8DnNI12Vaq/mGKuyxh9p6emAoDjPpZcWJ70YodVNOzYzB9/bkIc81NAs0=AQAB
PrivateKey:
nzGdMOWU7tSc9WdR7JzKdMjKVqyNbNSg6tHld3c6u33p08g7wVYv388l+WHTOQ64bdT4//nJRZbSRj00JMb8Ej3OHqPMjIbt7vlJoaXnvvTrwMvZBl8DnNI12Vaq/mGKuyxh9p6emAoDjPpZcWJ70YodVNOzYzB9/bkIc81NAs0=AQAB

1NSHFWrlP49np9g/74gUjTItV4b3w9RvX27lyBrmy1P+lrLVa44RRa+rBr/36pRpfDkYgyKlwmkoAZrfBYi89w==

v3vzU1Swa4zWy9BC9EEf62L12f/3NB2+DtSvYPFdCE55k9pyKuLzA0PSPRfxbYPw6UaDWUDob19WxtyJTdohWw==yATUz3Qe75U+vaemrt8dMXWu10upHwpPgUkf+ugNb5oI8mgv210xLmTiPv27aWMBoBWoy9WMIyHgz2FVqEXSEQ==nPygFzedk+9Zwqsx2VLzOmZdraa/IwknYr1YM6BuZ3r/DgrQAv0hwxF9cf0JQIIlpvragPhIF9cQK+Vu5FbrdQ==R7gICwFORMdmzXAb90n3LCulT5Bqo1UnZ7temRx+vRwvi3PPQcliPEUfSsBnB+D8IrSCXRfK3iv+lEDKqmOnKw==EahEpF2f+9pRqzdHEyS+9gjRcfSuCRy6g+E9KleWCEwqiTw5QzQRQlStLxs70k/WLWSFK+CjrlgmFvax7Rm0cBAEqMMzUxbwYWZ+XQrbWAamQCaTpWyKtrK8y/V4GNQlp3exWgALt3WfbPFpg6fh/sntGUzhKiGzCuiZsKQDUFc=

入参:
JAVA
公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfMZ0w5ZTu1Jz1Z1HsnMp0yMpWrI1s1KDq0eV3dzq7fenTyDvBVi/fzyX5YdM5Drht1Pj/+clFltJGPTQkxvwSPc4eo8yMhu3u+Umhpee+9OvAy9kGXwOc0jXZVqr+YYq7LGH2np6YCgOM+llxYnvRih1U07NjMH39uQhzzU0CzQIDAQAB

私钥:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ8xnTDllO7UnPVnUeycynTIylasjWzUoOrR5Xd3Ort96dPIO8FWL9/PJflh0zkOuG3U+P/5yUWW0kY9NCTG/BI9zh6jzIyG7e75SaGl577068DL2QZfA5zSNdlWqv5hirssYfaenpgKA4z6WXFie9GKHVTTs2Mwff25CHPNTQLNAgMBAAECgYARqESkXZ/72lGrN0cTJL72CNFx9K4JHLqD4T0qV5YITCqJPDlDNBFCVK0vGzvST9YtZIUr4KOuWCYW9rHtGbRwEASowzNTFvBhZn5dCttYBqZAJpOlbIq2srzL9XgY1CWnd7FaAAu3dZ9s8WmDp+H+ye0ZTOEqIbMK6JmwpANQVwJBANTUhxVq5T+PZ6fYP++IFI0yLVeG98PUb19u5cga5stT/pay1WuOEUWvqwa/9+qUaXw5GIMipcJpKAGa3wWIvPcCQQC/e/NTVLBrjNbL0EL0QR/rYvXZ//c0Hb4O1K9g8V0ITnmT2nIq4vMDQ9I9F/Ftg/DpRoNZQOhvX1bG3IlN2iFbAkEAyATUz3Qe75U+vaemrt8dMXWu10upHwpPgUkf+ugNb5oI8mgv210xLmTiPv27aWMBoBWoy9WMIyHgz2FVqEXSEQJBAJz8oBc3nZPvWcKrMdlS8zpmXa2mvyMJJ2K9WDOgbmd6/w4K0AL9IcMRfXH9CUCCJab62oD4SBfXECvlbuRW63UCQEe4CAsBTkTHZs1wG/dJ9ywrpU+QaqNVJ2e7Xpkcfr0cL4tzz0HJYjxFH0rAZwfg/CK0gl0Xyt4r/pRAyqpjpys=

加密的数据串:
RDNK8EBpoe58GD5Wfqev0iZu6MBENQQEOaE4vF7kbvyae8+Qh96NrVMcepe8uY1lvFUgc4X0jTSYuQlFPLuFKaBpqoeLRXILgs0uxnWZHmQoR/f+ibROPZnjU/pAiagxax+lO22S0zn8QqsdLy2n/ge5u23LWx8KEMnReNOTll8DneYGrkehGXeCRxXkeLiuG/CmwIX6o5HWUYR9vAZixhiCTQpTs+FZDb+SRfNEDbyhn7hOitQwLTTURfpFUr39W8Y1QwPlgYlcwVOtcifUANyooq7k08zDFLNQQ6zxEM0a2wpNJQpWt6GzX01Cll5+PpxDcz28K0xKbMPwYT2NIJK6Xy2JLikbgODSiURaVxct8vafySL4r46VpDRoEOfW0jNxOvhsdH5hd5FJrWWkcBAZYhnAp46SBTGVqcxvxFAuZAy66qApJ130NU79wwMaa5iqNfR19Lw7KJfEJCevogzE+vGvtb57xEB3ep811wT1a/+YnQ2D6m0vBxi06CAVCUQ08XHY/5aCrUC1hBRTZakqCCuthtDtqj4sylowxz69G5wobYziit+1cp/TLWH+1gWWsjFykYVus5jSbusP5I/LV3vplxqXuxPXc0oX5kqXJSfIUcmvhxT1Y3aqtibE+XC1N63uHzCpZp2/ZJgeNvCUuvFtAEjOjX650J90D/c=

社保解密成功!

-------------------------------------------社保解密成功返回加密数据【医院解密】----------------------------------------

公钥加密(社保返回数据):
Wliq5c9jbYnjQStbXqVstgdOfV1UIJhol89CmHs710AiCxNnolEARu_z7VxLGy1oVMEmfPh2TIUh69N2EthePNlpSeihjfCzHNUqYQigIedj8HKJ7AxCMKEWgSi41_yirFV7UnDSiBTbSmcxfkIczCipgXK5JxJmyYB-ZkD6pi9ROzkEEYPgBvERyoBZYwBaXKdaGrWIZF6NjgLli0V5rpNBN0ZxhygsCfKM4N3lIL9klokFcb8ImJyJ3XlWUjrXSMP5h1EDuQQgFVNJaweeQYPnXP7x2kEZ0DZ3u7C82oRl046PzACL-VkIsxaepmsLxpDEoVv3jFCrGe4ZbpJmv1fsNupELa0A7f5LjP4olwwqXVxxUsbPVECufcrPVWazjGhVpoDOVCT5eeS80YDQwQkpQ0fZeWhSB-MlIDHVxX0aRkjtRaKUtzusbwz_XmDHjmfcphCV6M7i2y65E_zpbixJ9kvjTiRrCKH6lmUAaCzI4GOCJL5yXS07Glu0bRWkhxQOdTtX_erSFYLNmqMrwpm_H-XSU6VOwexCVJoztIDHovZhFM6vmEGNB4sMNSFq_WiRVa0fXiqWYRDD6PijX_eXH-c5G7uIhWN1npXhqc6ad2OEdX134procjBJyLUv5VT5uDNN3EeX-AEvjSjiTwrgo9ZyslrRidTfLF-XNL8

社保返回的加密数据先处理特殊字符(再解密):
在这里插入图片描述
content = content.Replace("_", “/”).Replace("-", “+”);
switch (content.Length % 4)
{
case 2:
content += “==”;
break;
case 3:
content += “=”;
break;
default:
break;
}
string dummyData = content.Trim().Replace("%", “”).Replace(",", “”).Replace(" ", “+”);
if (dummyData.Length % 4 > 0)
{
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, ‘=’);
}
return dummyData;

注意:不处理特殊字符直接解密报错如下
1、
在这里插入图片描述
2、Base-64 字符数组或字符串的长度无效。

测试例子://测试回传解密

        string PublicKeycs = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfMZ0w5ZTu1Jz1Z1HsnMp0yMpWrI1s1KDq0eV3dzq7fenTyDvBVi/fzyX5YdM5Drht1Pj/+clFltJGPTQkxvwSPc4eo8yMhu3u+Umhpee+9OvAy9kGXwOc0jXZVqr+YYq7LGH2np6YCgOM+llxYnvRih1U07NjMH39uQhzzU0CzQIDAQAB";
        string PrivateKeycs = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ8xnTDllO7UnPVnUeycynTIylasjWzUoOrR5Xd3Ort96dPIO8FWL9/PJflh0zkOuG3U+P/5yUWW0kY9NCTG/BI9zh6jzIyG7e75SaGl577068DL2QZfA5zSNdlWqv5hirssYfaenpgKA4z6WXFie9GKHVTTs2Mwff25CHPNTQLNAgMBAAECgYARqESkXZ/72lGrN0cTJL72CNFx9K4JHLqD4T0qV5YITCqJPDlDNBFCVK0vGzvST9YtZIUr4KOuWCYW9rHtGbRwEASowzNTFvBhZn5dCttYBqZAJpOlbIq2srzL9XgY1CWnd7FaAAu3dZ9s8WmDp+H+ye0ZTOEqIbMK6JmwpANQVwJBANTUhxVq5T+PZ6fYP++IFI0yLVeG98PUb19u5cga5stT/pay1WuOEUWvqwa/9+qUaXw5GIMipcJpKAGa3wWIvPcCQQC/e/NTVLBrjNbL0EL0QR/rYvXZ//c0Hb4O1K9g8V0ITnmT2nIq4vMDQ9I9F/Ftg/DpRoNZQOhvX1bG3IlN2iFbAkEAyATUz3Qe75U+vaemrt8dMXWu10upHwpPgUkf+ugNb5oI8mgv210xLmTiPv27aWMBoBWoy9WMIyHgz2FVqEXSEQJBAJz8oBc3nZPvWcKrMdlS8zpmXa2mvyMJJ2K9WDOgbmd6/w4K0AL9IcMRfXH9CUCCJab62oD4SBfXECvlbuRW63UCQEe4CAsBTkTHZs1wG/dJ9ywrpU+QaqNVJ2e7Xpkcfr0cL4tzz0HJYjxFH0rAZwfg/CK0gl0Xyt4r/pRAyqpjpys=";

string strcs=“Wliq5c9jbYnjQStbXqVstgdOfV1UIJhol89CmHs710AiCxNnolEARu_z7VxLGy1oVMEmfPh2TIUh69N2EthePNlpSeihjfCzHNUqYQigIedj8HKJ7AxCMKEWgSi41_yirFV7UnDSiBTbSmcxfkIczCipgXK5JxJmyYB-ZkD6pi9ROzkEEYPgBvERyoBZYwBaXKdaGrWIZF6NjgLli0V5rpNBN0ZxhygsCfKM4N3lIL9klokFcb8ImJyJ3XlWUjrXSMP5h1EDuQQgFVNJaweeQYPnXP7x2kEZ0DZ3u7C82oRl046PzACL-VkIsxaepmsLxpDEoVv3jFCrGe4ZbpJmv1fsNupELa0A7f5LjP4olwwqXVxxUsbPVECufcrPVWazjGhVpoDOVCT5eeS80YDQwQkpQ0fZeWhSB-MlIDHVxX0aRkjtRaKUtzusbwz_XmDHjmfcphCV6M7i2y65E_zpbixJ9kvjTiRrCKH6lmUAaCzI4GOCJL5yXS07Glu0bRWkhxQOdTtX_erSFYLNmqMrwpm_H-XSU6VOwexCVJoztIDHovZhFM6vmEGNB4sMNSFq_WiRVa0fXiqWYRDD6PijX_eXH-c5G7uIhWN1npXhqc6ad2OEdX134procjBJyLUv5VT5uDNN3EeX-AEvjSjiTwrgo9ZyslrRidTfLF-XNL8”;

         //C# 使用公钥(社保提供公钥先转换再使用)
        string WinFormPublicKeycs = RSAUtil.RSAPublicKeyJava2DotNet(PublicKeycs);
        //C# 使用私钥(社保提供私钥先转换再使用)
        string WinFormPrivateKeycs = RSAUtil.RSAPrivateKeyJava2DotNet(PrivateKeycs);
        //特殊字符处理
         string strContent = RSAUtil.ReplaceSpecialCharacter(strcs, true);
        //特殊字符处理后解密(的到结果值)
        string strMessPrivatecs = RSAUtil.RsaDecrypt(strContent, WinFormPrivateKeycs);

调试结果:
在这里插入图片描述

java 公钥
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfMZ0w5ZTu1Jz1Z1HsnMp0yMpWrI1s1KDq0eV3dzq7fenTyDvBVi/fzyX5YdM5Drht1Pj/+clFltJGPTQkxvwSPc4eo8yMhu3u+Umhpee+9OvAy9kGXwOc0jXZVqr+YYq7LGH2np6YCgOM+llxYnvRih1U07NjMH39uQhzzU0CzQIDAQAB
java 私钥
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ8xnTDllO7UnPVnUeycynTIylasjWzUoOrR5Xd3Ort96dPIO8FWL9/PJflh0zkOuG3U+P/5yUWW0kY9NCTG/BI9zh6jzIyG7e75SaGl577068DL2QZfA5zSNdlWqv5hirssYfaenpgKA4z6WXFie9GKHVTTs2Mwff25CHPNTQLNAgMBAAECgYARqESkXZ/72lGrN0cTJL72CNFx9K4JHLqD4T0qV5YITCqJPDlDNBFCVK0vGzvST9YtZIUr4KOuWCYW9rHtGbRwEASowzNTFvBhZn5dCttYBqZAJpOlbIq2srzL9XgY1CWnd7FaAAu3dZ9s8WmDp+H+ye0ZTOEqIbMK6JmwpANQVwJBANTUhxVq5T+PZ6fYP++IFI0yLVeG98PUb19u5cga5stT/pay1WuOEUWvqwa/9+qUaXw5GIMipcJpKAGa3wWIvPcCQQC/e/NTVLBrjNbL0EL0QR/rYvXZ//c0Hb4O1K9g8V0ITnmT2nIq4vMDQ9I9F/Ftg/DpRoNZQOhvX1bG3IlN2iFbAkEAyATUz3Qe75U+vaemrt8dMXWu10upHwpPgUkf+ugNb5oI8mgv210xLmTiPv27aWMBoBWoy9WMIyHgz2FVqEXSEQJBAJz8oBc3nZPvWcKrMdlS8zpmXa2mvyMJJ2K9WDOgbmd6/w4K0AL9IcMRfXH9CUCCJab62oD4SBfXECvlbuRW63UCQEe4CAsBTkTHZs1wG/dJ9ywrpU+QaqNVJ2e7Xpkcfr0cL4tzz0HJYjxFH0rAZwfg/CK0gl0Xyt4r/pRAyqpjpys=

//C# 公钥
nzGdMOWU7tSc9WdR7JzKdMjKVqyNbNSg6tHld3c6u33p08g7wVYv388l+WHTOQ64bdT4//nJRZbSRj00JMb8Ej3OHqPMjIbt7vlJoaXnvvTrwMvZBl8DnNI12Vaq/mGKuyxh9p6emAoDjPpZcWJ70YodVNOzYzB9/bkIc81NAs0=AQAB

//C# 私钥
nzGdMOWU7tSc9WdR7JzKdMjKVqyNbNSg6tHld3c6u33p08g7wVYv388l+WHTOQ64bdT4//nJRZbSRj00JMb8Ej3OHqPMjIbt7vlJoaXnvvTrwMvZBl8DnNI12Vaq/mGKuyxh9p6emAoDjPpZcWJ70YodVNOzYzB9/bkIc81NAs0=AQAB

1NSHFWrlP49np9g/74gUjTItV4b3w9RvX27lyBrmy1P+lrLVa44RRa+rBr/36pRpfDkYgyKlwmkoAZrfBYi89w==

v3vzU1Swa4zWy9BC9EEf62L12f/3NB2+DtSvYPFdCE55k9pyKuLzA0PSPRfxbYPw6UaDWUDob19WxtyJTdohWw==yATUz3Qe75U+vaemrt8dMXWu10upHwpPgUkf+ugNb5oI8mgv210xLmTiPv27aWMBoBWoy9WMIyHgz2FVqEXSEQ==nPygFzedk+9Zwqsx2VLzOmZdraa/IwknYr1YM6BuZ3r/DgrQAv0hwxF9cf0JQIIlpvragPhIF9cQK+Vu5FbrdQ==R7gICwFORMdmzXAb90n3LCulT5Bqo1UnZ7temRx+vRwvi3PPQcliPEUfSsBnB+D8IrSCXRfK3iv+lEDKqmOnKw==EahEpF2f+9pRqzdHEyS+9gjRcfSuCRy6g+E9KleWCEwqiTw5QzQRQlStLxs70k/WLWSFK+CjrlgmFvax7Rm0cBAEqMMzUxbwYWZ+XQrbWAamQCaTpWyKtrK8y/V4GNQlp3exWgALt3WfbPFpg6fh/sntGUzhKiGzCuiZsKQDUFc=

社保回传加密格式
Wliq5c9jbYnjQStbXqVstgdOfV1UIJhol89CmHs710AiCxNnolEARu_z7VxLGy1oVMEmfPh2TIUh69N2EthePNlpSeihjfCzHNUqYQigIedj8HKJ7AxCMKEWgSi41_yirFV7UnDSiBTbSmcxfkIczCipgXK5JxJmyYB-ZkD6pi9ROzkEEYPgBvERyoBZYwBaXKdaGrWIZF6NjgLli0V5rpNBN0ZxhygsCfKM4N3lIL9klokFcb8ImJyJ3XlWUjrXSMP5h1EDuQQgFVNJaweeQYPnXP7x2kEZ0DZ3u7C82oRl046PzACL-VkIsxaepmsLxpDEoVv3jFCrGe4ZbpJmv1fsNupELa0A7f5LjP4olwwqXVxxUsbPVECufcrPVWazjGhVpoDOVCT5eeS80YDQwQkpQ0fZeWhSB-MlIDHVxX0aRkjtRaKUtzusbwz_XmDHjmfcphCV6M7i2y65E_zpbixJ9kvjTiRrCKH6lmUAaCzI4GOCJL5yXS07Glu0bRWkhxQOdTtX_erSFYLNmqMrwpm_H-XSU6VOwexCVJoztIDHovZhFM6vmEGNB4sMNSFq_WiRVa0fXiqWYRDD6PijX_eXH-c5G7uIhWN1npXhqc6ad2OEdX134procjBJyLUv5VT5uDNN3EeX-AEvjSjiTwrgo9ZyslrRidTfLF-XNL8

特殊字符处理后:
Wliq5c9jbYnjQStbXqVstgdOfV1UIJhol89CmHs710AiCxNnolEARu/z7VxLGy1oVMEmfPh2TIUh69N2EthePNlpSeihjfCzHNUqYQigIedj8HKJ7AxCMKEWgSi41/yirFV7UnDSiBTbSmcxfkIczCipgXK5JxJmyYB+ZkD6pi9ROzkEEYPgBvERyoBZYwBaXKdaGrWIZF6NjgLli0V5rpNBN0ZxhygsCfKM4N3lIL9klokFcb8ImJyJ3XlWUjrXSMP5h1EDuQQgFVNJaweeQYPnXP7x2kEZ0DZ3u7C82oRl046PzACL+VkIsxaepmsLxpDEoVv3jFCrGe4ZbpJmv1fsNupELa0A7f5LjP4olwwqXVxxUsbPVECufcrPVWazjGhVpoDOVCT5eeS80YDQwQkpQ0fZeWhSB+MlIDHVxX0aRkjtRaKUtzusbwz/XmDHjmfcphCV6M7i2y65E/zpbixJ9kvjTiRrCKH6lmUAaCzI4GOCJL5yXS07Glu0bRWkhxQOdTtX/erSFYLNmqMrwpm/H+XSU6VOwexCVJoztIDHovZhFM6vmEGNB4sMNSFq/WiRVa0fXiqWYRDD6PijX/eXH+c5G7uIhWN1npXhqc6ad2OEdX134procjBJyLUv5VT5uDNN3EeX+AEvjSjiTwrgo9ZyslrRidTfLF+XNL8=

解密后

<?xml version="1.0" encoding="UTF - 8" standalone="no"?> 1.0

参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA加密算法是一种非对称加密算法,公钥加密,私钥解密。在C#Java中,都内置了RSA加密算法的实现,但是在使用过程中,由于两个语言的实现细节不同,会导致在C#Java之间进行RSA加密的时候出现格式不兼容的问题。 为了解决这个问题,我们可以使用以下方法将C#格式RSA公钥/私钥转换Java格式RSA公钥/私钥: 1. 将C#RSA公钥/私钥转换为XML格式的字符串。 C#中,可以使用以下方法将RSA公钥/私钥转换为XML格式的字符串: ```csharp string publicKeyXml = rsa.ToXmlString(false); // 公钥 string privateKeyXml = rsa.ToXmlString(true); // 私钥 ``` 2. 将XML格式的字符串转换Java中的BigInteger类型。 Java中,可以使用以下方法将XML格式的字符串转换为BigInteger类型: ```java BigInteger modulus = new BigInteger(1, Base64.getDecoder().decode(modulusString)); BigInteger exponent = new BigInteger(1, Base64.getDecoder().decode(exponentString)); ``` 其中,modulusString和exponentString分别是XML格式的字符串中的Modulus和Exponent节点的值,使用Base64解码后转为BigInteger类型。 3. 使用BigInteger类型创建Java中的RSAPublicKey/RSAPrivateKey对象。 Java中,可以使用以下方法创建RSAPublicKey/RSAPrivateKey对象: ```java RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(modulus, exponent); RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(publicKeySpec); RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(modulus, exponent); RSAPrivateKey privateKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec); ``` 其中,modulus和exponent是从XML格式的字符串中解析得到的BigInteger类型的值。 通过以上步骤,我们就可以将C#格式RSA公钥/私钥转换Java格式RSA公钥/私钥了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值