灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:12657回复:1

.Net中RSA私钥加密及其与Java的兼容问题

楼主#
更多 发布于:2012-10-30 10:33

在.Net中,RSA加密的一般用法如下:

[csharp] view plaincopy

byte[] RSAEncrypt(String key_xml, byte[] data)

{

     RSACryptoServiceProvider rcp = new RSACryptoServiceProvider();

      rcp.FromXmlString(key_xml);

      return rcp2.Encrypt(data, false); // false 表示PKCS#1 v1.5 Padding

}

    上述方法的参数中,key_xml是XML格式的RSA密钥,data是需要加密的数据。但是上述代码实际上只是实现了使用公钥加密。即使所提供的参数key_xml是一个私钥,由于RSA的私钥中是包含公钥的,因此在调用RSACryptoServiceProvider.Encrypt()时也只会使用公钥来进行加密。换言之,在.Net所提供的API中,不包含使用私钥进行加密的功能。

   对于RSA来说,其公钥和私钥在一定程度来说其实是等价的,使用公钥加密可以使用私钥解密,使用私钥加密则可以使用公钥解密。虽然大部分的RSA应用模式是使用公钥加密私钥解密,但是在某些特殊的场景中,需要使用私钥加密公钥解密(笔者就遇到了这种需求)。在遇到这种需求时,.Net所提供的RSA实现就无法满足需求,需要自己实现RSA加密算法。

   好在RSA的加密算法其实比较简单,就是大整数的幂运算和模运算,使用BigInteger类可以比较简单的实现。当然在某些版本的.Net Framework中不包含BigInteger类的实现,这就需要自己实现这个类,这就相对比较复杂了。不过幸好网上比较容易找到该类的开源实现。

   下面的实例代码使用BigInteger类实现同时支持RSA公钥和私钥加密的算法,符合PKCS#1(RFC2313)的定义,并与java的实现兼容。

byte[] RSAEncrypt(String key_xml, byte[] data)

 

{

 

    RSACryptoServiceProvider rcp = new RSACryptoServiceProvider();  

 

    rcp.FromXmlString(key_xml);

 

    RSAParameters pm = mRcp.ExportParameters(!mRcp.PublicOnly);

 

    BigInteger mod = new BigInteger(pm.Modulus);

    BigInteger ep = new BigInteger(pm.D != null ? pm.D : pm.Exponent);

 

    int k_len = pm.Modulus.Length;

    int pad_len = k_len - data.Length - 3;

 

    byte[] em = new byte[k_len];

    Stream stream = new MemoryStream(em);

    stream.WriteByte(0x00);

    stream.WriteByte(0x01); // 为了与Java兼容,BlockType设为1

    for (int i = 0; i < pad_len; i++) stream.WriteByte(0xff);  // 为了与Java兼容,填充字节设为0xff

 

    stream.WriteByte(0x00);

    stream.Write(data, 0, data.Length);

 

    BigInteger m = new BigInteger(em);

    BigInteger c = m.modPow(ep, mod);

 

    return c.getBytes();

 

}


喜欢0 评分0
浅若清风
禁止发言
禁止发言
  • 注册日期2016-04-24
  • 发帖数17
  • QQ4199679972
  • 火币20枚
  • 粉丝0
  • 关注0
沙发#
发布于:2016-05-18 18:43
用户被禁言,该主题自动屏蔽!

回复(0) 喜欢(0)     评分
游客

返回顶部