python简单LWE 加解密方案实现,支持密文同态加法以及常数乘法

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

有任何问题可以留言共同学习哈!

你可能感兴趣的:(算法,python,加密解密,安全)