2013-04-12 1 views
4

Je travaille sur un projet où j'ai besoin d'utiliser une "clé publique" pour crypter un message en utilisant l'algorithme RSA. J'ai reçu un certificat et ma première pensée a été d'utiliser la clé publique de ce certificat et après enquête, j'ai appris que je devais utiliser RSACryptoServiceProvider pour le chiffrement.Construire RSACryptoServiceProvider à partir de la clé publique (pas de certificat)

J'ai vérifié msdn et seule la méthode que je pensais devoir utiliser est RSACryptoServiceProvider.ImportCspBlob(byte[] keyBlob). Lorsque j'ai essayé d'utiliser la clé publique exportée du certificat, j'obtenais une erreur indiquant que les données d'en-tête du certificat n'étaient pas valides.

Je sais que je peux lancer X509certificate2.PublicKey.Key à RSACryptoServiceProvider mais d'après ce que j'ai compris de mon client, je ne recevrai qu'une clé publique et non le certificat. Cette clé devra être sauvegardée dans le fichier de configuration .xml. Donc, pour résumer: Y a-t-il un moyen de générer un RSACryptoServiceProvider avec seulement la clé publique d'un certificat?

Répondre

0

Vous pouvez essayer de regarder cet exemple: RSA public key encryption in C#

var publicKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; 

var testData = Encoding.UTF8.GetBytes("testing"); 

using (var rsa = new RSACryptoServiceProvider(1024)) 
{ 
    try 
    { 
     // client encrypting data with public key issued by server 
     // 
     rsa.FromXmlString(publicKey); 
     var encryptedData = rsa.Encrypt(testData, true); 

     var base64Encrypted = Convert.ToBase64String(encryptedData); 

    } 
    finally 
    { 
     rsa.PersistKeyInCsp = false; 
    } 
} 
0

Vous êtes OK et après un bon modèle typique. L'expéditeur des données n'a pas besoin de la clé privée.

Ce qui suit peut confirmer une partie du code que vous avez déjà compris. La ligne sur laquelle j'ai défini la clé privée pour le récepteur/décodeur que j'ai omis. Je l'ai pris à partir d'un cas de test que j'ai dans mon build build stuff.

byte[] certBytAr; // This is the certificate as bianry in a .cer file (no private key in it - public only) 

X509Certificate2 cert2 = new X509Certificate2(certBytAr); 


string strToEncrypt = "Public To Private Test StackOverFlow PsudeoCode. Surfs Up at Secret Beach."; 
byte[] bytArToEncrypt = Encoding.UTF8.GetBytes(strToEncrypt); 

RSACryptoServiceProvider rsaEncryptor = (RSACryptoServiceProvider)cert2.PublicKey.Key; 

byte[] dataNowEncryptedArray = rsaEncryptor.Encrypt(bytArToEncrypt, true); 

// done - you now have encrypted bytes 
// 

    // somewhere elxe ... 
// this should decrpyt it - simulate the destination which will decrypt the data with the private key 

RSACryptoServiceProvider pk = // how this is set is complicated 

// set the private key in the x509 oobject we created way above 
cert2.PrivateKey = pk; 

RSACryptoServiceProvider rsaDecryptor = (RSACryptoServiceProvider)cert2.PrivateKey; 
byte[] dataDecrypted = rsaDecryptor.Decrypt(dataNowEncryptedArray, true); 

Console.WriteLine(" encrypt 1 Way Intermediate " + BitConverter.ToString(dataDecrypted)); 

string strDecodedFinal = Encoding.UTF8.GetString(dataDecrypted); 

if (strDecodedFinal == strToEncrypt) 
{ 

} 
else 
{ 
    Console.WriteLine(" FAILURE OF ENCRYPTION ROUND TRIP IN SIMPLE TEST (Direction: Public to Private). No Surfing For You "); 
    } 
Questions connexes