Il modo migliore per inserire RSACryptoServiceProvider da x509Certificate2?

Qual è il modo migliore per avviare un nuovo object RSACryptoServiceProvider da un X509Certificate2 Ho estratto da un X509Certificate2 ? Il certificato è associato a chiavi pubbliche (per la crittografia) e private (per la decrittografia).

Sto usando il metodo FromXmlString , ma deve esserci un modo migliore.

Grazie

 RSACryptoServiceProvider publicKeyProvider = (RSACryptoServiceProvider)certificate.PublicKey.Key; 

e

 RSACryptoServiceProvider privateKeyProvider = (RSACryptoServiceProvider)certificate.PrivateKey; 

La proprietà chiave della proprietà chiave pubblica o privata del certificato è di tipo AsymmetricAlgorithm.

La risposta di Blowdart è davvero corretta. Tuttavia, per chiarezza, devo sottolineare che se si desidera che l’istanza RSACryptoServiceProvider contenga le chiavi pubbliche e private del certificato X509 (presupponendo che il certificato abbia una chiave privata). Controlla la proprietà HasPrivateKey del certificato.

 RSACryptoServiceProvider rsa; if (cert.HasPrivateKey) rsa = (RSACryptoServiceProvider)cert.PrivateKey; else rsa = (RSACryptoServiceProvider)cert.PublicKey.Key; 

Nel caso di RSA quando è presente solo la chiave pubblica, i parametri RSA saranno solo Esponente e Modulo, tutti gli altri saranno nulli; Se invece è presente la chiave privata, i parametri RSA conterranno D, DP, DQ, Esponente, InversaQ, Modulo, P e Q.

Il modo consigliato è utilizzare la class di base RSA e il certificate.GetRSAPrivateKey() chiamata.GetRSAPrivateKey certificate.GetRSAPrivateKey() .

 RSA publicKeyProvider = certificate.GetRSAPrivateKey(); 

Dal momento che .NET 4.6, la trasmissione a RSACryptoServiceProvider come suggerito da @blowdart non è più consigliata. Questo è ancora più un problema ora poiché ci sono diverse versioni di .NET (come .NET Core).

RSACryptoServiceProvider a RSACryptoServiceProvider questo modo, ci sono buone probabilità di ottenere questa eccezione di cast (a seconda della piattaforma e delle librerie utilizzate):

Imansible eseguire il cast dell’object di tipo ‘System.Security.Cryptography.RSACng’ per digitare ‘System.Security.Cryptography.RSACryptoServiceProvider’

Il motivo è che l’implementazione effettiva potrebbe essere diversa da ciascuna piattaforma, su Windows RSACng viene utilizzato.

Ecco un link che descrive questo problema (cerca la risposta di Jeremy Barton).