2012-01-15 5 views
1

RSA Decryption IssueПроблема с расшифровкой RSA C#

У меня проблемы с программой C# RSA. Он не дешифрует правильно. Когда я назначаю d =(e^-1)%phiN, а затем примените d к моему зашифрованному тексту, он приходит с нелепыми десятичными ответами. У него должно получиться целое число. Я думаю, что это проблема с моей математикой. У тебя есть какой-нибудь совет? Если вам нужны детали или остальная часть кода, пожалуйста, спросите. Также есть схема прокладки, которую я мог бы использовать, чтобы сделать этот код лучше? Сейчас этот код уязвим для частотного анализа.

protected void decryptRSA(object sender, EventArgs ev) 

{ 
     double p = (double)Convert.ToInt64(P.Text);//I use 123 for testing 
     double q = (double)Convert.ToInt64(Q.Text);//127 
     double e = (double)Convert.ToInt64(E.Text);//133 
     double phiN = (p-1)*(q-1); 
     double n = p*q; 
     double d = Math.Pow(e, -1D); 
     d = d%phiN; 

     string cipherStr = outputBuffer.Text; 
     double[] cipherTextDouble = new double[100]; 
     string[]plainText = new string[cipherTextDouble.Length]; 

     cipherTextDouble = parser(cipherStr, 'D'); 
    for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
    cipherTextDouble[slot] = (double)(Math.Pow((double)cipherTextDouble[slot],(double)d)%n); 
     } 
     for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
      inputBuffer.Text += Convert.ToChar(cipherTextDouble[slot]) + ' ';//the spot were it dies 
//it doesn't like to convert from a decimal like 1.75 to a char. Of course I should never get a decimal like 1.75, which is the problem 
     } 
    } 
+1

не использовать двойной. –

ответ

2

Вы не правильно вычисляете показатель. Вам необходимо найти номер d такой, что ed = 1 (mod phi) т. Е. Обратный e (mod phi). Это не то же самое, что вычисление инверсии e в действиях, которое вычисляется double d = Math.Pow(e, -1D);, а затем выполняет операцию mod. По этой причине вы получаете десятичное число (в этом случае 1/133 ~ 0,007 и 1/133% 15372 все еще = 0,007, так как % фактически является оператором «остатка» в C#, а не целочисленным модулем (в противном случае он В любом случае, работа на двойнике)).

Для расчета обратного mod phi необходимо использовать Euclidean Algorithm.

EDIT: GregS правильно указывает, что для реализации компьютера вы, вероятно, захотите использовать Extended Euclidean Algorithm вместо этого, чтобы найти модульный инверсный за один проход. Это то, что обычно делается вычислительно. Вы можете сделать это с помощью евклидова алгоритма (обычно вручную), но это пустая трата времени.

+1

* расширенный * евклидовой алгоритм. –

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