2009-10-26 3 views
6

Sto utilizzando un certificato generato da makecert che ha sia la chiave privata che pubblica. Il lato java utilizza questa chiave pubblica per crittografare i dati e .net decodifica di nuovo.rsacryptoserviceprovider utilizzando certificati x509 C#

Sto tentando di decifrare la stringa codificata a 64 bit crittografata di Java e ottenere dati non validi.

Per vedere se tutto va bene su End.Net, ho provato a crittografare con la chiave pubblica e quindi decifrare con privato utilizzando lo stesso certificato. Il mio codice è simile a questo.

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

Anche qui ho ricevuto l'errore. Mi sto perdendo qualcosa?

Il certificato sembra valido sia con chiave pubblica che privata.

+0

Che errore? e su quale linea? –

+0

Eccezione: dati non validi .. Nessuna ulteriore eccezione interna quando byte [] decrittografatoBytes = provider.Decrypt (crittografato, falso); si chiama – bkhanal

risposta

1

Ho finalmente trovato il problema. Non stavo mettendo la chiave per makecert per definirla come chiave RSA Crypto.

4

Il seguente codice funziona bene per me:

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

Puoi doppio controllo che la chiave privata esportata è da cert.PrivateKey e la chiave pubblica è da cert.PublicKey.Key?

+0

quando cert restituisce già la chiave simmetrica aes. Non sto utilizzando l'implementazione in cui dobbiamo fare per prima cosa creare la chiave privata pubblica e generare i provider in base a ciò. Questo utilizza Makecert. Il codice sopra non dà l'errore, ma ha un modulo di 128 caratteri ... – bkhanal

+1

"quando cert restituisce già genera la chiave simmetrica aes." Non capisco davvero cosa significhi. Dove viene generata la chiave AES? Non riesco a vederlo da nessuna parte nel tuo codesample. –

+0

se si effettua il certificato con lo strumento makecert. ha la chiave privata e pubblica in esso. Quindi, puoi andare al negozio per ottenere la chiave pubblica privata. Non ho inserito il codice per ottenere la chiave privata e pubblica – bkhanal

4

Ho avuto lo stesso problema con un cert auto-firmato, il problema è stato che mi stava generando il CERT con l'interruttore -sky signature invece di -sky exchange (si utilizza la firma per la firma e lo scambio per la crittografia/decrittografia)

Qui è il mio comando completo makecert che funziona:

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