私は、OpenSSLに、.NETからRSA公開鍵をインポートするにはどうすればよいです
質問
私は、.NETプログラムといくつかの暗号化された安全情報を渡す必要がボーランドのWin32プログラムを持っています。計画は今、.NETアプリが公開鍵/秘密鍵のペアを作成する必要があり、ディスク上の公開鍵を格納している限り、.NETプログラムが実行されているため、メモリ内の秘密鍵を維持することです。
ボーランドアプリは、ディスクから公開鍵を読み込み、公開鍵でデータを暗号化し、ディスクにその結果を書き込むためにOpenSSLライブラリを使用します。
最後に、.NETアプリケーションは暗号化されたデータを読み込み、秘密鍵で復号化されます。
OpenSSLライブラリにそれ.NETからターンインポートにキーをエクスポートするための最良の方法は何ですか?
解決
.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.NET のラッパー!
所属していません StackOverflow