diff --git "a/USTB\346\231\272\350\203\275\345\256\211\345\205\250\350\277\220\347\273\264/BFV.py" "b/USTB\346\231\272\350\203\275\345\256\211\345\205\250\350\277\220\347\273\264/BFV.py" new file mode 100644 index 0000000000000000000000000000000000000000..2d8707ba3def63100c4170cbbe399286c1d8ff75 --- /dev/null +++ "b/USTB\346\231\272\350\203\275\345\256\211\345\205\250\350\277\220\347\273\264/BFV.py" @@ -0,0 +1,115 @@ +import time + +import tenseal as ts +import numpy as np + +def gencontext1(): + context = ts.context(ts.SCHEME_TYPE.BFV, 2048, 786433, coeff_mod_bit_sizes=[20, 20]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def gencontext2(): + context = ts.context(ts.SCHEME_TYPE.BFV, 4096, 786433, coeff_mod_bit_sizes=[18, 18, 18]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def gencontext3(): + context = ts.context(ts.SCHEME_TYPE.BFV, 4096, 786433, coeff_mod_bit_sizes=[40, 20, 40]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def gencontext4(): + context = ts.context(ts.SCHEME_TYPE.BFV, 8192, 786433, coeff_mod_bit_sizes=[40, 20, 40]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def gencontext5(): + context = ts.context(ts.SCHEME_TYPE.BFV, 8192, 786433, coeff_mod_bit_sizes=[40, 21, 21, 21, 40]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def gencontext6(): + context = ts.context(ts.SCHEME_TYPE.BFV, 8192, 786433, coeff_mod_bit_sizes=[40, 21, 21, 21, 21, 40]) + context.global_scale = pow(2, 21) + context.generate_galois_keys() + return context + + +def encrypt(context, np_tensor): + return ts.bfv_tensor(context, np_tensor) + +def decrypt(enc_tensor): + return np.array(enc_tensor.decrypt().tolist()) + +def bootstrap(context, tensor): + # To refresh a tensor with exhausted depth. + # Here, bootstrap = enc(dec()) + tmp = decrypt(tensor) + return encrypt(context, tmp) + +if __name__ == "__main__": + + print("=============BFV TEST=============") + + a = np.array([311618, 8, 46]) + print("明文:", a) + + start_time1 = time.time() + for i in range(10): + context = gencontext1() + enc_1 = encrypt(context, a) + decrypt(enc_1) + end_time1 = time.time() + print("Polynomial modulus:2048 Coefficient modulus sizes:[20,20] Time:", (end_time1 - start_time1)/10, "s") + print("解密后", decrypt(enc_1)) + + start_time2 = time.time() + for i in range(10): + context = gencontext2() + enc_2 = encrypt(context, a) + decrypt(enc_2) + end_time2 = time.time() + print("Polynomial modulus:4096 Coefficient modulus sizes:[30,20,30] Time:", (end_time2 - start_time2)/10, "s") + print("解密后", decrypt(enc_2)) + + start_time3 = time.time() + for i in range(10): + context = gencontext4() + enc_3 = encrypt(context, a) + decrypt(enc_3) + end_time3 = time.time() + print("Polynomial modulus:4096 Coefficient modulus sizes:[40,20,40] Time:", (end_time3 - start_time3)/10, "s") + + start_time4 = time.time() + for i in range(10): + context = gencontext4() + enc_4 = encrypt(context, a) + decrypt(enc_4) + end_time4 = time.time() + print("Polynomial modulus:8192 Coefficient modulus sizes:[40,20,40] Time:", (end_time4 - start_time4)/10, "s") + + start_time5 = time.time() + for i in range(10): + context = gencontext4() + enc_5 = encrypt(context, a) + decrypt(enc_5) + end_time5 = time.time() + print("Polynomial modulus:8192 Coefficient modulus sizes:[40, 21, 21, 21, 40] Time:", (end_time5 - start_time5)/10, "s") + + start_time6 = time.time() + for i in range(10): + context = gencontext4() + enc_6 = encrypt(context, a) + decrypt(enc_6) + end_time6 = time.time() + print("Polynomial modulus:8192 Coefficient modulus sizes:[40, 21, 21, 21, 21, 40] Time:", (end_time6 - start_time6)/10, "s")