Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. def 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.  
  18. def 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.  
  37. def 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.  
  53. if __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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement