2009-10-26 14 views
6

Używam certyfikatu wygenerowanego przez makecert, który ma zarówno klucz prywatny, jak i publiczny. Strona java używa tego klucza publicznego do szyfrowania danych i .net odszyfrowuje je z powrotem.rsacryptoserviceprovider za pomocą certyfikatów x509 C#

Próbuję odszyfrować kodowany przez Javę szyfrowany ciąg 64-bitowy i uzyskiwać złe dane.

Aby sprawdzić, czy wszystko jest w porządku na końcu sieci, starałem się zaszyfrować klucz publiczny, a następnie odszyfrować prywatne za pomocą tego samego certyfikatu. Mój kod wygląda tak.

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); 
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; 

if (cert.HasPrivateKey) 
    MessageBox.Show("Got private key"); 

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); 
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

Nawet tutaj dostaję błąd. Czy coś mi brakuje?

Certyfikat jest ważny zarówno z kluczem publicznym, jak i prywatnym.

+0

Jaki błąd? i na jakiej linii? –

+0

Wyjątek: Złe dane .. Brak dalszego wewnętrznego wyjątku , gdy bajt [] decryptedBytes = provider.Decrypt (encrypted, false); jest nazywane – bkhanal

Odpowiedz

1

W końcu znalazłem problem. Nie przypisałem klucza do makecert, aby zdefiniować go jako klucz kryptograficzny RSA.

4

następujący kod działa dobrze dla mnie:

 RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); 
     privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); 
     RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
     publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); 

     { 
      string text = "foo"; 
      byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); 
      byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); 
     } 

można dokładnie sprawdzić, że klucz prywatny jest eksportowany z cert.PrivateKey a klucz publiczny jest od cert.PublicKey.Key?

+0

, gdy cert zwraca go już generuje klucz symetryczny AES. Nie używam implementacji, gdzie musimy zrobić najpierw utworzyć publiczny klucz prywatny i generować dostawców na tej podstawie. To wykorzystuje makecert. Powyższy kod nie podaje błędu, ale ma 128-znakowy moduł ... – bkhanal

+1

"gdy cert wraca, generuje już klucz symetryczny AES." Naprawdę nie rozumiem, co to oznacza. Gdzie generowany jest klucz AES? Nie widzę go nigdzie w twoim codeample. –

+0

jeśli złożysz certyfikat za pomocą narzędzia makecert. ma prywatny i publiczny klucz. Więc możesz iść do sklepu dostać prywatny klucz publiczny .i nie wstawiłeś kodu, aby uzyskać klucz prywatny i publiczny – bkhanal

4

miałem ten sam problem z podpisem własnym cert, problem było to, że generowanie cert z przełącznikiem -sky signature zamiast -sky exchange (użyć podpisu do podpisania i wymiany do szyfrowania/deszyfrowania)

Tutaj to mój pełny polecenie MakeCert że działa:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange