2009-01-30 16 views
3

J'ai un programme .NET et un programme Borland Win32 qui doivent transmettre des informations cryptographiquement sécurisées. Le plan consiste maintenant à faire en sorte que l'application .NET crée une paire de clés publique/privée, stocke la clé publique sur le disque et conserve la clé privée en mémoire tant que le programme .NET est en cours d'exécution. L'application Borland lira ensuite la clé publique à partir du disque et utilisera la bibliothèque OpenSSL pour chiffrer les données avec la clé publique et écrire ce résultat sur le disque.Comment importer une clé publique RSA à partir de .NET dans OpenSSL

Enfin, l'application .NET lit les données cryptées et les décrypte avec la clé privée.

Quelle est la meilleure façon d'exporter la clé depuis .NET et de l'importer à son tour dans la bibliothèque OpenSSL?

Répondre

5

Dans le programme .NET, créez un nouveau RSACryptoServiceProvider. Exportez la clé publique en tant que RSAParameters et enregistrez les valeurs Modulus et Exponent sur le disque. Comme ceci:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096); //4096 bit key 
RSAParameters par = rsa.ExportParameters(false); // export the public key 

File.WriteAllBytes(@"C:\modulus.bin", par.Modulus); // write the modulus and the exponent to disk 
File.WriteAllBytes(@"C:\exponent.bin", par.Exponent); 

Sur le côté C, vous aurez besoin de lire les valeurs de module et exposant à partir du disque les convertissent en BIGNUM valeurs. Ces valeurs seront chargées dans une clé RSA, puis vous pouvez chiffrer le texte brut et écrire le texte chiffré sur le disque. Comme ceci:

RSA * key; 

unsigned char *modulus; 
unsigned char *exp; 

FILE * fp = fopen("c:\\modulus.bin", "rb"); // Read the modulus from disk 
modulus = new unsigned char[512]; 
memset(modulus, 0, 512); 
fread(modulus, 512, 1, fp); 
fclose(fp); 

fp = fopen("c:\\exponent.bin", "rb"); // Read the exponent from disk 
exp = new unsigned char[3]; 
memset(exp, 0, 3); 
fread(exp, 3, 1, fp); 
fclose(fp); 

BIGNUM * bn_mod = NULL; 
BIGNUM * bn_exp = NULL; 

bn_mod = BN_bin2bn(modulus, 512, NULL); // Convert both values to BIGNUM 
bn_exp = BN_bin2bn(exp, 3, NULL); 

key = RSA_new(); // Create a new RSA key 
key->n = bn_mod; // Assign in the values 
key->e = bn_exp; 
key->d = NULL; 
key->p = NULL; 
key->q = NULL; 

int maxSize = RSA_size(key); // Find the length of the cipher text 

cipher = new char[valid]; 
memset(cipher, 0, valid); 
RSA_public_encrypt(strlen(plain), plain, cipher, key, RSA_PKCS1_PADDING); // Encrypt plaintext 

fp = fopen("C:\\cipher.bin", "wb"); // write ciphertext to disk 
fwrite(cipher, 512, 1, fp); 
fclose(fp); 

Enfin, vous pouvez prendre le texte chiffré et le décrypter en C# sans aucune difficulté.

byte[] cipher = File.ReadAllBytes(@"c:\cipher.bin"); // Read ciphertext from file 
byte[] plain = rsa.Decrypt(cipher, false); // Decrypt ciphertext 

Console.WriteLine(ASCIIEncoding.ASCII.GetString(plain)); // Decode and display plain text 
+0

Salut, Comment décrypter cela en C++ en utilisant la clé privée ?? Merci –

0

Vous pouvez utiliser OpenSSL directement en C# avec l'emballage OpenSSL.NET!

+0

C'est un super projet, et je l'ai utilisé dans un ou deux de mes projets. Je suis heureux de voir que le développeur l'a mis à jour vers v1.0.0d depuis ma dernière vérification :). – maxwellb