Я пытаюсь реализовать простой алгоритм подписи RSA в C#, используя только BigInteger, а не встроенные инструменты шифрования. Чтобы подписать сообщение, я зашифровал его закрытым ключом, а для его проверки расшифровал ключ publi c. В приведенном ниже коде я заметил очень странное поведение. Для некоторых входных строк (например, «Test») он успешно проверяет подпись, но для других строк (например, «Test1») он завершается неудачно.
Что я заметил, так это то, что происходит сбой, только когда переменная m
(га sh сообщения) является отрицательным числом, и это приводит к тому, что дешифрованная переменная ver
становится очень большое число и код выводит «Wrong Signature».
// Generating RSA keys
var random = new Random();
var p = new BigInteger(256, 100, random);
var q = new BigInteger(256, 100, random);
var n = p.Multiply(q);
var phi = p.Subtract(BigInteger.One).Multiply(q.Subtract(BigInteger.One));
var e = new BigInteger("65537");
var d = e.ModInverse(phi);
// Preparing the message
var messageHash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("Test"));
var m = new BigInteger(messageHash);
// Signing the message
var signature = m.ModPow(d, n);
// Verifying the message
var ver = signature.ModPow(e, n);
Console.Out.WriteLine(m);
Console.Out.WriteLine(ver);
if(ver.Equals(m))
Console.Out.WriteLine("Valid Signature");
else
Console.Out.WriteLine("Wrong Signature");
Я использую BouncyCastle для типа BigInteger
.
Пример вывода для сообщения «Test»:
16928957987407306249184430693954511195
16928957987407306249184430693954511195
Valid Signature
Пример вывода для сообщения «Test1»:
-40249184872970767997805928798048797124
10061048024793920770364189111057222210443355984675629704584018449091407182950576678391694061743052292040531884029654111183675927763342349593675935744009443
Wrong Signature
Я считаю, что ошибка где-то в процессе подписания, а не в проверке. Может быть, я не должен пытаться зашифровать отрицательные числа? Что мне делать, если ха sh отрицательный? Как я могу исправить этот код, чтобы он надежно работал с любой входной строкой?