Шифрование и дешифрование значения с помощью алгоритма RSA

#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 ?