本人最近开始调研和学习同态加密,由于好多知识需要系统性学习,基础的知识包括,格加密,格上困难问题及各类问题之间的归约,LWE以及RLWE 相关概念等,同态方案基本是从Gentry博士论文开始看,随后第二代(BFV、BGV),第三代(GSW)针对布尔电路或算术电路的同态加密及其改进方案不断被提出,(要学的东西好多!!),主要学习途径就是看论文以及看 Zhihu 上大神的帖子。
为了理解LWE基本原理,本人实操一下标准 LWE 的加解密流程。并且在控制 error 在较小范围内时(这个很重要!!),测试 LWE加解密原生支持同态加法与同态常数乘积的运算。
废话不多说,直接看看代码。
# LWE encryption and decryption q = 2**10 p = 2**4 delta = q//p n=5 a = np.random.randint(0,q,n) # key gen def key_gen(): s_v = np.random.randint(0,2,n) # binary sk vector s_v_n = -s_v sk =np.concatenate((s_v_n,np.array([1])),axis=0) e1 = np.random.randint(0,delta//4) pk = np.sum(a*s_v) + e1 # b is pk; return sk,pk # encryption msg = 15 # no more than p def enc(msg,pk): e2 = np.random.randint(0,delta//8) c_v = pk + e2 + delta * msg cipher = np.concatenate((a,np.array([c_v])),axis = 0) % q return cipher # decryption def dec(cipher,sk): dec_msg = np.round((np.sum(sk * cipher) % q ) / delta) return int(dec_msg) def eval_add(c1,c2): c3 = (c1.copy() + c2.copy()) % q return c3 def eval_const_mul(const,c): c2 = (c.copy() * const) % q return c2
简单测试代码:
sk,pk = key_gen() c1 =enc(3,pk) dec_m1 = dec(c1,sk) print(dec_m1) # 3 c2 = enc(7,pk) dec_m2 = dec(c2,sk) print(dec_m2) # 7 c3 = eval_add(c1,c2) print(dec(c3,sk)) # 10 c4 = eval_const_mul(2,c2) print(dec(c4,sk)) # 14
有任何问题可以留言共同学习哈!