2010-11-26 3 views
2

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

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

c = value^e % n 

с = зашифрованным результатом значения = число должны быть зашифровано D = моим открытым ключом модуль п = RSA

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

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

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

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

+2

Вы не можете использовать с плавающей точкой для RSA. Вам нужно «BigInteger`s» – CodesInChaos 2010-11-26 09:36:48

ответ

3

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

+0

Какой тип данных, по вашему мнению, следует использовать. Насколько мне известно, Math.pow работает только с двойным типом данных. Какие-либо предложения? Большое спасибо. – 2010-11-26 09:12:37

+0

Я не эксперт на C#. В своем ответе Enigmativity предлагает «System.Numerics.BigInteger» – SingleNegationElimination 2010-11-26 18:08:30

0

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

+0

Десятичное число не работает для RSA. Десятичное число - 128 бит, для RSA - от 1024 до 4096 бит. – CodesInChaos 2010-11-26 09:43:35

+0

Использование меньших размеров для учебных целей имеет смысл. – 2010-11-26 14:02:02

0

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

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

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

c = 1; 
for (int i = e; i--; i > 0) 
{ 
    c *= value; 
    while (c > n) { c -= n; } 
} 
1

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

Смежные вопросы