Comment importer une clé publique RSA de .NET dans OpenSSL
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?
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 !