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

标签 c# c++ openssl rsa

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

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

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

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

最佳答案

在 .NET 程序中创建一个新的 RSACryptoServiceProvider。将公钥导出为 RSAParameters 并将 ModulusExponent 值写入磁盘。像这样:

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 key 中,然后您可以加密纯文本并将密文写入磁盘。像这样:

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# - 如何将 RSA 公钥从 .NET 导入 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497428/

相关文章:

c++ - 最小化和最大化窗口的事件处理程序

安装 Xcode 5 后不再构建使用 sqlcipher 的 iOS 项目

flask - 启动 Telegram 机器人的问题

C#:存储非常相似的字符串项以高效序列化到文件的最佳集合类是什么

c# - MonoGame/XNA 旋转图像

c++ - 接口(interface)(抽象类)与其他虚拟更改的 ABI 兼容性

openssl - OpenSSL 上的 Telegram 机器人

c# - c#中的批处理

c# - 我们如何在 C# 中添加一个新行

c++ - boost asio 服务队列深度和策略