Криптография RSA выводит неверные значения - PullRequest
0 голосов
/ 30 апреля 2020

Я делаю простую программу для шифрования / дешифрования простого текста с помощью криптографии RSA в c#. Проблема в том, что мой результат шифрования и результат дешифрования идентичны. Я много отлаживал свой код, и если я использую в качестве начальных значений p = 3 и q = 11, результат E = 3 и результат D = 7. Как я уже говорил, возвращаемые значения шифрования и дешифрования одинаковы, Я дважды проверил свои методы шифрования и дешифрования, они правильно написаны с использованием формул. Может ли кто-нибудь объяснить мне, что я делаю неправильно, находя E или D? На всякий случай, f = φ (n).

Вот метод, чтобы найти E:

 public BigInteger GetE(BigInteger f) 
    {
        int value = 0;

        for(int i = 2; i < n2; i++)
        {             
           if (gcd(f, i) == 1)
            {
                value = i;
                break;

            }          
        }
        return value;

    }

    BigInteger GetGCD(BigInteger a, BigInteger b)
    {

        if (a == 0)
            return b;
        return gcd(b % a, a);
    }

Вот метод, чтобы найти D:

 BigInteger GetPrivateKey(BigInteger f, BigInteger e)
    {
        BigInteger d = 0;
        for (int i = 1; i <= e; i++)
        {
            d = (1 + i * f) / e; 
            if (d % 1 == 0)
            {                   
                break;
            }
        }
        return d;
    }

Шифрование метод (массив объявлен как глобальный):

 public BigInteger[] GetEncryptedValues(int length)
    {
        encryptedValues = new BigInteger[length];
        for (int i = 0; i < textValues.Length; i++)
        {
            BigInteger k = GetPow(textValues[i], e);
            k %= n;

            encryptedValues[i] = k;
        }

        return encryptedValues;
    }

Расшифровка:

 privateKey = GetPrivateKey(f, e);

        BigInteger[] decryptedValues = new BigInteger[length];

        for (int i = 0; i < encryptedValues.Length; i++)
        {
            BigInteger k = GetPow(encryptedValues[i], privateKey);
            k %= n;
            decryptedValues[i] = k;
        }

Метод GetPow:

 public static BigInteger GetPow(BigInteger a, BigInteger b)
    {
        BigInteger result = 1;
        for (BigInteger i = 1; i < b; i++)
            result *= a;
        return result;
    }

Строка в байтах:

 public byte[] GetTextValues(string text)
    {
        byte[] asciiBytes = Encoding.ASCII.GetBytes(text);

        return asciiBytes;
    }
...