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