2012-04-12 27 views
8

Tôi đã được cung cấp một chuỗi mã hóa được mã hóa Base64, được mã hóa bằng Java sử dụng Lâu đài Bouncy. đoạn mã ví dụ Java dưới đây:Giải mã C# RSA sử dụng Lâu đài Bouncy

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

tôi cần phải giải mã chuỗi kết quả sử dụng Bouncy Castle, nhưng trong C# Tôi đã nhận được một đoạn mã trên như thế nào để làm điều này trong Java, nhưng tôi không thể chuyển đổi này cho C# (lý do là chúng tôi đang xây dựng một trang web .net, và sẽ là một iFrame trong một trang Java. Trang web Java sẽ chuyển qua chuỗi RSA được mã hóa tới trang .NET). Ví dụ mã Java để giải mã bên dưới:

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

Tôi đã tải các ví dụ từ http://www.bouncycastle.org/csharp/ nhưng có vẻ không phải là một ví dụ về nhập một giá trị chuỗi để có được mã hóa, và sau đó nó sẽ mặc dù mã hóa/giải mã quá trình .

Tôi đã được cấp giá trị cho mô đun, công mũ, expontent tin, Thủ P, thủ q, Thủ mũ p, Thủ mũ qcrt hệ số .

Tôi đã thấy rằng tôi có thể sử dụng như sau:

IAsymmetricBlockCipher signer = new Pkcs1Encoding(new RsaEngine()); 
signer.Init(true, pubParameters); 

Nhưng đối tượng signer dường như không có phương pháp tương tự như các ví dụ Java trên.

Chỉ phương pháp tôi có thể sử dụng là

ProcessBlock(byte[] inbuf, int inOff, int inLen); 

Nhưng tôi không thể nhìn thấy làm thế nào để sử dụng này trong bối cảnh của tôi.

Mọi trợ giúp ở đây sẽ được đánh giá cao nhất.

Trả lời

13

Để giúp những người khác, mã cuối cùng để chuyển đổi như sau:

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 vv vv là tất cả các giá trị BigInteger:

static BigInteger mod = new BigInteger("big int value"); 

Các using chỉ thị sau đây là cần thiết:

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

Có thể lấy từ trang bouncycastle.http://www.bouncycastle.org/csharp/

2

Bạn đã thử chuyển đổi chuỗi cơ sở 64 thành mảng byte và sau đó sử dụng phương pháp chặn quy trình? Có thể có nhiều hơn thế nhưng nó chắc chắn là bước đầu tiên tôi sẽ làm.

Dưới đây là một ví dụ về làm thế nào để làm điều này: http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

+0

Cảm ơn Spencer, sử dụng System.Convert.FromBase64String đã hoạt động (Tôi đã thử đêm qua và không hoạt động, vì vậy tôi đoán mình đã làm điều gì đó sai). Điều đó kết hợp với việc sử dụng Encoding.UTF8.GetString (encdata); để có được kết quả cuối cùng. – mp3duck

1

Tôi không chắc tôi hiểu tại sao bạn phải sử dụng BouncyCastle. Các chương trình đoạn mã nhỏ sau đây và RSA mã hóa/giải mã ví dụ sử dụng lớp chỉ 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

Cảm ơn. Tất nhiên tôi đã thử lần đầu tiên, nhưng khóa Riêng tư RSA tôi đã cung cấp không tương thích. Họ đã cho tôi Giá trị BigInteger (đây là một kiểu dữ liệu trong bouncycastle). Tôi đã cố gắng làm một vài chuyển đổi (có một phương thức ToByteArray() tắt từng đối tượng BigInteger), nhưng tôi dường như không thể chuyển đổi thành chuỗi ký tự mà không tìm kiếm các ký tự ngẫu nhiên – mp3duck

+0

Câu hỏi đặt ra là mã hóa không đối xứng. Giải pháp của bạn là đối xứng. – Diego

+0

@Diego: Giải pháp của tôi sử dụng mã hóa bất đối xứng. –