75 lines
1.4 KiB
Python
75 lines
1.4 KiB
Python
from secrets import SystemRandom
|
|
|
|
random = SystemRandom()
|
|
|
|
'''
|
|
def find_big_odd(k):
|
|
|
|
num = random.getrandbits(k)
|
|
while num % 2 == 0:
|
|
num =
|
|
'''
|
|
|
|
|
|
def enc(m, pk):
|
|
S = 1000
|
|
c = m + sum(random.sample(pk, S))
|
|
return c
|
|
|
|
|
|
class Alice:
|
|
def __init__(self, ya, yb, yr):
|
|
self.ya = ya
|
|
self.yb = yb
|
|
self.yr = yr
|
|
# p is the secret key
|
|
self.p = random.getrandbits(2000)*2 + 1 # odd integer
|
|
n = 2000
|
|
bigInts = [random.getrandbits(10**7) for _ in range(n)]
|
|
smallInts = [random.getrandbits(60) for _ in range(n)]
|
|
|
|
self.pk = [self.p*bigInts[i] + 2*smallInts[i] for i in range(n)]
|
|
self.cya = enc(ya, self.pk)
|
|
self.cyb = enc(yb, self.pk)
|
|
self.cyr = enc(yr, self.pk)
|
|
|
|
def send(self):
|
|
return self.cya, self.cyb, self.cyr, self.pk
|
|
|
|
def dec(self, c):
|
|
m = (c % self.p) % 2
|
|
return m
|
|
|
|
|
|
class Bob:
|
|
def __init__(self, xa, xb, xr):
|
|
self.xa = xa
|
|
self.xb = xb
|
|
self.xr = xr
|
|
|
|
def receive(self, cya, cyb, cyr, pk):
|
|
self.pk = pk
|
|
|
|
# these are ciphered values from alice
|
|
self.cya = cya
|
|
self.cyb = cyb
|
|
self.cyr = cyr
|
|
|
|
# these are ciphered values from bob
|
|
self.cxa = enc(self.xa, pk)
|
|
self.cxb = enc(self.xb, pk)
|
|
self.cxr = enc(self.xr, pk)
|
|
|
|
def compute_bloodcompatiblity(self):
|
|
|
|
|
|
#f = (1 ^ (self.xa & (1 ^ self.cya))) & (1 ^ (self.xb & (1 ^ self.cyb))) & (1 ^ (self.xr & (1 ^ self.cyr)))
|
|
#z = enc(f, self.pk)
|
|
#return z
|
|
pass
|
|
|
|
def protocol(donor, recipient):
|
|
# Alice is recipient
|
|
alice = Alice(0,1,1)
|
|
bob = Bob(1,0,0)
|
|
pass |