Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Bouncy Castle进行C#RSA解密_C#_Java_Cryptography_Rsa_Bouncycastle - Fatal编程技术网

使用Bouncy Castle进行C#RSA解密

使用Bouncy Castle进行C#RSA解密,c#,java,cryptography,rsa,bouncycastle,C#,Java,Cryptography,Rsa,Bouncycastle,我得到了一个Base64编码的加密字符串,它是使用Bouncy Castle在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")); Stri

我得到了一个Base64编码的加密字符串,它是使用Bouncy Castle在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);
我需要使用Bouncy Castle解密得到的字符串,但是在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");
我已经从下载了示例,但似乎没有输入字符串值进行加密,然后进行加密/解密过程的示例

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

我发现我可以使用以下方法:

IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine());
signer.Init(true, pubParameters);
但是
signer
对象似乎没有与上面的Java示例相同的方法

我唯一能用的方法是

ProcessBlock(byte[] inbuf, int inOff, int inLen);
但我不知道如何在我的上下文中使用它


非常感谢您的帮助。

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


下面是一个如何执行此操作的示例:

我不太明白为什么必须使用Bouncycastle。以下小代码片段显示了仅使用.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);
        }
    }
}

为了帮助其他人,要转换的最终代码如下所示:

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、xp等都是大整数值:

static BigInteger mod = new BigInteger("big int value");
需要以下
使用
指令:

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

可从bouncycastle网站获取

谢谢。我当然已经尝试过了,但是我提供的RSA私钥不兼容。他们给了我BigInteger值(这是bouncycastle中的一种数据类型)。我尝试了一些转换(每个BigInteger对象都有一个ToByteArray()方法),但我似乎无法将其转换为没有随机字符的字符串问题是关于非对称加密的。您的解决方案是对称的。@Diego:我的解决方案使用非对称加密。谢谢Spencer,使用System.Convert.FromBase64String有效(我昨晚尝试了,但无效,所以我想我做错了什么)。与使用Encoding.UTF8.GetString(encdata)相结合;为了得到最终的结果。