Расшифровка RSA, выпуск C # - PullRequest
1 голос
/ 15 января 2012

Проблема расшифровки RSA

У меня проблемы с программой на 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 голосов
/ 15 января 2012

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

Вам необходимо использовать Евклидов алгоритм для вычисления обратного мод phi.

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

...