RSA - Math.pow неточно - PullRequest
       8

RSA - Math.pow неточно

2 голосов
/ 26 ноября 2010

Я пытаюсь использовать алгоритм RSA для целей обучения. Теперь у меня есть следующий вопрос. Я застрял в следующем пункте.

Мне нужно решить следующую функцию:

c = value^e % n

c = зашифрованный результат значение = номер для шифрования d = мой открытый ключ n = модуль RSA

Я использую double только как тип данных для всех переменных. Функция, которую я решил со следующей строкой:

double c = Math.Pow(value, e) % n

Проблема здесь в том, что похоже, что функция math.pow выдает неправильное значение, кажется, что она немного неточная. Когда я пытаюсь сделать это с помощью калькулятора Windows, я получаю гораздо лучший результат, который является правильным.

Мои вопросы: Кто-нибудь знает, как решить эту проблему, чтобы получить правильный результат для работы с RSA. Расчет всех других частей, безусловно, правильный. Это может быть только математика или модуль.

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Вы используете функцию с плавающей запятой для чего-то, что действительно должно быть сделано, используя произвольные целые числа точности.

1 голос
/ 26 ноября 2010

Если вы добавите ссылку на System.Numerics.dll (в .NET 4.0), вы можете использовать новую структуру System.Numerics.BigInteger, которая позволит выполнять целочисленные операции, не опасаясь выполнения и переполнения.Вы можете легко реализовать мощность в терминах BigInteger, что будет точным.

0 голосов
/ 26 ноября 2010

Выполните все вычисления в целых числах.

Повышение до степени становится умножением на значение в цикле e раз.Выполните операцию% в цикле, чтобы избежать переполнения.

Вы можете избежать оператора%, подставив цикл while, чтобы уменьшить результат до значения ниже n.(% операторов, как правило, очень медленные. Если скорость не проблема, используйте ее.)

c = 1;
for (int i = e; i--; i > 0)
{
    c *= value;
    while ( c > n) { c -= n; }
}
0 голосов
/ 26 ноября 2010

Написание метода для вычисления мощности чисел произвольной точности не так уж сложно, просто используйте тип данных Decimal, и все должно быть в порядке.

...