2012-04-12 174 views
8

我得到了一個Base64編碼的加密字符串,它使用Bouncy Castle在Java中加密。例如Java代碼片段如下:使用Bouncy Castle的C#RSA解密

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 Encrypted字符串傳遞給.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); 

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

這裏的任何幫助將不勝感激。

回答

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

國防部,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

您是否嘗試過將基本64字符串轉換爲字節數組,然後使用進程塊方法?這可能比這更多,但它絕對是我要採取的第一步。

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

+0

謝謝Spencer,使用System.Convert.FromBase64String工作(我昨天晚上試了,它沒有工作,所以我想我做錯了什麼)。結合使用Encoding.UTF8.GetString(encda​​ta);得到最終結果。 – mp3duck 2012-04-13 07:18:19

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

謝謝。我當然首先嚐試了這一點,但我提供的RSA私鑰不兼容。 他們給了我BigInteger值(這是bouncycastle中的一種數據類型)。我嘗試了幾次轉換(每個BigInteger對象都有一個ToByteArray()方法),但我似乎無法將此轉換爲字符串而沒有隨機查找字符 – mp3duck 2012-04-13 06:59:35

+0

問題是關於非對稱加密。您的解決方案是對稱的。 – Diego 2017-12-12 02:14:40

+0

@Diego:我的解決方案使用非對稱加密。 – 2017-12-12 12:50:33

相關問題