【问题标题】:C# RSA Decryption using Bouncy Castle使用 Bouncy Castle 进行 C# RSA 解密
【发布时间】:2012-04-25 01:48:59
【问题描述】:

我得到了一个 Base64 编码的加密字符串,它是在 Java 中使用 Bouncy Castle 加密的。下面是 Java sn-p 示例:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
byte[] encryptedText = cipher.doFinal("xxxxx|xxxxx".getBytes("UTF-8"));
String encodedText = new BASE64Encoder().encode(encryptedText);

我需要使用 Bouncy Castle 解密生成的字符串,但在 C# 中 我已经获得了关于如何在 Java 中执行此操作的代码 sn-p,但我无法将其转换为 C#(原因是我们正在构建一个 .net 站点,并且将成为 Java 站点中的 iFrame。 Java 站点将把 RSA 加密字符串传递给 .NET 站点)。下面要解密的示例 Java 代码:

Cipher cipherDec = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipherDec.init(Cipher.DECRYPT_MODE, key.getPrivate());
byte[] decodedText = new BASE64Decoder().decodeBuffer(encodedText);
byte[] decryptedText = cipherDec.doFinal(decodedText);
String finalValue = new String(decryptedText, "UTF-8");

我已经从http://www.bouncycastle.org/csharp/ 下载了示例,但似乎没有输入字符串值进行加密的示例,然后通过加密/解密过程。

我得到了 模数公共指数私人指数素数P的值>素数q素数指数p素数指数qcrt系数

我已经看到我可以使用以下内容:

IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine());
signer.Init(true, pubParameters);

signer 对象似乎没有与上面的 Java 示例相同的方法。

我唯一能用的方法是

ProcessBlock(byte[] inbuf, int inOff, int inLen);

但我看不出如何在我的上下文中使用它。

我们将不胜感激。

【问题讨论】:

    标签: c# java cryptography rsa bouncycastle


    【解决方案1】:

    为了帮助别人,最终转换的代码如下:

    RsaKeyParameters privParameters = new RsaPrivateCrtKeyParameters(mod, pubExp, privExp, p, q, pExp, qExp, crtCoef);
    RsaKeyParameters pubParameters = new RsaKeyParameters(false, mod, pubExp);
    IAsymmetricBlockCipher eng = new Pkcs1Encoding(new RsaEngine());
    eng.Init(false, privParameters);
    byte[] encdata = System.Convert.FromBase64String("{the enc string}");
    encdata = eng.ProcessBlock(encdata, 0, encdata.Length);
    string result = Encoding.UTF8.GetString(encdata);
    

    mod、pubExp 等都是 BigInteger 值:

    static BigInteger mod = new BigInteger("big int value");
    

    以下using 指令是必需的:

    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Crypto.Engines;
    using Org.BouncyCastle.Crypto.Encodings;
    using Org.BouncyCastle.Math;
    

    这可以从 bouncycastle 网站获得。 http://www.bouncycastle.org/csharp/

    【讨论】:

      【解决方案2】:

      您是否尝试过将 base 64 字符串转换为字节数组,然后使用进程块方法?可能不止这些,但这绝对是我要迈出的第一步。

      以下是如何执行此操作的示例:http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

      【讨论】:

      • 感谢 Spencer,使用 System.Convert.FromBase64String 有效(我昨晚尝试过,但没有成功,所以我想我做错了什么)。结合使用 Encoding.UTF8.GetString(encda​​ta);得到最终结果。
      【解决方案3】:

      我不确定我是否理解您为什么必须使用 Bouncycastle。下面的小代码 sn-p 展示了仅使用 .NET 类的 RSA 加密/解密示例:

      using System;
      using System.Text;
      using System.Security.Cryptography;
      
      namespace RsaForDotNet
      {
          class Program
          {
              static void Main(string[] args)
              {
                  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
                  var encrypted_msg = rsa.Encrypt(Encoding.UTF8.GetBytes("Secret Data"), false);
                  var encoded_msg = Convert.ToBase64String(encrypted_msg);
                  Console.WriteLine(encoded_msg);
                  var decoded_msg = Convert.FromBase64String(encoded_msg);
                  var decrypted_msg = Encoding.UTF8.GetString(rsa.Decrypt(decoded_msg, false));
                  Console.WriteLine(decrypted_msg);
              }
          }
      }
      

      【讨论】:

      • 谢谢。我当然首先尝试过,但是我提供的 RSA 私钥不兼容。他们给了我 BigInteger 值(这是 bouncycastle 中的一种数据类型)。我尝试进行一些转换(每个 BigInteger 对象都有一个 ToByteArray() 方法),但我似乎无法将其转换为没有随机字符的字符串
      • 问题是关于非对称加密的。您的解决方案是对称的。
      • @Diego:我的解决方案使用非对称加密。
      猜你喜欢
      • 2018-01-13
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2011-08-20
      • 2011-07-12
      • 2012-06-15
      相关资源
      最近更新 更多