예제 #1
0
        public IResultOfEncryptionHash EncryptHashCode(BigInteger hash, WrappedInteger recipientOpenedKey)
        {
            var p = Subscriber.P;
            var g = Subscriber.G;
            var q = Subscriber.Q;
            var x = Subscriber.ClosedKey;
            var y = Subscriber.OpenedKey;

            var k = PrimeNumberGenerator.GeneratePrimeNumber(1, (q - 1).ToInt32()); // 3;

            //hash = 9;

            var r        = (g.ВСтепень(k) % p) % q;
            var inverseK = (CryptoFormula.АлгоритмЕвклида(q, k, out var euErr) ?? throw new Exception(euErr));
            var s        = inverseK * (hash + ((x * r) % q)) % q;

            var result = new DSAResultOfEncryptionHash(r, s, Subscriber.OpenedKey, hash)
            {
                P = Subscriber.P.Value,
                Q = Subscriber.G.Value,
                G = Subscriber.Q.Value,
                K = k,
                X = Subscriber.ClosedKey.Value,
            };

            return(result);
        }
예제 #2
0
        public bool DecryptHashCode(IResultOfEncryptionHash resultOfEncryptionHash)
        {
            var hashRes = resultOfEncryptionHash as DSAResultOfEncryptionHash
                          ?? throw new ArgumentException("Результат хеша был не того типа.");

            var p = Subscriber.P;
            var q = Subscriber.Q;
            var g = Subscriber.G;
            var y = hashRes.Y; // открытый ключ отправителя
            var m = hashRes.M; // хэш

            var r = hashRes.R;
            var s = hashRes.S;

            var w  = (CryptoFormula.АлгоритмЕвклида(q, s, out var euErr) ?? throw new Exception(euErr));
            var u1 = ((m % q) * (w % q)) % q;
            var u2 = ((r % q) * (w % q)) % q;

            ////                   (g.ВСтепень(u1) mod p) mod q
            //var v = (((((((g % p) % q).ВСтепень((u1 % p) % q)) % p) % q)
            ////                   (y.ВСтепень(u2) mod p) mod q
            //    *   (((((y % p) % q).ВСтепень((u2 % p) % q)) % p) % q))
            //                                                            % p) % q;

            var v = ((g.ВСтепень(u1) * y.ВСтепень(u2)) % p) % q;

            hashRes.W  = w;
            hashRes.U1 = u1;
            hashRes.U2 = u2;
            hashRes.V  = v;

            return(v == r);
        }
예제 #3
0
        public IResultOfEncryptionHash EncryptHashCode(BigInteger hash, WrappedInteger recipientOpenedKey)
        {
            var p = Subscriber.P;
            var g = Subscriber.G;
            //var k = 9;
            WrappedInteger k = PrimeNumberGenerator.GeneratePrimeNumber(1, (p - 2).ToInt32());

            while (CryptoFormula.НайтиНОД(k, p - 1) != 1)
            {
                k = PrimeNumberGenerator.GeneratePrimeNumber(1, (p - 2).ToInt32());
            }
            k    %= p - 1;
            hash %= p - 1;

            var a = g.ВСтепень(k) % p;
            var b = (CryptoFormula.АлгоритмЕвклида(p - 1, k, out var euErr) ?? throw new Exception(euErr))
                    * ((p - 1) + (hash - ((Subscriber.ClosedKey * a) % (p - 1)))) % (p - 1);

            return(new ElgamalResultOfEncryptionHash(a, b, Subscriber.OpenedKey, hash));
        }
예제 #4
0
        private async void SolveBtn_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var module = int.Parse(moduleTextBox.Text.Trim());
                var number = int.Parse(numberTextBox.Text.Trim());

                string eulerSolutionErr   = null;
                string euclideSolutionErr = null;
                var    eulerResult        = await Task.Run(() => CryptoFormula.ФормулаЭйлера(module, number, out var divisors, out eulerSolutionErr));

                var euclideResult = await Task.Run(() => CryptoFormula.АлгоритмЕвклида(module, number, out euclideSolutionErr));

                resultEulerTextBox.Text = eulerResult != null?eulerResult.ToString() : eulerSolutionErr;

                resultEuclideTextBox.Text = euclideResult != null?euclideResult.ToString() : euclideSolutionErr;
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }