Я пытаюсь узнать, как получить некоторый код, использующий OpenSSL для криптографии, чтобы хорошо играть с другой программой, которую я пишу на C #, с использованием поставщиков криптографии Microsoft, доступных в .NET.
Более конкретно, я пытаюсь заставить программу C # проверять подпись сообщения RSA, сгенерированную кодом OpenSSL. Код, генерирующий подпись, выглядит примерно так:
// Code in C, using the OpenSSL RSA implementation
char msgToSign[] = "Hello World"; // the message to be signed
char signature[RSA_size(rsa)]; // buffer that will hold signature
int slen = 0; // will contain signature size
// rsa is an OpenSSL RSA context, that's loaded with the public/private key pair
memset(signature, 0, sizeof(signature));
RSA_sign(NID_sha1
, (unsigned char*)msgToSign
, strlen(msgToSign)
, signature
, &slen
, rsa);
// now signature contains the message signature
// and can be verified using the RSA_verify counterpart
// .. I would like to verify the signature in C#
В C # я бы сделал следующее:
- импортирует открытый ключ другой стороны в
RSACryptoServiceProvider
объект
- получить сообщение и его подпись
- попытаться проверить подпись
У меня работают первые две части (я проверил, что открытый ключ загружается правильно, потому что мне удалось отправить зашифрованный RSA-текст из кода C # в код OpenSSL в C и успешно расшифровать его)
Чтобы проверить подпись в C #, я попытался использовать метод: VerifySignature для RSACryptoServiceProvider, но это не сработало. И, копаясь в Интернете, я смог найти лишь некоторую расплывчатую информацию, указывающую на то, что .NET использует другой метод для генерации подписи, чем OpenSSL. Итак, кто-нибудь знает, как этого добиться?
EDIT
Так как был запрос, вот сторона C # вещей.
byte[] receivedSignature;
// ....
// receivedSignature is set to the byte array generated by the OpenSSL side
// I've verified this much is working correctly
// I use my utility to parse a PEM file and extract the other side's public key
// also, verified to be working correctly - the public key is good.
RSACryptoServiceProvider rsa = MyPEMLoader.LoadFromFile("publicKey.pem");
string msgToVerify = "Hello World";
byte[] msgBytes = Encoding.ASCII.GetBytes(msg); // other side uses ASCII, so do the same
bool verified = rsa.VerifyHash(msgBytes, "SHA1", receivedSignature);
// verfied is false.. verfification failed!