open c# c++ openssl rsa

open - rsacryptoserviceprovider private key c#



Cómo importo una clave pública de RSA de.NET a OpenSSL (2)

En el programa .NET cree un nuevo RSACryptoServiceProvider . Exporte la clave pública como RSAParameters y escriba los valores de Modulus y Exponent en el disco. Me gusta esto:

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);

En el lado de C ++ necesitarás leer los valores de módulo y exponente del disco para convertirlos en valores BIGNUM . Estos valores se cargarán en una clave RSA y luego podrá cifrar el texto sin formato y escribir el texto de cifrado en el disco. Me gusta esto:

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);

Finalmente puede tomar el texto cifrado y descifrarlo en C # sin ninguna dificultad.

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

Tengo un programa .NET y un programa Borland Win32 que necesitan transmitir cierta información criptográficamente segura. El plan ahora es hacer que la aplicación .NET cree un par de claves público / privado, almacene la clave pública en el disco y mantenga la clave privada en la memoria mientras se esté ejecutando el programa .NET.

La aplicación Borland leerá la clave pública del disco y usará la biblioteca OpenSSL para encriptar los datos con la clave pública y escribir ese resultado en el disco.

Finalmente, la aplicación .NET leerá los datos encriptados y los descifrará con la clave privada.

¿Cuál es la mejor manera de exportar la clave de .NET y, a su vez, importarla a la biblioteca de OpenSSL?


¡Podrías usar OpenSSL directamente en C # con el contenedor OpenSSL.NET !