#c# #rsa
#c# #rsa
Вопрос:
Я создал программу для шифрования и дешифрования с помощью RSA. Для некоторых числовых значений результат дешифрования не соответствует исходному значению.
Например:
- 327: хорошее дешифрование
- 512: проблема с расшифровкой
Для шифрования и дешифрования я использую BigInteger.ModPow()
.
using System;
using System.Numerics;
namespace ExperimentsWithCryptographicAlgorithms
{
class Program
{
static void Main(string[] args)
{
BigInteger number = new BigInteger(327);
KeyPair keys = new KeyPair();
keys.OpenKey = new Key(new BigInteger(5), new BigInteger(493));
keys.SecurityKey = new Key(new BigInteger(269), new BigInteger(493));
BigInteger hash = Encrypt(number, keys.OpenKey);
if (Decrypt(hash, keys.SecurityKey) == number)
{
Console.WriteLine("Succesfully encrypted / decrypted!");
}
else
{
Console.WriteLine("Error in encryption or decryption!");
}
}
static BigInteger Encrypt(BigInteger encryptedValue, Key publicKey)
{
return BigInteger.ModPow(encryptedValue, publicKey.FirstPart, publicKey.SecondPart);
}
static BigInteger Decrypt(BigInteger decryptedValue, Key securityKey)
{
return BigInteger.ModPow(decryptedValue, securityKey.FirstPart, securityKey.SecondPart);
}
}
public struct Key
{
public BigInteger FirstPart { get; set; }
public BigInteger SecondPart { get; set; }
public Key(BigInteger fPart, BigInteger sPart)
{
FirstPart = fPart;
SecondPart = sPart;
}
}
public struct KeyPair
{
public Key OpenKey { get; set; }
public Key SecurityKey { get; set; }
}
}
Комментарии:
1. Если вы хотите использовать шифрование, почему бы не использовать RSACryptoServiceProvider?
2. Это для изучения алгоритмов.
Ответ №1:
Я проверил ваш алгоритм, и он отлично работает для чисел в диапазоне от -492 до 492. Это похоже на физическое ограничение алгоритма, поскольку последняя арифметическая операция равна модулю с SecurityKey.Вторая часть, которая оказывается 493.
Комментарии:
1. Это не является физическим ограничением RSA, потому что с другими ключами 512 правильно расшифровано
2. Ключевая пара ключей = новая ключевая пара(); ключи. OpenKey = новый ключ (новый BigInteger(17), новый BigInteger(3233)); ключи. SecurityKey = новый ключ (новый BigInteger (2753), новый BigInteger (3233));
3. Я имею в виду, что вторая часть ключа безопасности накладывает ограничение на максимальное число, которое может быть зашифровано и расшифровано. Вы не можете зашифровать число, большее, чем ключ безопасности. Вторая часть.
4. @SergeySulimov — посмотрите еще раз на
ModPow
. Учитывая, как это работает, как вы можете ожидать, что он вернется,512
когда третий аргумент493
?