· 6 years ago · Oct 20, 2019, 02:10 AM
1def addBits(r, a, b, carry):
2 # Xor(t1[0], a, carry[0])
3 t1 = vm.gate_xor(a, carry)
4 # Xor(t2[0], b, carry[0])
5 t2 = vm.gate_xor(b, carry)
6
7 # Xor(r[0], a, t2[0])
8 r[0] = vm.gate_xor(a, t2)
9 # And(t1[0], t1[0], t2[0])
10 t1 = vm.gate_and(t1, t2)
11
12 # Xor(r[1], carry[0], t1[0])
13 r[1] = vm.gate_xor(carry, t1)
14
15 return r
16
17
18def addNumbers(ctA, ctB, nBits):
19 ctRes = [[vm.empty_ciphertext((1,))] for i in range(nBits)]
20 # carry = vm.empty_ciphertext((1,))
21 bitResult = [[vm.empty_ciphertext((1,))] for i in range(2)]
22 ctRes[0] = vm.gate_xor(ctA[0], ctB[0])
23 # Xor(ctRes[0], ctA[0], ctB[0])
24 carry = vm.gate_and(ctA[0], ctB[0])
25 # And(carry[0], ctA[0], ctB[0])
26 for i in range(1, nBits):
27 bitResult = addBits(bitResult, ctA[i], ctB[i], carry)
28 # Copy(ctRes[i], bitResult[0]);
29 ctRes[i] = nufhe.LweSampleArray.copy(bitResult[0])
30
31 # Copy(carry[0], bitResult[1])
32 carry = nufhe.LweSampleArray.copy(bitResult[1])
33
34 return ctRes
35
36
37def mulNumbers(ctA, ctB, secret_key, input_bits, output_bits):
38 result = [ctx.encrypt(secret_key, [False]) for _ in
39 range(output_bits)]
40 # [[vm.empty_ciphertext((1,))] for _ in range(output_bits)]
41 # andRes = [[vm.empty_ciphertext((1,))] for _ in range(input_bits)]
42
43 for i in range(input_bits):
44 andResLeft = [ctx.encrypt(secret_key, [False]) for _ in
45 range(output_bits)]
46 for j in range(input_bits):
47 andResLeft[j + i] = vm.gate_and(ctA[j], ctB[i])
48 # andResLeft[j + i] = nufhe.LweSampleArray.copy(andRes[j])
49 result = addNumbers(andResLeft, result, output_bits)
50
51 return result
52
53if __name__ == '__main__':
54
55 size=16
56 bits = [[False] for i in range(size - 2)]
57 zeros = [[False] for i in range(size)]
58
59 bits1 = [[True]] + [[False]] + bits
60 bits2 = [[True]] + [[True]] + bits
61 ciphertext1 = [[vm.empty_ciphertext((1,))] for i in range(size)]
62 ciphertext2 = [[vm.empty_ciphertext((1,))] for i in range(size)]
63 for i in range(size):
64 ciphertext1[i] = ctx.encrypt(secret_key, bits1[i])
65 ciphertext2[i] = ctx.encrypt(secret_key, bits2[i])
66 start_time = time.time()
67 # result = addNumbers(ciphertext1, ciphertext2, size)
68 result = mulNumbers(ciphertext1, ciphertext2, secret_key, size, size * 2)
69 print(time.time() - start_time)
70
71 result_bits = [ctx.decrypt(secret_key, result[i]) for i in range(size * 2)]
72
73 print(result_bits)