Почему моя реализация подписи RSA работает с некоторыми сообщениями, но не с другими? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь реализовать простой алгоритм подписи 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 отрицательный? Как я могу исправить этот код, чтобы он надежно работал с любой входной строкой?

1 Ответ

0 голосов
/ 19 февраля 2020

@ Топако помог мне решить мою проблему.

Алгоритм RSA требует 0 <= m <n для сообщения m и модуля n, здесь. Чтобы избежать отрицательных чисел, var m = new BigInteger (1, messageHa sh); может использоваться, что создает соответствующее значение без знака вместо значения со знаком </p>

...