使用充气城堡C#RSA解密(C# RSA Decryption using Bouncy Castl

2019-06-23 13:54发布

我一直在考虑一个base64编码加密的字符串,其使用充气城堡在Java中加密。 下面的示例Java代码片段:

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

我需要解密使用充气城堡结果字符串,但在C#我已经给出了关于如何做到这一点在Java代码片断,但我不能转换此为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/但似乎没有要输入一个字符串值,得到加密的例子,然后去虽然加密/解密过程。

我一直在为模数给定的值, 公共指数私人expontent, 素数p, 质数q, 素指数p, 素指数qCRT系数

我已经看到了,我可以使用以下命令:

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

signer对象似乎并不具有相同的方法与上面的Java例子。

只有我可以使用的方法是

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

但我不能看到如何在我的环境中使用此。

这里任何帮助将非常感激。

Answer 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/



Answer 2:

你已经尝试底座64串转换为一个字节数组,然后使用处理块的方法? 可能有比这更给它,但它绝对是我迈出的第一步。

下面是如何做到这一点的例子: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx



Answer 3:

我不知道我理解为什么你必须使用BouncyCastle的。 以下的小的代码段示出了与RSA加密/解密示例仅使用.NET类:

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);
        }
    }
}


文章来源: C# RSA Decryption using Bouncy Castle