Path: blob/master/test/test_shamir_secret_sharing.py
2587 views
import os1import sys2from hashlib import sha2563from random import randrange4from unittest import TestCase56from sage.all import GF78path = os.path.dirname(os.path.dirname(os.path.realpath(os.path.abspath(__file__))))9if sys.path[1] != path:10sys.path.insert(1, path)1112from attacks.shamir_secret_sharing import deterministic_coefficients13from attacks.shamir_secret_sharing import share_forgery141516class TestShamirSecretSharing(TestCase):17def _eval(self, p, a, x):18y = 019for i, ai in enumerate(a):20y += ai * x ** i21return y % p2223def test_deterministic_coefficients(self):24p = 361543836125k = 1526n = 2027s = randrange(1, p)28f = lambda ai: int.from_bytes(sha256(ai.to_bytes(32, byteorder="big")).digest(), byteorder="big")2930a = [s]31for i in range(1, n + 1):32a.append(f(a[i - 1]))33a = a[:k]3435xs = []36ys = []37for i in range(n):38x = randrange(1, p)39xs.append(x)40y = self._eval(p, a, x)41ys.append(y)4243s_ = deterministic_coefficients.attack(p, k, a[1], f, xs[0], ys[0])44self.assertIsInstance(s_, int)45self.assertEqual(s_, s)4647def test_share_forgery(self):48p = 422427335949k = 1550n = 2051s = randrange(1, p)52s_ = randrange(1, p)5354a = [s]55for i in range(1, n + 1):56a.append(randrange(1, p))57a = a[:k]5859xs = []60ys = []61for i in range(n):62x = randrange(1, p)63xs.append(x)64y = self._eval(p, a, x)65ys.append(y)6667ys[0] = share_forgery.attack(p, s, s_, xs[0], ys[0], xs[1:])68self.assertIsInstance(ys[0], int)69self.assertEqual(s_, GF(p)["x"].lagrange_polynomial(zip(xs, ys)).constant_coefficient())707172