RSA проблема с расшифровкой
Работаю над алгоритмом RSA и в целом все получается, но есть проблема с расшифровкой. Для некоторых чисел, таких как 9, 10, 13 происходит неверная расшифровка сообщения.

Код
private void button_GetKey_Click(object sender, EventArgs e)
{
int n = p * q; // Модуль, который используется в открытом ключе
int f = (p - 1) * (q - 1); // Функция Эйлера
List<int> simpleNumbers = generateSimpleNumbers(f);
int exp = getExponent(simpleNumbers, f);
// На данном этапе у нас есть открытый ключ {exp, n}
//Далее необхожимо сформировафть личный ключ
int d = generatePrivateKey(exp, f); // личный ключ {d, n}
// Теперь можем приступать к кодированию
Random rnd = new Random();
//Получить случайное число
double x = rnd.Next(1, n);
textBox5.Text = x.ToString();
x = Math.Pow(x, exp);
x = x % n;
textBox3.Text = x.ToString();
// После приступаем к дешифровке
double y = Math.Pow(x, d);
y = y % n;
textBox4.Text = y.ToString();
}
private bool isSimpleNumber(int n)
{
int count = 0;
for (int i = 2; i <= n; i++)
{
if (n % i == 0) count++;
}
if (count == 1)
return true;
else
return false;
}
private List<int> generateSimpleNumbers(int n)
{
int count;
List<int> numbers = new List<int>();
for (int i = 2; i < n; i++)
{
count = 0;
for (int j = 2; j <= i; j++)
{
if (i % j == 0) count++;
}
if (count == 1)
numbers.Add(i);
}
return numbers;
}
// Находим экспоненту
private int getExponent(List<int> numbers, int fi)
{
foreach (int el in numbers)
{
if (fi % el != 0)
return el;
}
return 0;
}
// Находим личный ключ
private int generatePrivateKey(int e, int fi)
{
int d = e;
int test = 0;
do
{
d += 1;
test = (d * e) % fi;
} while (!isSimpleNumber(d) || test != 1);
return d;
}
Почему в некоторых моментах нарушается расшифровка ? Ведь условие (x < n) не нарушается. Отталкивался вот от этого источника
Ответы (1 шт):
Автор решения: return
→ Ссылка
У вас неправильный алгоритм нахождения секретного ключа.
long ComputPrivateKey(long e, long phi)
{
var d = 1;
while ((d * e - 1) % phi != 0) d++;
return d;
}
Мой вариант также не оптимальный, зато простой. За сложными вариантами вам сюда — всю информацию об RSA я брал оттуда.
Вообще вам нужно по-хорошему использовать большие числа (по 1024 бит, например), иначе у вас может быть переполнение и все ваши данные полетят коту под хвост.