Files
CS-239-Cryptography-Project/basic.ipynb

241 lines
25 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"encoding_width = 64\n",
"database_size = 100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Client Setup"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from Pyfhel import Pyfhel, PyCtxt"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Client] Initializing Pyfhel session and data...\n"
]
}
],
"source": [
"print(f\"[Client] Initializing Pyfhel session and data...\")\n",
"HE_client = Pyfhel() # Creating empty Pyfhel object\n",
"ckks_params = {\n",
" 'scheme': 'CKKS', # can also be 'ckks'\n",
" 'n': 2**14, # Polynomial modulus degree. For CKKS, n/2 values can be\n",
" # encoded in a single ciphertext. \n",
" # Typ. 2^D for D in [10, 15]\n",
" 'scale': 2**30, # All the encodings will use it for float->fixed point\n",
" # conversion: x_fix = round(x_float * scale)\n",
" # You can use this as default scale or use a different\n",
" # scale on each operation (set in HE.encryptFrac)\n",
" 'qi_sizes': [60, 30, 30, 30, 60] # Number of bits of each prime in the chain. \n",
" # Intermediate values should be close to log2(scale)\n",
" # for each operation, to have small rounding errors.\n",
"}\n",
"HE_client.contextGen(**ckks_params) # Generate context for bfv scheme\n",
"HE_client.keyGen() # Generates both a public and a private key\n",
"HE_client.relinKeyGen()\n",
"HE_client.rotateKeyGen()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Generate and encrypt query vector\n",
"x = np.random.rand(encoding_width)\n",
"#cx = np.array([HE_client.encrypt(x[j]) for j in range(len(x))])\n",
"cx = HE_client.encrypt(x)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Client] sending HE_client=<ckks Pyfhel obj at 0x763cfa924030, [pk:Y, sk:Y, rtk:Y, rlk:Y, contx(n=16384, t=0, sec=128, qi=[60, 30, 30, 30, 60], scale=1073741824.0, )]> and cx=<Pyfhel Ciphertext at 0x763cf8b0e2c0, scheme=ckks, size=2/2, scale_bits=30, mod_level=0>\n"
]
}
],
"source": [
"# Serializing data and public context information\n",
"\n",
"s_context = HE_client.to_bytes_context()\n",
"s_public_key = HE_client.to_bytes_public_key()\n",
"s_relin_key = HE_client.to_bytes_relin_key()\n",
"s_rotate_key = HE_client.to_bytes_rotate_key()\n",
"#s_cx = [cx[j].to_bytes() for j in range(len(cx))]\n",
"s_cx = cx.to_bytes()\n",
"\n",
"print(f\"[Client] sending HE_client={HE_client} and cx={cx}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Server Mock"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def hyperbolic_distance_parts(u, v): # returns only the numerator and denominator of the hyperbolic distance formula\n",
" diff = u - v\n",
" du = -(1 - u @ u) # for some reason we need to negate this\n",
" dv = -(1 - v @ v) # for some reason we need to negate this\n",
" return diff @ diff, du * dv # returns the numerator and denominator\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# document matrix containing rows of document encoding vectors\n",
"D = np.random.rand(database_size, encoding_width)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Server] received HE_server=<ckks Pyfhel obj at 0x763cf2a734e0, [pk:Y, sk:-, rtk:Y, rlk:Y, contx(n=16384, t=0, sec=128, qi=[60, 30, 30, 30, 60], scale=1073741824.0, )]> and cx=<Pyfhel Ciphertext at 0x763cfa924ae0, scheme=ckks, size=2/2, scale_bits=30, mod_level=0>\n",
"[Server] Distances computed! Responding: res=[(<Pyfhel Ciphertext at 0x763cf3fe4f90, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a47270, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf3ff8090, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a55f40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a55f90, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a55ef0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a55db0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a55e00, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a55d60, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a55d10, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a55cc0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a55b30, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5d8b0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5db30, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5d950, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5d900, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5d9f0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5d9a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5da90, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5da40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf3fe4e00, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cfa924310, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cfa924c20, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cfa924f40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf3fe4720, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a6a4f0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5dae0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf8b41cc0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf3ff8630, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73900, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a733b0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a739a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73810, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73e50, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73040, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73a40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73ae0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a737c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73b80, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73090, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73c20, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73950, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73cc0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73180, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73d60, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73a90, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73e00, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73220, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73ea0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73bd0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73f40, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a732c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a73360, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a73d10, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cfd2b07c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c630, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5c590, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c5e0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5c4f0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c540, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5c400, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c4a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5c310, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c450, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5c2c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c3b0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a5cb30, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a5c220, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a760e0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76040, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76130, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76180, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a761d0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76220, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76270, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a762c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76310, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76360, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a763b0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76400, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76450, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a764a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76540, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a764f0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76590, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a765e0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76630, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76680, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a766d0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76720, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76770, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a767c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76810, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76860, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a768b0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76900, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76950, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a769a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76ae0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76a40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76a90, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a769f0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76b30, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76b80, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76bd0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76c20, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76c70, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76cc0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76d10, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76d60, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76db0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76e00, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76e50, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76ea0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76ef0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a76f40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a6a130, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70770, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70810, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a707c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a708b0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70860, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70950, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70900, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a709f0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a709a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70a90, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70a40, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70b30, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70ae0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70bd0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a70b80, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a70ef0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a704a0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf8b0e2c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf8b0e540, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf8b41630, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf3fcb860, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf3fcb6d0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf3fcb7c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a637c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a632c0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a63130, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a63630, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a63540, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a63bd0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a631d0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a63360, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf8b0e310, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a6cf90, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a6c180, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a6c130, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a76090, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75040, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a750e0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75090, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75180, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75130, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75220, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a751d0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a752c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75270, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75360, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75310, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75400, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a753b0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a754a0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75450, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75540, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a754f0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a755e0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75590, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75680, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75630, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75720, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a756d0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a757c0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75770, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75860, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75810, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75900, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a758b0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a759a0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75950, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75a40, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a759f0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75ae0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75a90, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75b80, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75b30, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75bd0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75c20, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75cc0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75c70, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75d60, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75d10, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75e00, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75db0, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>), (<Pyfhel Ciphertext at 0x763cf2a75ea0, scheme=ckks, size=2/4, scale_bits=60, mod_level=2>, <Pyfhel Ciphertext at 0x763cf2a75e50, scheme=ckks, size=3/3, scale_bits=60, mod_level=3>)]\n"
]
}
],
"source": [
"HE_server = Pyfhel()\n",
"HE_server.from_bytes_context(s_context)\n",
"HE_server.from_bytes_public_key(s_public_key)\n",
"HE_server.from_bytes_relin_key(s_relin_key)\n",
"HE_server.from_bytes_rotate_key(s_rotate_key)\n",
"#cx = np.array([PyCtxt(pyfhel=HE_server, bytestring=s_cx[j]) for j in range(len(s_cx))])\n",
"cx = PyCtxt(pyfhel=HE_server, bytestring=s_cx)\n",
"print(f\"[Server] received HE_server={HE_server} and cx={cx}\")\n",
"\n",
"# Encode each document weights in plaintext\n",
"res = []\n",
"\n",
"for i in range(len(D)):\n",
" #d = np.array(D[i])\n",
" #cd = np.array([HE_server.encrypt(d[j]) for j in range(len(d))])\n",
" cd = HE_server.encrypt(D[i])\n",
" # Compute distance bewteen recieved query and D[i]\n",
" res.append(hyperbolic_distance_parts(cx, cd))\n",
"\n",
"s_res = [(res[j][0].to_bytes(), res[j][1].to_bytes()) for j in range(len(res))]\n",
"\n",
"print(f\"[Server] Distances computed! Responding: res={res}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Client Parse Response"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"def hyperbolic_distance(u, v):\n",
" num = ((u - v) @ (u - v))\n",
" den = (1 - (u @ u)) * (1 - (v @ v))\n",
" return np.arccosh(1 + 2 * (num / den))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"#res = np.array([HE_client.decrypt(c_res[j]) for j in range(len(c_res))])[:,0]\n",
"#res = HE_client.decrypt(c_res)\n",
"c_res = []\n",
"for i in range(len(s_res)):\n",
" c_num = PyCtxt(pyfhel=HE_server, bytestring=s_res[i][0])\n",
" c_den = PyCtxt(pyfhel=HE_server, bytestring=s_res[i][1])\n",
" p_num = HE_client.decrypt(c_num)[0]\n",
" p_den = HE_client.decrypt(c_den)[0]\n",
" dist = np.arccosh(1 + 2 * (p_num / p_den))\n",
" c_res.append(dist)\n",
"\n",
"# Checking result\n",
"expected_res = [hyperbolic_distance(x, np.array(w)) for w in D]\n",
"#print(f\"[Client] Response received! \\nResult is {c_res} \\nShould be {expected}\\nDiff {np.abs(np.array(c_res) - np.array(expected))}\")\n",
"for i in range(len(c_res)):\n",
" result = c_res[i]\n",
" expected = expected_res[i]\n",
" #print(f\"got: {result}, expected: {expected}\")\n",
" assert np.abs(result - expected) < 1e-3"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "cs239",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.20"
}
},
"nbformat": 4,
"nbformat_minor": 2
}