コード例 #1
0
        public void ExtendedEuclidNewTest()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(13245687, 135469);

            Assert.AreEqual(res, 38164);
        }
コード例 #2
0
        public void ExtendedEuclidTest5()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(1111, 22222);

            Assert.AreEqual(res, 11101);
        }
コード例 #3
0
        public void ExtendedEuclidTest7()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(123456789, 12365);

            Assert.AreEqual(res, 3729);
        }
コード例 #4
0
        public void ExtendedEuclidTest3()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(50, 71);

            Assert.AreEqual(res, 27);
        }
コード例 #5
0
        public void ExtendedEuclidTest4()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(43, 64);

            Assert.AreEqual(res, 3);
        }
コード例 #6
0
        private void button4_Click(object sender, EventArgs e)
        {
            ExtendedEuclid EE     = new ExtendedEuclid();
            string         result = EE.GetMultiplicativeInverse(int.Parse(ExtendedNumber.Text), int.Parse(ExtendedBase.Text)).ToString();

            ExtendedResult.Text = result;
        }
コード例 #7
0
        public void ExtendedEuclidTest2()
        {
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            res       = algorithm.GetMultiplicativeInverse(22, 26);

            Assert.AreEqual(res, -1);
        }
コード例 #8
0
        public int Decrypt(int c1, int c2, int x, int q)
        {
            int K            = Mod_Power(c1, x, q);
            int KPowerNegOne = new ExtendedEuclid().GetMultiplicativeInverse(K, q);
            int M            = (c2 * KPowerNegOne) % q;

            return(M);
        }
コード例 #9
0
        public int Decrypt(int c1, int c2, int x, int q)
        {
            ExtendedEuclid EX       = new ExtendedEuclid();
            int            K        = keyGenration(c1, x, q);
            int            Kinverse = EX.GetMultiplicativeInverse(K, q) % q;
            int            M        = ((c2 % q) * (Kinverse % q)) % q;

            return(M);
            //throw new NotImplementedException();
        }
コード例 #10
0
        public int Decrypt(int c1, int c2, int x, int q)
        {
            //throw new NotImplementedException();
            ExtendedEuclid algorithm = new ExtendedEuclid();
            int            k         = calculateMod(c1, x, q);

            Console.WriteLine(k);
            Console.WriteLine(algorithm.GetMultiplicativeInverse(k, q));
            int plaintext = (c2 * algorithm.GetMultiplicativeInverse(k, q)) % q;

            return(plaintext);
        }
コード例 #11
0
ファイル: MatrixOP.cs プロジェクト: Kamalc/SecurityPackage
        public int Inversekey(string s)
        {
            ExtendedEuclid         e  = new ExtendedEuclid();
            Dictionary <char, int> DT = new Dictionary <char, int>();
            Dictionary <int, char> CT = new Dictionary <int, char>();
            int cnt = 0;

            for (char c = 'a'; c <= 'z'; c++)
            {
                DT[c]   = cnt;
                CT[cnt] = c;
                cnt++;
            }
            double[,] keymat = new double[3, 3];
            int rp = 0;

            for (int i = 0; i < 3; i++)
            {
                int cc = rp;
                for (int j = 0; j < 3; j++)
                {
                    keymat[i, j] = DT[s[cc]];
                    rp++;
                    cc++;
                }
                cc = rp;
            }
            int determinant = int.Parse(Matrix.Determinant(keymat).ToString());

            while (determinant > 26)
            {
                determinant -= 26;
            }
            while (determinant < 0)
            {
                determinant += 26;
            }
            int inverseMultiplicative = e.GetMultiplicativeInverse(determinant, 26);

            return(inverseMultiplicative);
        }
コード例 #12
0
ファイル: MatrixOP.cs プロジェクト: Kamalc/SecurityPackage
        public int calculateInverse(string s)
        {
            ExtendedEuclid         e  = new ExtendedEuclid();
            Dictionary <char, int> DT = new Dictionary <char, int>();
            Dictionary <int, char> CT = new Dictionary <int, char>();
            int cnt = 0;

            for (char c = 'a'; c <= 'z'; c++)
            {
                DT[c]   = cnt;
                CT[cnt] = c;
                cnt++;
            }
            int A                     = DT[s[0]];
            int B                     = DT[s[1]];;
            int C                     = DT[s[2]];;
            int D                     = DT[s[3]];;
            int determinant           = (A * D) - (C * B);
            int inverseMultiplicative = e.GetMultiplicativeInverse(determinant, 26);

            return(inverseMultiplicative);
        }
コード例 #13
0
        public List <int> Decrypt(List <int> cipherText, List <int> key)
        {
            //throw new NotImplementedException();
            MatrixOP mp = new MatrixOP();
            int      n  = key.Count;

            if (key.Count % 2 == 0)
            {
                n = n / 2;
            }
            else
            {
                n = (n / 2) - 1;
            }
            int m = (cipherText.Count / n);

            double[,] matKey = new double[n, n];
            int[,] matPlain  = new int[n, m];
            int[,] matRes    = new int[n, m];
            int rp = 0;

            for (int i = 0; i < n; i++)
            {
                int cc = rp;
                for (int j = 0; j < n; j++)
                {
                    matKey[i, j] = key[cc];
                    rp++;
                    cc++;
                }
                cc = rp;
            }
            rp = 0;
            for (int i = 0; i < m; i++)
            {
                int cc = rp;
                for (int j = 0; j < n; j++)
                {
                    matPlain[j, i] = cipherText[cc];
                    rp++;
                    cc++;
                }
                cc = rp;
            }

            int mat = int.Parse(Matrix.Determinant(matKey).ToString());

            //Console.WriteLine(mat);
            while (mat < 0)
            {
                mat += 26;
            }
            while (mat > 26)
            {
                mat -= 26;
            }
            ////////////////checking valid///////////////
            ExtendedEuclid e      = new ExtendedEuclid();
            int            mulinv = e.GetMultiplicativeInverse(mat, 26);

            if (mulinv == -1)
            {
                throw new InvalidAnlysisException();
            }
            int[,] matl = new int[n, n];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    matl[i, j] = int.Parse(Math.Floor((Math.Pow(-1, i + j) * (int.Parse(Matrix.Determinant(mp.CreateSmallerMatrix(matKey, i, j)).ToString()))) % 26).ToString());
                    if (matl[i, j] % 26 < 0)
                    {
                        matl[i, j] += 26;
                    }
                }
            }

            /////////////////////////////////
            int[,] matKeyinverse = new int[n, n];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    matKeyinverse[i, j] = matl[j, i];
                    matKeyinverse[i, j] = (mulinv * matKeyinverse[i, j]) % 26;
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    int sum = 0;
                    for (int k = 0; k < n; k++)
                    {
                        sum += matKeyinverse[i, k] * matPlain[k, j];
                    }
                    matRes[i, j] = sum % 26;
                }
            }
            List <int> PlaintText = new List <int>();

            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    PlaintText.Add(matRes[j, i]);
                }
            }
            return(PlaintText);
        }