system: [SYSTEM]

user: 3. 方案设计 在本节中，我们首先介绍一个基本的SkNN离群点检测协议，并说明为什么这样一个简单的解决方案不安全。然后，我们讨论第二种方法，一个完全安全的SkNN离群点检测协议。这两个协议都是使用第三节中说明的安全子协议作为构建模块构建的。 我们假设数据拥有者Alice的数据库由n条记录组成，用 T = 〈 t 1 ， ⋯ ， t n 〉 表示，每条记录有 m个属性，其中t i ，j 表示记录t i 的第j个属性值。Alice首先对数据库属性进行Paillier加密，即计算E pk (t i ，j )，范围为 1 ≤ i ≤ n 和 1 ≤ j ≤ m ，加密后的数据库记为E pk (T)。我们假设Alice将E pk (T)以及未来的查询处理服务发送给服务器。同时，我们假设所有的属性值及其欧氏距离都在 [ 0 ， 2 l ] 范围内。在我们使用的协议中，我们假设存在两个非合谋半诚实的服务提供者，分别用C1和C2表示，它们共同组成一个联合服务器。在此设置下，Alice将加密数据库E pk (T)发送给服务器C1，将密钥sk发送给服务器C2。我们使用的协议的目标是以高效和安全的方式检索最接近用户查询的k条记录(KNN)并以此为基础进行离群点的检测。简单地说，假设一个授权用户Bob，他想基于服务器C1中的E pk (T)，确认自己的输入 Q = 〈 q 1 ， ⋯ ， q n 〉 是否为离群点。Bob最初将他的查询Q(以加密的形式)发送到C1。在此之后，C1和C2使用一组子协议来安全地(以加密的形式)检索输入查询数据Q的k近邻数据集，之后Bob来确认自己的查询数据是否为离群点。我们强调，只有Bob才能获取到Q的k近邻的准确数据，具体协议设置如图1所示。 3.1. 基本安全协议 下面给出了SkNNb协议的主要步骤。Bob首先加密查询数据Q的属性，即计算： 图1. 协议各方设置 E p k ( Q ) = 〈 E p k ( q 1 ) ， ⋯ ， E p k ( q m ) 〉 然后将其发送到服务器C1。从Bob处接收到E pk (Q)后，持有输入(E pk (Q)、E pk (t i ))的C1和持有私钥sk的C2共同参与到安全欧几里得距离SSED协议中，其中： E p k ( t i ) = 〈 E p k ( t i ， 1 ) ， ⋯ ， E p k ( t i ， m ) 〉 其中i范围为 1 ≤ i ≤ n ，这一步的输出为Q与t i 欧氏距离的平方的paillier加密，即 d i = | Q − t i | 2 ，用E pk (d i )表示。如前所述，E pk (d i )只有服务器C1知道。我们强调加密向量之间的精确欧氏距离计算是很困难的，因为它涉及到平方根的计算。之后，服务器C1发送 { 〈 1 ， E p k ( d 1 ) 〉 ， ⋯ ， 〈 n ， E p k ( d n ) 〉 } 到C2，其中条目 〈 i ， E p k ( d i ) 〉 对应数据记录t i ，i范围为 1 ≤ i ≤ n 。之后服务器C2对每个条目进行解密，得到 d i = D s k ( E p k ( d i ) ) 。然后，C2生成一个索引列表 δ = 〈 i 1 ， ⋯ ， i k 〉 ，使得 〈 d i 1 ， ⋯ ， d i k 〉 为 〈 d 1 ， ⋯ ， d n 〉 中K个最短距离的表示。在这之后，C2发送δ到C1。C1收到δ之后，进行如下操作： 1) 选择加密记录 E p k ( t i 1 ) ， ⋯ ， E p k ( t i k ) 作为查询数据Q的K最近邻记录，并随机化它们的属性。具体而言，C1计算 γ j ， h = E p k ( t i j ， h ) ∗ E p k ( r j ， h ) ， 1 ≤ j ≤ k 且 1 ≤ h ≤ m 。这里 r j ， h 是Z N 范围内的一个随机数， t i j ， h 表示列h中 t i j 属性值。然后C1将 γ j ， h 发送到 C2， r j ， h 发送给Bob，其中 1 ≤ j ≤ k 且 1 ≤ h ≤ m 。 2) 收到 γ j ， h 之后，服务器C2解密计算 γ ′ j ， h = D s k ( γ j ， h ) ，并将其发送给Bob。注意，因为C1之前将 γ j ， h 的加密数值随机化，所以 γ ′ j ， h 仍然是Z N 范围内的随机数。 3) Bob收到 r j ， h 和 γ ′ j ， h 之后，使用 t ′ j ， h = γ ′ j ， h − r j ， h mod N 来计算查询数据Q的K近邻数据值，其中 1 ≤ j ≤ k 且 1 ≤ h ≤ m ，之后Bob根据得到的K个数值进行离群点的检测，我们采用距离方法顺序进行检测，即从这组数据的第一个开始进行数值欧式距离的判定，一旦存在某一个数值t i 与Q之间的欧式距离大于预设的距离D， 1 ≤ i ≤ k ，则说明在数据群T中与查询数据Q的欧式距离小于D的点不足k个，判定Q为离群点，否则，Q不是离群点。 3.2. 完全安全协议 上述的SkNNb协议向服务器C1和C2泄露了数据访问模式。也就是说，对于任何给定的查询数据Q，服务器C1和C2都知道哪些数据相当于Q的k近邻记录。然而，在例如医疗数据等隐私敏感的应用条件中，泄露此类信息可能是不可接受的。为此，我们使用了一个完全安全的协议，用SkNN m 表示(其中m代表最大安全)来检索Q的k近邻。 条件：C1持有加密数据库E pk (T)，随机置换函数π，C2持有私钥sk，客户端Bob提出查询Q1。 客户端Bob将 E p k ( Q ) = 〈 E p k ( q 1 ) ， ⋯ ， E p k ( q m ) 〉 发送至C12.C1和C2： (1): C1自客户端Bob处接收E pk (Q) (2): for i=1 to n: E p k ( d i ) = SSED ( E p k ( Q ) ， E p k ( t i ) ) [ d i ] = 〈 E p k ( d i ， 1 ) ， ⋯ ， E p k ( d i ， l ) 〉 = SBD ( E p k ( d i ) ) for s=1 to k do: (a): C1和C2: [ d min ] = SMIN n ( [ d 1 ] ， ⋯ ， [ d n ] ) (b): C1: E p k ( d min ) = ∏ γ = 0 l − 1 E p k ( d min ， γ + 1 ) 2 l − γ − 1 E p k ( d i ) = ∏ γ = 0 l − 1 E p k ( d i ， γ + 1 ) 2 l − γ − 1 ， s ≠ 1 ， 1 ≤ i ≤ n for i=1 to n: τ i = E p k ( d min ) ∗ E p k ( d i ) N − 1 τ ′ i = τ i r i = E p k ( r i ∗ ( d min − d i ) ) β = π ( τ ′ ) ，将β发送至C2 (c): C2: 自C1处接收β β ′ i = D s k ( β i ) ， 1 ≤ i ≤ n for 1 ≤ i ≤ n : if β ′ i = 0 : U i = E p k ( 1 ) else U i = E p k ( 0 ) 将U发送至C1 (d): C1: 自C2处接收U并计算 V = π − 1 ( U ) V ′ i ， j = SM ( V i ， E p k ( t i ， j ) ) ， 1 ≤ i ≤ n ， 1 ≤ j ≤ m E p k ( t ′ i ， j ) = ∏ i = 1 n V ′ i ， j ， 1 ≤ j ≤ m E p k ( t ′ s ) = 〈 E p k ( t ′ s ， 1 ) ， ⋯ ， E p k ( t ′ s ， m ) 〉 (e): C1和C2: E p k ( d i ， γ ) = SBOR ( V i ， E p k ( d i ， γ ) ) ， 1 ≤ i ≤ n ， 1 ≤ γ ≤ l 剩余算法步骤与SkNN b 的4~6步相同 我们使用的SkNN m 协议的主要步骤如上述算法所示。首先，Bob发送他的属性加密查询数据Q，即 E p k ( Q ) = 〈 E p k ( q 1 ) ， ⋯ ， E p k ( q m ) 〉 至服务器C1。持有(E pk (Q)、E pk (t i ))的C1和持有私钥sk的C2共同参与到安全欧几里得距离SSED协议中。这一步的输出 E p k ( d i ) = E p k ( | Q − t i | 2 ) 只有C1知道，i范围为 1 ≤ i ≤ n 。之后，持有E pk (d i )的服务器C1与持有私钥sk的服务器C2使用安全位分解SBD协议安全计算d i 的各个比特位的加密。注意，这一步的输出 [ d i ] = 〈 E p k ( d i ， 1 ) ， ⋯ ， E p k ( d i ， l ) 〉 只有C1知道，其中 d i ， 1 和 d i ， l 分别是d i 的最高有效位和最低有效位。其中 0 ≤ d i < 2 l ，且 1 ≤ i ≤ n 。 之后，服务器C1和C2以迭代的方式计算最接近查询数据Q的k近邻加密记录。更具体地说，他们在第一个迭代中计算 E p k ( t ′ 1 ) ，在第二个迭代中计算 E p k ( t ′ 2 ) ，以此类推。其中 t ′ s 表示距离Q第s近的数据记录，s范围为 1 ≤ s ≤ k ，在k次迭代结束时，只有服务器C1知道迭代结果 〈 E p k ( t ′ 1 ) ， ⋯ ， E p k ( t ′ k ) 〉 。首先，在第一次迭代中，服务器C1和C2使用安全最小n个数字协议SMIN n 计算 d 1 ， ⋯ ， d n 中最小值的各个比特位的加密.我们令[d min ]为 d 1 ， ⋯ ， d n 中最小值，该加密数值只有服务器C1才能知道。现在，服务器C1执行以下操作： 1) 使用下面的公式计算加密数值d min ： E p k ( d min ) = ∏ γ = 0 l − 1 E p k ( d min ， γ + 1 ) 2 l − γ − 1 = E p k ( d min ， 1 ∗ 2 l − 1 + ⋯ + d min ， l ) 其中d min，1 和d min，l 为d min 的最高有效位和最低有效位。 2) 计算加密数据d min 和每一个距离数据d i 的差别，即在 1 ≤ i ≤ n 范围内计算 τ i = E p k ( d min ) ∗ E p k ( d i ) N − 1 = E p k ( d min − d i ) 3) 将 τ i 随机化，具体表示为 τ ′ i = τ i r i = E p k ( r i ∗ ( d min − d i ) ) ，r i 为Z N 范围内的随机数。注意， τ ′ i 是一个加密过的0或一个随机数，其中 1 ≤ i ≤ n 。同时，使用随机置换函数π(该函数只有C1知道)将其乱序，得到 β = π ( τ ′ ) 并发送到C2。 接到β之后，服务器C2将其解密获得 β ′ i = D s k ( β i ) ，其中 1 ≤ i ≤ n 。在这之后，C2计算一个长度为n的加密向量U，如果 β ′ i = 0 那么 U i = E p k ( 1 ) ，否则 U i = E p k ( 0 ) 。在这里，我们假设β中只有一个元素为零，其他都是随机数。以此类推，U中只有一个元素为加密之后的1，其余元素为加密之后的0。然而，我们强调，如果 β ′ 中含有不止一个元素为0，那么服务器C2可以随机选择其中一个下标索引i，将E pk (1)分配给相应的U i ，并将其余的元素设为E pk (0)。然后，服务器C2把加密向量U发送到服务器C1。收到U之后，C1对其执行逆序，获得 V = π − 1 ( U ) 。注意，V中只有一个元素为E pk (1)，其余的都是E pk (0)。此时，如果 V i = E p k ( 1 ) ，则t i 是离查询数据Q最近的数据记录。然而，服务器C1和C2无法获知V中的哪一项是E pk (1)。最后，服务器C1计算与Q最接近的数据记录 E p k ( t ′ ) ，并更新距离向量，方法如下： 1) 服务器C1和C2共同参与安全乘法(SM)协议，计算 V ′ i ， j = V i ∗ E p k ( t i ， j ) ，范围为 1 ≤ i ≤ n 和 1 ≤ j ≤ m 。安全乘法SM协议的输出结果 V ′ 只有C1知道。然后，服务器C1通过使用paillier加密的同态属性，计算加密数据记录 E p k ( t ′ 1 ) = 〈 E p k ( t 1 ， 1 ) ， ⋯ ， E p k ( t 1 ， m ) 〉 ，其中 E p k ( t ′ i ， j ) = ∏ i = 1 n V ′ i ， j ，其中 1 ≤ j ≤ m ， t ′ 1 ， j 为 t ′ 1 的第j个属性值。 2) 我们需要注意，最接近查询数据Q的那一个元组应该被排除在后续的计算之外。但是，由于服务器C1不知道与 E p k ( t ′ 1 ) 对应的数据记录，因此我们需要强制消除在下一次迭代运算中再次选择该数据记录的可能性。对此，我们让C1将 E p k ( t ′ 1 ) 对应的距离更新为最大值，即2l − 1。更具体地说，C1在C2的帮助下，使用安全位或SBOR协议在范围 1 ≤ i ≤ n 和 1 ≤ γ ≤ l 内更新距离向量 E p k ( d i ， γ ) = SBOR ( V i ， E p k ( d i ， γ ) ) 。当 V i = E p k ( 1 ) 时，相应的距离向量d i 设置为最大值。也就是说，在这种情况下， [ d i ] = 〈 E p k ( 1 ) ， ⋯ ， E p k ( 1 ) 〉 。但是，当 V i = E p k ( 0 ) 时，OR操作对d i 没有影响。 重复上述迭代过程k次，直到每次迭代的[d i ]当前对应的记录值均被设置为最大值。但是，由于服务器C1不知道更新的数据对应哪个[d i ]，所以每次迭代都必须使用对应的[d i ]重新计算E pk (d i )，i范围为 1 ≤ i ≤ n 。在第s次迭代中， E p k ( t ′ s ) 只有服务器C1知道。 在迭代步骤的末尾，即算法的第3步，C1拥有查询数据Q的k个最近邻的加密记录数据列表 〈 E p k ( t ′ 1 ) ， ⋯ ， E p k ( t ′ k ) 〉 。该过程的其余部分类似于SkNNb算法的步骤4到6。简而言之，选择加密记录 E p k ( t i 1 ) ， ⋯ ， E p k ( t i k ) 作为查询数据Q的K最近邻记录，并随机化它们的属性。具体而言，C1计算 E p k ( γ j ， h ) = E p k ( t i j ， h ) ∗ E p k ( r j ， h ) ， 1 ≤ j ≤ k 且 1 ≤ h ≤ m 。这里 r j ， h 是Z N 范围内的一个随机数， t i j ， h 表示列h中 t i j 属性值。然后C1将 γ j ， h 发送到C2， r j ， h 发送给Bob，其中 1 ≤ j ≤ k 且 1 ≤ h ≤ m 。收到 γ j ， h 之后，服务器C2解密计算 γ ′ j ， h = D s k ( γ j ， h ) ，并将其发送给Bob。注意，因为C1之前将 γ j ， h 的加密数值随机化，所以 γ ′ j ， h 仍然是Z N 范围内的随机数。 Bob收到 r j ， h 和 γ ′ j ， h 之后，使用 t ′ j ， h = γ ′ j ， h − r j ， h mod N 来计算查询数据Q的K近邻数据值，其中 1 ≤ j ≤ k 且 1 ≤ h ≤ m ，之后Bob根据得到的K个数值进行离群点的检测，我们采用距离方法顺序进行检测，即从这组数据的第一个开始进行数值欧式距离的判定，一旦存在某一个数值t i 与Q之间的欧式距离大于预设的距离D， 1 ≤ i ≤ k ，则说明在数据群T中与查询数据Q的欧式距离小于D的点不足k个，判定Q为离群点，否则，Q不是离群点。