本人最近开始调研和学习同态加密,由于好多知识需要系统性学习,基础的知识包括,格加密,格上困难问题及各类问题之间的归约,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
有任何问题可以留言共同学习哈!