Я пытался проверить подпись ответа SAML после того, как обнаружил, что SignedXml .NET имеет проблему (когда тот же самый ответ SAML можно проверить с помощью Java).
Я знаю, почему именно это привело меня к желанию проверить подпись самому, что не должно быть слишком сложно. Теоретически.
Вкратце, у меня есть довольно простой код подписи RSA, и я использую внешний инструмент для расчета ожидаемого дайджеста SignedInfo элемент для сравнения.
Приведенный ниже код усекает сигнатуру и модуль для удобства чтения. Но я проверил и доказал с помощью других вычислений, что преобразование Big-Endian -> Little-Endian и отмена подписи полученного числа работает так, как я и ожидал.
var sigString = "Xxfh0hq34DGIQibeBrNcYuU/XD0aX...IviQm/5jZK6pD9wReldSPoo=";
var sigBytes = Convert.FromBase64String(sigString).Reverse().Append(0x0).ToArray();
var s = new BigInteger(sigBytes);
var modulusString = "lg4dkGLwfAApoNtWoX...oxvjjaGfH9PzoE=";
var modulusBytes = Convert.FromBase64String(modulusString).Reverse().Append(0x0).ToArray();
var n = new BigInteger(modulusBytes);
var exponentString = "AQAB";
var exponentBytes = Convert.FromBase64String(exponentString).Reverse().Append(0x0).ToArray();
var e = new BigInteger(exponentBytes);
var r = BigInteger.ModPow(s, e, n);
var expectedB64 = "XeHIN99Mkt5A/HswHotEndGJ6ahw/0l8jbjy92Fjsaw=";
var expected = new BigInteger(Convert.FromBase64String(expectedB64).Reverse().Append(0x0).ToArray());
var expectedHex = expected.ToString("X");
var resultHex = r.ToString("X");
//Removing pkcs1.5 padding
var actualHex = resultString.Substring(resultString.Length - expectedString.Length);
Debug.Assert(resultHex == actualHex); //Fail
Подробнее здесь: https://stackoverflow.com/questions/786 ... l-response