C#RSA对接JAVA中RSA方式代码实例

 更新时间:2019年09月01日 16:00:30   作者:盛开的雨季  
在本篇文章中小编给各位整理的是关于C#RSA对接JAVA中RSA方式代码实例,有需要的朋友们可以参考一下。

C#中通过FromXmlString属性加载的是XML形式,而JAVA中用到的是解析后的PEM格式的字符串,总之读取证书中信息无非是转换方式问题

/// <summary>
    /// c# 使用 java 的公钥进行rsa加密 utf8编码  通过解析公钥加密数据
    /// </summary>
    /// <param name="publickey"></param>
    /// <returns></returns>
    public static string RSAEncrypts(string content)
    {

      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
      byte[] cipherbytes;
      X509Certificate2 x509Certificate2 = new X509Certificate2("D:\\Config\\dsptest.cer");
      //创建并返回当前算法对象的xml字符串表示形式
      string publicKeyString = x509Certificate2.PublicKey.Key.ToXmlString(false);
      rsa.FromXmlString(publicKeyString);
      //rsa.FromXmlString(RSAPublicKeyJava2DotNet(publicKeyString));
      cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
      return Convert.ToBase64String(cipherbytes);  
    }

      /// <summary>
      /// 私钥解密 通过解析私钥来解析数据 X509KeyStorageFlags.Exportable这个属性很关键是获取私钥信息的
      /// </summary>
      /// <param name="privatekey"></param>
      /// <param name="content"></param>
      /// <returns></returns>
     public static string RSADecrypt( string content)
    {
      byte[] rgb = Convert.FromBase64String(content);
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
      byte[] cipherbytes;
      X509Certificate2 x509Certificate2 = new X509Certificate2("D:\\Config\\test.pfx", "cfca1234", X509KeyStorageFlags.Exportable);
      //创建并返回当前算法对象的xml字符串表示形式
      //rsa.FromXmlString(RSAPrivateKeyJava2DotNet(Const.privatekey));

      rsa.FromXmlString(x509Certificate2.PrivateKey.ToXmlString(true));
      cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
      return Encoding.UTF8.GetString(cipherbytes);      
    }
/***************以下是java提供的公私钥转成.net公私钥XML的方式*************************************/
/// <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()));
}

/// <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()));

}

以上实例大家可以测试下,感谢大家对脚本之家的支持。

相关文章

  • 将字符串转换成System.Drawing.Color类型的方法

    将字符串转换成System.Drawing.Color类型的方法

    将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
    2013-04-04
  • 用Newtonsoft将json串转为对象的方法(详解)

    用Newtonsoft将json串转为对象的方法(详解)

    下面小编就为大家带来一篇用Newtonsoft将json串转为对象的方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 基于C#编写获取硬件信息的工具类

    基于C#编写获取硬件信息的工具类

    这篇文章主要为大家详细介绍了如何利用C#编写一个获取硬件信息的简单工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-11-11
  • C#的this关键字的2种用法

    C#的this关键字的2种用法

    这篇文章主要给大家分享的是C#的this关键字的2种用法,在使用C#的过程中,发现this关键是比较少用的,但是在下面这二个场合下是必须要使用的,不使用它是解决不了问题。下面我们就来看看文章的具体内容吧
    2021-10-10
  • C#/Java连接sqlite与使用技巧

    C#/Java连接sqlite与使用技巧

    无意中发现的,C#/Java连接sqlite与使用技巧。看了下,还挺不错的。与大家分享一下。
    2013-04-04
  • C#中泛型举例List<T>与DataTable相互转换

    C#中泛型举例List<T>与DataTable相互转换

    这篇文章介绍了C#中泛型举例List<T>与DataTable相互转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#验证给定字符串是否为数字的方法

    C#验证给定字符串是否为数字的方法

    这篇文章主要介绍了C#验证给定字符串是否为数字的方法,实例分析了C#进行字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C# 8.0中的范围类型(Range Type)示例详解

    C# 8.0中的范围类型(Range Type)示例详解

    这篇文章主要给大家介绍了关于C# 8.0中范围类型(Range Type)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Unity实现简单虚拟摇杆

    Unity实现简单虚拟摇杆

    这篇文章主要为大家详细介绍了Unity实现简单虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C# HttpClient Cookie验证解决方法

    C# HttpClient Cookie验证解决方法

    本文将详细介绍C# HttpClient Cookie验证解决方法,需要了解的朋友可以参考下
    2012-11-11

最新评论