Задача: сформироовать в OpenSSL публичный и приватный ключи, приватным ключом подписать данные и в C# проверить валидность подписанных данных (используя полученный публичный ключ, подпись и данные).
Проблема: проверить подпись в C# не удется.
Итак, вopenSSL выполняю тривиальную последовательность действий: создаю приватный ключ (1024 бит), на его основе – публичный, подписываю файл с некоторыми данными приватным ключем (с хешом MD5, например), затем валидация: пубичный ключ / подпись / данные. Verified OK. Далее нужно сделать подобную проверку уже в C# – валидация не проходит. Код:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
StreamReader sreader = new StreamReader("publickey");
// вырезаем из файла Base64-публичный ключ
string filecontent=sreader.ReadToEnd();
string[] rows = filecontent.Split(new string[] { "—–BEGIN PUBLIC KEY—–", "—–END PUBLIC KEY—–" }, StringSplitOptions.RemoveEmptyEntries);
byte[] publickey = Convert.FromBase64String(rows[0].Trim());
sreader.Close();
// присваиваем открытый ключ провайдеру
RSAParameters rsaparam = new RSAParameters();
rsaparam.Modulus = publickey;
rsaparam.Exponent = new byte[] { 1, 0, 1 };
rsa.ImportParameters(rsaparam);
// rsa.PublicOnly – уже true
// LoadFile – загружает файл в массив байт
byte[] data = LoadFile("data.txt");
byte[] signed = LoadFile("sign");
// возвращает false
Console.WriteLine("Valid: " + rsa.VerifyData(data, "MD5", signed));
Console.ReadLine();
Если процедуру подписи проводить в С# не используя OpenSSL (rsa, dgst), rsa.VerifyData() возвращает true. Куда копать?