Danny96 Ответов: 0

Не удается установить наши значения p и q вручную в алгоритме RSA


У меня есть код C#, который выполняет шифрование с помощью алгоритма RSA, но я хочу дать свои собственные p и q, когда я пытаюсь дать, например; p=11 q=5 вручную. Когда я пытаюсь установить свои значения вручную внутри Создавать() метод, он дает мне ошибку при ModInverse() поговорка Система.ArgumentException: "a не конвертируется".

Что я уже пробовал:

public void RSACompatibility()
        {
            var rsa = new RSACryptoServiceProvider(512);
            var parameters = rsa.ExportParameters(true);

            var recreatedParameters = Create(parameters.P, parameters.Q, parameters.Exponent, parameters.Modulus);
            var recreatedRSA = new RSACryptoServiceProvider();
            recreatedRSA.ImportParameters(recreatedParameters);

            byte[] message = Encoding.UTF8.GetBytes("hello");
            var ciphertext = rsa.Encrypt(message, false);
            var plaintext = recreatedRSA.Decrypt(ciphertext, false);
            string recreatedMessage = Encoding.UTF8.GetString(plaintext);

            var bw = new BinaryWriter(File.Open("path", FileMode.OpenOrCreate));
            bw.Write(ciphertext);
        }

        private static RSAParameters Create(byte[] p, byte[] q, byte[] exponent, byte[] modulus)
        {
            //set number to byte array
            int intValueP = 51;
            int intValueQ = 7;
            byte[] intBytes = BitConverter.GetBytes(intValueP);
            byte[] intBytes2 = BitConverter.GetBytes(intValueQ);
            var addlParameters = GetFullPrivateParameters(
                p: new BigInteger(CopyAndReverse(intBytes)),
                q: new BigInteger(CopyAndReverse(intBytes2)),
                e: new BigInteger(CopyAndReverse(exponent)),
                modulus: new BigInteger(CopyAndReverse(modulus)));

            return new RSAParameters
            {
                P = p,
                Q = q,
                Exponent = exponent,
                Modulus = modulus,
                D = addlParameters.D,
                DP = addlParameters.DP,
                DQ = addlParameters.DQ,
                InverseQ = addlParameters.InverseQ,
            };
        }

        private static RSAParameters GetFullPrivateParameters(BigInteger p, BigInteger q, BigInteger e, BigInteger modulus)
        {
            
            var n = p * q;
            var phiOfN = n - p - q + 1; // OR: (p - 1) * (q - 1);

            var d = ModInverse(e, phiOfN);
            

            var dp = d % (p - 1);
            var dq = d % (q - 1);

            var qInv = ModInverse(q, p);
          

            return new RSAParameters
            {
                D = CopyAndReverse(d.ToByteArray()),
                DP = CopyAndReverse(dp.ToByteArray()),
                DQ = CopyAndReverse(dq.ToByteArray()),
                InverseQ = CopyAndReverse(qInv.ToByteArray()),
            };
        }

        private static BigInteger Encrypt(BigInteger m, BigInteger n, BigInteger e)
        {
            return BigInteger.ModPow(m, e, n);
        }

        private static BigInteger Decrypt(BigInteger mEnc, BigInteger d, BigInteger n)
        {
            return BigInteger.ModPow(mEnc, d, n);
        }


        public static BigInteger ModInverse(BigInteger a, BigInteger n)
        {
            BigInteger t = 0, nt = 1, r = n, nr = a;

            if (n < 0)
            {
                n = -n;
            }

            if (a < 0)
            {
                a = n - (-a % n);
            }

            while (nr != 0)
            {
                var quot = r / nr;

                var tmp = nt; nt = t - quot * nt; t = tmp;
                tmp = nr; nr = r - quot * nr; r = tmp;
            }

            if (r > 1) throw new ArgumentException(nameof(a) + " is not convertible.");
            if (t < 0) t = t + n;
            return t;
        }

        private static byte[] CopyAndReverse(byte[] data)
        {
            byte[] reversed = new byte[data.Length];
            Array.Copy(data, 0, reversed, 0, data.Length);
            Array.Reverse(reversed);
            return reversed;
        }

Richard MacCutchan

Именно ваш код выдает сообщение об ошибке. Используйте свой отладчик, чтобы узнать, как он добирается до этой точки. Ваш код также будет легче понять, если вы используете правильные имена переменных, а не отдельные буквы.

Danny96

Я нахожусь на нем, пытаюсь

0 Ответов