我获得了一个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");
我已经从http://www.bouncycastle.org/csharp/下载了示例,但似乎没有输入字符串值来加密的示例,然后它通过加密/解密过程。
我获得了模数,公共指数,私人指数,素数P ,素数q ,素数指数p ,素数指数q 和 crt系数。
我已经看到我可以使用以下内容:
IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine());
signer.Init(true, pubParameters);
但是signer
对象似乎与上面的Java示例没有相同的方法。
我只能使用的方法是
ProcessBlock(byte[] inbuf, int inOff, int inLen);
但我无法在上下文中看到如何使用它。
这里的任何帮助都将非常感激。
答案 0 :(得分:13)
为了帮助他人,要转换的最终代码如下:
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/
答案 1 :(得分:2)
您是否尝试将base 64字符串转换为字节数组,然后使用进程块方法?可能还有更多,但这绝对是我要采取的第一步。
以下是如何执行此操作的示例:http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx
答案 2 :(得分:1)
我不确定为什么你必须使用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);
}
}
}