def find_lambda(numerator, denominator, n): """ Вычисление значения l = numerator/denominator (mod n) :return: l """ left = positive_mod(denominator, n) right = positive_mod(numerator, n) return int(crt((left, n), (0, right))[0] // left)
def verify(self, message, signature): p, q, a, y = self.prover_key w, s = signature h = calc_hash(message, sha256) v = pow(h, q - 2, q) z1 = positive_mod(s * v, q) z2 = positive_mod((q - w) * v, q) u = positive_mod(positive_mod(pow(a, z1, p) * pow(y, z2, p), p), q) passed = w == u self.steps = locals() return passed
def get_random_point(a, b, n): """ Получение случайной точки на эллиптической кривой ``y^2 = x^3 + a*x + b (mod n)`` :return: Точка (x, y) """ success = False while not success: try: x = randint(1, n) y = next( sqrt_mod_iter(positive_mod(pow(x, 3, n) - (a * x) - b, n), n)) return x, y except StopIteration: pass
def add(first, second, curve): """ Операция сложения над точками кривой :param first: первая точка :param second: вторая точка :param curve: параметры кривой :return: новая точка """ if first == (0, 0): return second if second == (0, 0): return first x1, y1 = first x2, y2 = second if x1 == x2 and y1 != y2: return 0, 0 a, b, n = curve if x1 == x2: l = find_lambda(3 * x1 * x1 + a, 2 * y1, n) else: l = find_lambda(y2 - y1, x2 - x1, n) x = positive_mod(l * l - x1 - x2, n) y = positive_mod(l * (x1 - x) - y1, n) return x, y
def sign(self, message): """ Подтверждение авторства сообщения """ p, q, a, y = self.public_key h = calc_hash(message, sha256) s = w_ = w = k = 0 while s == 0: while w == 0: k = randint(1, q) w = pow(a, k, p) w_ = w % q s = positive_mod(self._private_key * w_ + k * h, q) self.steps = locals() return w_, s
def verify(self, message, signature): """ Подтверждение авторства сообщения """ (a, b, n), (x_p, y_p), q, (x_q, y_q) = self.prover_key r, s = signature h = calc_hash(message, sha512) e = h % q e_1 = int(crt((e, q), (0, 1))[0]) // e # обратное значение v = e_1 % q z1 = (s * v) % q z2 = positive_mod((q - r) * v, q) x_c, y_c = add(mul((x_p, y_p), z1, (a, b, n)), mul((x_q, y_q), z2, (a, b, n)), (a, b, n)) r_ = x_c % q passed = r == r_ self.steps = locals() return passed