Я делаю простую программу для шифрования / дешифрования простого текста с помощью криптографии 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;
}