java 使用 Bouncy Castle 的 C# RSA 解密
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10128261/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C# RSA Decryption using Bouncy Castle
提问by mp3duck
I have been given a Base64 Encoded encrypted string, which was encrypted in Java using Bouncy Castle. Example Java snippet below:
我得到了一个 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);
I need to decrypt the resulting string using Bouncy Castle, but in C# I have been given a code snippet on how to do this in Java, but I can't convert this for C# (reasons is we are building a .net site, and is going to be an iFrame within a Java site. The Java site is going to passing in the RSA Encrypted string to the .NET site). Example Java code to decrypt below:
我需要使用 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");
I have downloaded the examples from http://www.bouncycastle.org/csharp/but there doesn't seem to be an example of inputting a string value to get encrypted, and it then going though the encrypt/decrypt process.
我已经从http://www.bouncycastle.org/csharp/下载了示例,但似乎没有输入字符串值进行加密的示例,然后它会通过加密/解密过程。
I have been given values for modulus, public exponent, private expontent, prime P, prime q, prime exponent p, prime exponent qand crt coefficient.
我已经获得了模数、公共指数、私有指数、素数 P、素数 q、素数指数 p、素数指数 q和crt 系数的值。
I have seen that I can use the following:
我已经看到我可以使用以下内容:
IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine());
signer.Init(true, pubParameters);
But the signer
object doesn't seem to have the same methods as the Java examples above.
但是该signer
对象似乎没有与上面的 Java 示例相同的方法。
Only method I can use is
我可以使用的唯一方法是
ProcessBlock(byte[] inbuf, int inOff, int inLen);
But I can't see how to use this in my context.
但我看不出如何在我的上下文中使用它。
Any help here would be most appreciated.
这里的任何帮助将不胜感激。
回答by mp3duck
To Help others, the final code to convert is as follows:
为了帮助别人,最终要转换的代码如下:
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 etc etc are all BigInteger values:
mod、pubExp 等都是 BigInteger 值:
static BigInteger mod = new BigInteger("big int value");
The Following using
directives are required:
using
需要以下指令:
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Math;
Which can be obtained from the bouncycastle site. http://www.bouncycastle.org/csharp/
可以从 bouncycastle 网站获得。http://www.bouncycastle.org/csharp/
回答by Spencer Ruport
Have you tried converting the base 64 string to a byte array and then using the process block method? There may be more to it than that but it's definitely the first step I would take.
您是否尝试过将 base 64 字符串转换为字节数组,然后使用进程块方法?可能还有更多内容,但这绝对是我要采取的第一步。
Here's an example of how to do this: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx
以下是如何执行此操作的示例:http: //msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx
回答by President James K. Polk
I'm not sure I understand why you must use Bouncycastle. The following small code snippet shows and RSA encryption/decryption example using only .NET classes:
我不确定我是否理解为什么您必须使用 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);
}
}
}