2013-07-07 6 views
0

Я пытаюсь реализовать протокол SRP для безопасной проверки подлинности. Моя проблема в том, что когда мне приходится вычислять ModPow отрицательного числа, он также возвращает отрицательное число. Я знаю, что это может быть названо остатком, а не модулем, но мне действительно нужно получить положительный модуль, чтобы создать правильный хеш.C# BigIntegers получить положительный modPow

Как я мог это сделать?

+0

Почему вы вычисляете ModPow отрицательного числа? Я не думаю, что SRP когда-либо делает эту операцию. –

+0

Потому что я получил отрицательное число после подзаголовка. B - k * pow (g, x, N). Это отрицательное значение для меня. – stomseven

+0

Вы должны добавить N, пока он не станет отрицательным. 2 часа - 3 часа - 11 часов, а не 1 час. Вы можете сделать результат mod N, чтобы убедиться, что он находится в одном добавлении N из 0. –

ответ

1

Вы можете добавить (или вычесть) любое кратное модуля от результата, так как: r + km = r (mod m)

Я предполагаю, что результат находится в: -m < r < 0, так что вы бы просто использовать r + m.


Правильная вещь, чтобы сделать, чтобы найти наименьшее неотрицательное остаток основания, по модулю т, до к экспоненциации - то есть, r <- r + m и затем экспоненциируются.

+0

И как я могу это сделать? Потому что я не могу добавить m к нему, пока он не станет положительным, потому что это очень большое отрицательное число, а m довольно мало по сравнению с ним. – stomseven

0

SRP не имеет каких-либо операций, где вам необходимо принять ModPow отрицательного числа. Вся арифметика, связанная с ModPow, должна выполняться в модульной арифметике, что на практике означает, что все входы и выходы должны быть неотрицательными и меньше некоторого модуля N.

Если вы закончите с отрицательным числом, возможно после выполнения вычитания вы по существу должны добавить N к результату, пока он не будет неотрицательным. Для огромных отрицательных значений вычисление x% N эквивалентно добавлению N, пока не потребуется только одно добавление N к положительному.