From ab347b04fed04e2a73835fc6075ad7a70fa46a7e Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 14 Nov 2019 12:21:30 +0100 Subject: [PATCH] supy --- pir/pir_Master_supreme.py | 107 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 pir/pir_Master_supreme.py diff --git a/pir/pir_Master_supreme.py b/pir/pir_Master_supreme.py new file mode 100644 index 0000000..967ec72 --- /dev/null +++ b/pir/pir_Master_supreme.py @@ -0,0 +1,107 @@ +import random +import math + +n = 8 +k = 3 + +def createX(x_string): + x_list = [] + for i in x_string: + x_list.append(int(i)) + return x_list + +x_string ="11111010" +#print(x_string) + +x = createX(x_string) +#print(x) + + + + +def findS(): + for s_candidate in range(k, n+1): + binom = math.factorial(s_candidate) / ( math.factorial(k-1) * (math.factorial(s_candidate - (k-1))) ) + if binom >= n: + return s_candidate + + +s = findS() +#print(s) + + +def makeOneSeq(seq): + seq_temp = seq.copy() + ones_remainding_counter = k - 1 + while ones_remainding_counter != 0: + rand_idx = random.randint(0, s - 1) + if seq_temp[rand_idx] == 0: + seq_temp[rand_idx] = 1 + ones_remainding_counter -= 1 + return seq_temp + +def makeSequences(): + sequnces = [ [0 for _ in range(s)] for j in range(n) ] + for i, seq in enumerate(sequnces): + candidate = makeOneSeq(seq) + while( candidate in sequnces): + candidate = makeOneSeq(seq) + sequnces[i] = candidate + sequnces.sort() + return sequnces + + +sequnces = makeSequences() +#print(sequnces) + + +def user_send(rands, i): + gs_for_servers = [[rands[l] * z + int(i[l]) for l in range(0, s)] for z in range(1, k+1)] + return gs_for_servers + + +def server_comp(gs): + F = 0 + for j in range(0, n): + f = 1 + j_bitlist = sequnces[j] + for l in range(s): + if j_bitlist[l] == 1: + f *= gs[l] + F += f * x[j] + return F + + +def servers_comp(gs_for_servers): + Fs = [] + for gs in gs_for_servers: + Fs.append(server_comp(gs)) + return Fs + +def poly_interpolation(x, Fs): + add_product = 0 + for i in range(0, k): + mult_product = 1 + for j in range(0, k): + if j != i: + mult_product *= (x - (j+1))/((i+1) - (j+1)) + add_product += mult_product * Fs[i] + return int(add_product) + + +def protocol(i): + rands = [random.randint(1,20) for _ in range(s)] + + gs_for_servers = user_send(rands, i) + Fs = servers_comp(gs_for_servers) + F0 = poly_interpolation(0, Fs) + + # print(F0) + + return F0 + + +for i in range(n): + i_bitlist = sequnces[i] + F0 = protocol(i_bitlist) + assert (F0 == x[i])