以下这个公式使我们要实现的同态加密版本
第一种加密
对称加密
如果密钥S是一个单位矩阵,那么c不过是输入x的一个重加权的、略带噪声的版本。
当S为单位矩阵时,相当于没有加密
当S为随机矩阵时,有加密
加解密使用同一key
1 | import numpy as np |
1 | c = encrypt(x,S,m,n,w) |
array([0, 1, 2, 5])
1 | print(x+x) |
[ 0 2 4 10]
[ 0 10 20 50]
1 | decrypt(c+c,S,w) |
array([ 0, 2, 4, 10])
1 | decrypt(c*10,S,w) |
array([ 0, 10, 20, 50])
1 | x*x |
array([0, 1, 4])
1 | decrypt(c*c,S,w) |
array([15296055, 6267577, 8584289])
第二种加密
论文作者没有显式地分配一对独立的“公钥”和“私钥”,相反,提出了一种“钥交换”技术,将私钥S替换为S’。更具体地,这一私钥交换技术涉及生成一个可以进行该变换的矩阵M。由于M具备将消息从未加密状态(单位矩阵密钥)转换为加密状态(随机而难以猜测的密钥),这个M矩阵正好可以用作我们的公钥!
基于开篇两个公式,如果密钥是一个单位矩阵,那么消息是未加密的。
基于开篇两个公式,如果密钥是一个随机矩阵,那么消息是加密的。
我们构造一个矩阵M将一个密钥转换为另一个私钥。
当矩阵M将单位矩阵转换为一个随机密钥时,根据定义,它使用单向加密方式加密了消息。
由于M充当了“单向加密”的角色,我们称它为“公钥”,并且可以像公钥一样分发它,因为它无法用于解密。
1 | import numpy as np |
1 | x = np.array([0,1,3,5]) |
[ 0 10 30 50]
[3 4 6 8]
1 | T = get_T(n) |
[-115. -122. -21. -35. 23.]
[-177. -222. -87. -177. 45.]
1 | print(decrypt(cx,S,w)) |
[0 1 3 5]
[3 3 3 3]
1 | decrypt(cx * 10,S,w) |
array([ 0, 10, 30, 50])
1 | decrypt(cx + cy,S,w) |
array([3, 4, 6, 8])