Как мне импортировать открытый ключ RSA из .NET в OpenSSL

StackOverflow https://stackoverflow.com/questions/497428

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть программа .NET и программа Borland Win32, которым необходимо передать некоторую криптографически защищенную информацию.План прямо сейчас состоит в том, чтобы заставить .NET app создать пару открытого / закрытого ключей, сохранить открытый ключ на диске и хранить закрытый ключ в памяти до тех пор, пока выполняется программа .NET.

Затем приложение Borland считает открытый ключ с диска и использует библиотеку OpenSSL для шифрования данных с помощью открытого ключа и записи этого результата на диск.

Наконец .Приложение NET прочитает зашифрованные данные и расшифрует их с помощью закрытого ключа.

Каков наилучший способ экспортировать ключ из .NET и, в свою очередь, импортировать его в библиотеку OpenSSL?

Это было полезно?

Решение

В программе .NET создайте новый RSACryptoServiceProvider.Экспортируйте открытый ключ как RSAParameters и напишите Modulus и Exponent значения на диск.Вот так:

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

На стороне C ++ вам нужно будет прочитать значения модуля и экспоненты с диска, преобразовать их в BIGNUM ценности.Эти значения будут загружены в ключ RSA, а затем вы сможете зашифровать обычный текст и записать зашифрованный текст на диск.Вот так:

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

Наконец, вы можете взять зашифрованный текст и расшифровать его на C # без каких-либо затруднений.

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

Другие советы

Вы могли бы использовать OpenSSL непосредственно в C # с OpenSSL.NET обертка!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top