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); }
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); }
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)); }
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()); } }