文章目錄
一、預備知識
1、二次剩餘
同餘理論中,一個整數 x 對另一個整數 p 的二次剩餘指 : 當 成立,則稱d 是模 p 的二次剩餘;否則稱非二次剩餘
2、雅可比符號
雅可比符號是勒讓德符號的推廣,但是根據雅可比符號的值不能判斷同餘式是否有解。
3、曼哈頓距離
圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍色和黃色代表等價的曼哈頓距離。曼哈頓距離——兩點在南北方向上的距離加上在東西方向上的距離,即
二、加密算法
1、Paillier同態加密算法
加密:
加法同態性: 由於下面性質成立:
2、Goldwasser-Micali 公鑰加密系統
協議實現過程:
密鑰產生:
- 大素數 ,求出
- 任取R,滿足
加密:
- 將明文轉化爲二進制數字
- 對於每一個,都對應選取一個
若
若 - 將這個發給
解密:
三、基於Goldwasser-Micali 公鑰加密系統的曼哈頓距離的保密計算
編碼方式1 假設全集爲 U = {−3, −2, · · · , 4, 5}, 對於點 P(5, 3), 根據編碼方法 1, 將橫座標 5 編碼爲A1 = (1, 1, 1, 1, 1, 1, 1, 1, 1). 將縱座標 3 編碼爲 A2= (1, 1, 1, 1, 1, 1, 1, 0, 0),
P(5, 3), A(P ) = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0)
Q(−3, −2), A(Q) = (1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0)
計算原理 1: 在下面計算中, 假設全集爲 Alice 和 Bob 分別擁有點 和, 滿足 , 在全集 U 之下, 點 P (或 Q) 按照編碼方式 1 對應的向量記爲關於兩點 P 和 Q 之間的曼哈頓距離, 有下面的結論.
命題 1 點 P 和 Q 間的曼哈頓距離可由下式計算:
協議 1 半誠實模型下安全計算兩點間的曼哈頓距離
輸入 Alice 輸入私密點, Bob 輸入私密點 .
輸出
準備工作 Alice 根據編碼方法 1 構造 P 對應的向量 Bob 根據編碼方法 1 得到 Q 對應的向量 Alice 運行 Goldwasser-Micali 加密方案, 生成公鑰/私鑰對 , 將公鑰 pk 發送給 Bob.
(1) Alice 用公鑰加密向量 A (分別對每個分量加密), 得到 並將 發送給 Bob.
(2) Bob 加密向量 B 的每個分量, 並計算再將 R 的 n 個分量進行隨機置換, 得到新的向量, 記爲 R`, 並將 R` 發送給 Alice.
(3) Alice 解密 ˆR (分別對每個分量解密), 得到計算 , 並將 y 發給 Bob.
(4) Alice 和 Bob 輸出 y.
四、增強的曼哈頓距離協議
編碼方式2假設全集爲 U = {−3, −2, · · · , 4, 5}, 對於點 P(−3, −2), 應用編碼方式 2, 將 x1= −3 編碼爲V1 = (0, 1, 1, 1, 1, 1, 1, 1, 1), 將 y1= −2 編碼爲 V2= (0, 0, 1, 1, 1, 1, 1, 1, 1), 並得到 P (−3, −2) 應用編碼方法 2 對應的向量 V § = (0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1).
計算原理 2: 在下面計算中, 總假設全集爲 U = {u_1, · · · , u_n}, Alice 和 Bob 分別擁有點P (x_1, y_1), Q(x_2, y_2), 滿足 x_1, y_1, x_2, y_2 ∈ U, 在全集 U 之下, 對點 P (或 Q) 先按照編碼方式 1 (或編碼方式 2) 進行編碼, 再按照編碼方式 2 (或編碼方式 1) 進行編碼, 對應的向量記爲(或關於兩點 P 和 Q 間的曼哈頓距離, 下面結論成立.
解讀上面計算原理2:
對Q(-3, -2)編碼:
編碼方式1:
編碼方式1:
結合在一起:
根據上面所述的計算原理, 並結合應用 Paillier 加密方案和數字承諾思想可設計構造防欺騙場景下計算兩點間曼哈頓距離的安全計算
協議2 防欺騙場景下安全計算兩點間的曼哈頓距離輸入 Alice
輸入 Alice私密點 , Bob 輸入私密點 .
輸出
準備工作 Alice 和 Bob 根據上例分別按照編碼方法 1 以及編碼方法 2 對點 P 和 Q 進行編碼, 得到 4n 維向量 以及 , 雙方再商定一個哈希函數. 在下面, 將Paillier 加密及解密算法分別記爲 E` 以及 D`.
(1) Alice 加密向量 A(P)(逐分量加密), 得到並將 R` 發送給 Bob.
(2) Bob 選擇隨機數 s, 計算 v=hash(s), 利用 Paillier 加密算法加密得到 E`(s), 進一步計算
Bob 將 v 以及 T 發送給 Alice.
(3) Alice 解密 T 得到 t` = D`(T), 並將 t` 發送給 Bob.
(4) Bob 計算 d = t` − s, 並將 d 發給 Alice.
(5) Alice 驗證 hash(t`− d) = v 是否成立. 若成立, 則輸出 d; 否則, 不接受 d.
由 Paillier 加密算法的加法同態性, 協議第 (3) 步 Alice 解密可得到 再由 Bob 在第 (4) 步中計算可知,
五、仿真實驗
1、Paillier同態加密算法
from paillierlib import paillier
from gmpy2 import mpz
key_pair = paillier.keygen()# Optional param.: bit size (default = 2048)
m1 = mpz(50)
m2 = mpz(21)
c1 = paillier.encrypt(m1, key_pair.public_key)
c2 = paillier.encrypt(m2, key_pair.public_key)
print(paillier.decrypt(c1 + c2, key_pair.private_key))# => 71
print(paillier.decrypt(c1 - c2, key_pair.private_key))# => 29
print(paillier.decrypt(c1 + c1 + c2, key_pair.private_key))# => 121
# Multiplication (ciphertext with plaintext)
m3 = mpz(2)
print(paillier.decrypt(c1 * m3, key_pair.private_key))# => 100
2、GM加密系統代碼模擬與同態性質驗證
這裏因爲還不是特別瞭解這個加密算法,在參數選擇上比較隨意,知識仿真實驗一下。
# GM(Goldwasser - Micali)概率公鑰加密算法,
# 其基於二次剩餘難以複合困難性問題
import math
import random
class Alice:
p = 0
q = 0
N = 0
R = 0
M = []
def __init__(self, p, q, R):
self.p = p
self.q = q
self.N = p * q
self.R = R
# 解密
def Dc(self, eM):
for i,em in enumerate(eM):
temp = '0'
c = int(math.sqrt(em % self.p))
a = int(math.sqrt(em % self.q))
# 判斷加密後的數組元素a, (a mod p) and (a mod q)是否是二次剩餘
if c ** 2 == em and a ** 2 == em:
temp = '0'
# if c ** 2 != em and a ** 2 != em:
else:
temp = '1'
self.M.append(temp)
return self.M
class Bob:
M = ''
PK = {
"R" : 0,
"N" : 0
}
C = []
def __init__(self, R, N, M):
self.PK['R'] = R
self.PK['N'] = N
self.M = M
# 加密
def Ec(self):
for i,m in enumerate(self.M):
c = 0
randomnum = random.randint(1,100)
if m == '1':
c = (self.PK['R'] * (randomnum ** 2) ) % self.PK["N"]
else:
c = (randomnum ** 2) % self.PK["N"]
self.C.append(c)
return self.C
# 驗證同態性質
def testTong(a, b):
result = []
for i in range(len(a)):
result.append(a[i] * b[i])
return result
if __name__ == '__main__':
p, q, R = 232312311797, 971179711797, 17
a = "1011011000111110000110" #
aa = [20825, 9409, 51425, 47753, 1444, 15300, 17408, 2704, 1225, 100, 7497, 57188, 20825, 111537, 6137, 2704, 2500, 196, 1369, 131648, 117113, 8464]
b = "0011011000101110000111" #
bb = [2401, 25, 425, 137700, 8281, 153, 272, 16, 5329, 7744, 59177, 2116, 39168, 166617, 19652, 400, 784, 3721, 900, 83300, 16337, 23273]
alice = Alice(p, q, R)
bob = Bob(R, p * q, a)
ec = bob.Ec()
print(ec)
#驗證加密後的數據是否具有異或同態性質
temp = testTong(aa, bb)
print(alice.Dc(temp))
結果:
[‘1’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘1’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘1’]
六、參考文獻
[1] 方樂笛,李順東,竇家維.曼哈頓距離的保密計算[J].密碼學報,2019,6(04):512-525.
[2] https://blog.csdn.net/qq_26816591/article/details/82957481