在实现之前,先了解一下什么是同态加密。
以下这个公式使我们要实现的同态加密版本
S c = w x + e x = ⌈ S c w ⌋ S \mathbf{c}=w \mathbf{x}+\mathbf{e} \quad \mathbf{x}=\left\lceil\frac{S \mathbf{c}}{w}\right\rfloor Sc=wx+ex=⌈wSc⌋
第一种加密
对称加密
如果密钥S是一个单位矩阵,那么c不过是输入x的一个重加权的、略带噪声的版本。
当S为单位矩阵时,相当于没有加密
当S为随机矩阵时,有加密
加解密使用同一key
import numpy as np
def generate_key(w,m,n):
S = (np.random.rand(m,n) * w / (2 ** 16))# 可证明 max(S) < w
return S# key,对称加密
def encrypt(x,S,m,n,w):
assert len(x) == len(S)
e = (np.random.rand(m))# 可证明 max(e) < w / 2
c = np.linalg.inv(S).dot