Question

J'ai un programme .NET et un programme Borland Win32 qui doivent transmettre des informations cryptographiquement sécurisées. À l'heure actuelle, le plan consiste à ce que l'application .NET crée une paire de clés publique / privée, stocke la clé publique sur un disque et conserve la clé privée en mémoire aussi longtemps que le programme .NET est en cours d'exécution.

L'application Borland lit alors la clé publique du disque et utilise la bibliothèque OpenSSL pour chiffrer les données avec la clé publique et écrire ce résultat sur le disque.

Enfin, l'application .NET lira les données chiffrées et les déchiffrera avec la clé privée.

Quel est le meilleur moyen d’exporter la clé à partir de .NET et de l’importer à son tour dans la bibliothèque OpenSSL?

Était-ce utile?

La solution

Dans le programme .NET, créez un nouveau RSACryptoServiceProvider. Exportez la clé publique en tant que RSAParameters et écrivez 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);

Du côté C ++, vous devez lire les valeurs de module et d’exposant à partir du disque pour les convertir en BIGNUM valeurs. Ces valeurs seront chargées dans une clé RSA. Vous pourrez ensuite 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échiffrer en C # sans 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

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top