2012-04-12 3 views
8

Мне была предоставлена ​​закодированная зашифрованная строка Base64, которая была зашифрована на Java с помощью Bouncy Castle. Пример Java фрагмент кода ниже:C# RSA Расшифровка с использованием Bouncy Castle

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 и собираемся быть iFrame на сайте Java. Сайт 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, премьер д, простой показатель р, главный показатель д коэффициент и элт ,

Я видел, что я могу использовать следующее:

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

Спасибо Спенсер, используя System.Convert.FromBase64String (я пробовал прошлой ночью, и это не сработало, поэтому я думаю, что я делал что-то не так). Это в сочетании с использованием Encoding.UTF8.GetString (encdata); чтобы получить окончательный результат. – mp3duck

1

Я не уверен, я понимаю, почему вы должны использовать 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); 
     } 
    } 
} 
+1

Спасибо. Я, конечно, пробовал это первым, но предоставленные мной RSA-ключи были несовместимы. Они дали мне значения BigInteger (это тип данных внутри bouncycastle). Я попытался сделать несколько преобразований (есть метод ToByteArray() для каждого объекта BigInteger), но я не могу заставить это преобразовать строку без случайно выглядящих символов – mp3duck

+0

Вопрос об асимметричном шифровании. Ваше решение симметрично. – Diego

+0

@ Diego: Мое решение использует асимметричное шифрование. –

Смежные вопросы