コード例 #1
0
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)
コード例 #2
0
ファイル: eds.py プロジェクト: McFeod/lab_three_sec
 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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
ファイル: eds.py プロジェクト: McFeod/lab_three_sec
 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
コード例 #6
0
ファイル: eds.py プロジェクト: McFeod/lab_three_sec
 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