C# 如何将RSA公钥从.NET导入OpenSSL

C# 如何将RSA公钥从.NET导入OpenSSL,c#,c++,openssl,rsa,C#,C++,Openssl,Rsa,我有一个.NET程序和一个Borland Win32程序,需要传递一些加密安全信息。目前的计划是让.NET应用程序创建一个公钥/私钥对,将公钥存储在磁盘上,并在.NET程序运行期间将私钥保留在内存中 Borland应用程序将从磁盘读取公钥,并使用OpenSSL库用公钥加密数据,然后将结果写入磁盘 最后,.NET应用程序将读取加密数据并使用私钥对其解密 从.NET导出密钥并将其导入OpenSSL库的最佳方法是什么?在.NET程序中创建一个新的RSACryptServiceProvider。将公钥导

我有一个.NET程序和一个Borland Win32程序,需要传递一些加密安全信息。目前的计划是让.NET应用程序创建一个公钥/私钥对,将公钥存储在磁盘上,并在.NET程序运行期间将私钥保留在内存中

Borland应用程序将从磁盘读取公钥,并使用OpenSSL库用公钥加密数据,然后将结果写入磁盘

最后,.NET应用程序将读取加密数据并使用私钥对其解密


从.NET导出密钥并将其导入OpenSSL库的最佳方法是什么?

在.NET程序中创建一个新的
RSACryptServiceProvider
。将公钥导出为
rsapameters
,并将
模数
指数
值写入磁盘。像这样:

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);
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++侧,你需要读取磁盘的模数和指数值,将它们转换成<代码> Biguni值。这些值将被加载到RSA密钥中,然后您可以加密纯文本并将密码文本写入磁盘。像这样:

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

您可以直接在C#中使用带有包装器的OpenSSL

这是一个伟大的项目,我已经在一两个项目中使用过它。我很高兴看到开发人员自从上次检查以来更新了V1.0.0D:(嗨),如何用私钥对C++进行解密?非常感谢。