zoukankan      html  css  js  c++  java
  • RAS 算法 私钥加密,公钥解密 Java 转 .net;

    对接第三方接口,接口返回来的参数是经过 RAS 分段式 算法 加密后的,采用私钥加密,公钥解密,第三方提供公钥;

    参考资料地址:

    https://www.cnblogs.com/datous/p/RSAKeyConvert.html

    https://www.bbsmax.com/A/RnJW6B4Ozq/

    步骤:

    ①:先将java的公钥转成 .net 的公钥;一般来说 .net 的公钥是xml格式 (这里提供 公钥,私钥转换方法)

     /// <summary>
            /// RSA私钥格式转换,java->.net
            /// </summary>
            /// <param name="privateKey">java生成的RSA私钥</param>
            /// <returns></returns>
            public static string RSAPrivateKeyJava2DotNet(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
            /// </summary>
            /// <param name="publicKey">java生成的公钥</param>
            /// <returns></returns>
            public static string RSAPublicKeyJava2DotNet(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()));
            }
    

      

    ②:根据转换过后的公钥 解密加密的字符串 (因为 .net 和 .net core 不同;t )

    /// <summary>
            /// 用公钥给数据进行RSA解密 
            /// </summary>
            /// <param name="xmlPublicKey"> 公钥(XML格式字符串) </param>
            /// <param name="strDecryptString"> 要解密数据 </param>
            /// <returns> 解密后的数据 </returns>
            public static string PublicKeyDecrypt(string strDecryptString)
            {
                var xmlPublicKey = RSAPublicKeyJava2DotNet(publicKey);
                #region .net 时使用
                //加载公钥
                // RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
                //publicRsa.FromXmlString(xmlPublicKey);
                #endregion
    
                #region .net core 使用 需要 通过 FromXmlString 方法转换类型
                var publicRsa = RSA.Create();
                publicRsa.ImportParameters(FromXmlString(xmlPublicKey));
                #endregion
    
                RSAParameters rp = publicRsa.ExportParameters(false);
                //转换密钥
                AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp);
    
                IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
                //第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
                c.Init(false, pbk);
                byte[] outBytes = null;
                byte[] dataToDecrypt = Convert.FromBase64String(strDecryptString);
                #region 分段解密
                int keySize = publicRsa.KeySize / 8;
                byte[] buffer = new byte[keySize];
    
                using (MemoryStream input = new MemoryStream(dataToDecrypt))
                using (MemoryStream output = new MemoryStream())
                {
                    while (true)
                    {
                        int readLine = input.Read(buffer, 0, keySize);
                        if (readLine <= 0)
                        {
                            break;
                        }
                        byte[] temp = new byte[readLine];
                        Array.Copy(buffer, 0, temp, 0, readLine);
                        byte[] decrypt = c.DoFinal(temp);
                        output.Write(decrypt, 0, decrypt.Length);
                    }
                    outBytes = output.ToArray();
                }
                #endregion
                //byte[] outBytes = c.DoFinal(DataToDecrypt);//解密
    
                string strDec = Encoding.UTF8.GetString(outBytes);
                return strDec;
            }
            public static  RSAParameters FromXmlString(string xmlString)
            {
                RSAParameters parameters = new RSAParameters();
    
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xmlString);
    
                if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
                {
                    foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
                    {
                        switch (node.Name)
                        {
                            case "Modulus": parameters.Modulus = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "Exponent": parameters.Exponent = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "P": parameters.P = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "Q": parameters.Q = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "DP": parameters.DP = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "DQ": parameters.DQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "InverseQ": parameters.InverseQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                            case "D": parameters.D = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
                        }
                    }
                }
                else
                {
                    throw new Exception("Invalid XML RSA key.");
                }
    
                // rsa.ImportParameters(parameters);
                return parameters;
            }
    

     

  • 相关阅读:
    C# 管理IIS7(转)
    KeyDown,KeyPress和KeyUp详解(转)
    C#中事件的声明与使用
    在类中使用SERVER
    什么是强类型,强类型集合
    配置sql server 2000以允许远程访问
    如何使textbox只能输入数字和小数点
    在BUTTON中触发GRIDVIEW的方法
    多个GRIDVIEW同时导入到一个EXCEL文件中
    ajax3.5的BUG
  • 原文地址:https://www.cnblogs.com/weixin18/p/15700871.html
Copyright © 2011-2022 走看看