Modular arithmetic and sharing secrets
We want to get two people to be able to together compute a secret, but unable to do it on their own. Let's first define a boring prime sieve.
def is_prime(p):
"""
Basic sieve.
"""
for i in range(2, p - 1):
if p % i == 0:
return i
return True
We also need a way to invert numbers in $\Z_m$ and we do so by a boring linear search.
def inv(a, m):
"""Find multiplicative
inverse of a in Z_m.
That is, c such that
a * c == 1 (mod m).
"""
for c in range(m):
if (a * c) % m == 1:
return c
The mechanism
Suppose we have some secret that we can represent as an integer $b$. We also fix a prime $p>b$ and we pick at random an integer between $0$ and $p$. We define a linear function $f$ by $$f(x)=ax+b \pmod p$$
Now suppose we get two pairs $(i, f(i))$ and $(j, f(j))$. We can then find the coefficients of $f$ and the constant term is the secret!
def solve(i, f_i, j, f_j):
"""Solve system of two
linear equations in Z_p
hence obtaining secret b.
"""
a = inv(i - j, p) * (f(i) - f(j))
b = f_i - a * i
return b % p
We test it as follows
from random import randint
b = 1111 # Secret
p = 10007 # Prime
a = randint(0, p)
f = lambda x: (a * x + b) % p
solve(5, f(5), 7, f(7)) == b # True!
27 December, 2018