import socket
from phe import paillier
import pickle
import random
global conn # 连接
global size # 接收内容大小
global N # 随机数范围
global pub_key
def Random_Function(l1):
l2 = l1.copy()
random.shuffle(l2)
return dict(zip(l1, l2))
def SM():
# 获取来自客户端的数据
Ea, Eb = pickle.loads(conn.recv(size))
print("SM:")
# 计算E(a+ra)、E(b+rb)
ra = random.randint(0, N)
rb = random.randint(0, N)
print("1 已收到来自客户端的E(a)和E(B),随机 ra =", ra, "rb =", rb)
# e1:E(a)+E(ra)=E(a+ra) e2:E(b)+E(rb)=E(b+rb)
e1 = Ea+ra
e2 = Eb+rb
# e3:E(a)×ra=E(a×ra) e4:E(b)×rb=E(b×rb) e5:E(ra)×rb=E(ra×rb)
e3 = Ea*rb
e4 = Eb*ra
e5 = pub_key.encrypt(ra)*rb
# 将E(a+ra)、E(b+rb)传送给客户端
conn.sendall(pickle.dumps((e1, e2)))
print("2 计算E(a+ra)、E(b+rb),传输给客户端")
# 获取客户端传来的E[(a+ra)×(b+rb)],得到E(a×b)
d = pickle.loads(conn.recv(size))
print("3 获取客户端传来的E[(a+ra)×(b+rb)]")
e = d-e3-e4-e5
conn.sendall(pickle.dumps(e))
print("4 计算E(a×b)=E[(a+ra)×(b+rb)-a×ra-b×rb-ra×rb],传给客户端\n")
return e
def SSED():
m = pickle.loads(conn.recv(size))
e = [SM() for i in range(m)]
conn.sendall(pickle.dumps(e))
ed = pickle.loads(conn.recv(size))
def Encrypted_LSB(pub_key, T, i):
r = random.randint(0, N)
print("r=", r)
Y = T+pub_key.encrypt(r)
# 将Y发送给客户端
conn.sendall(pickle.dumps(Y))
print("1.1 LSB-将Y传输给客户端")
a = pickle.loads(conn.recv(size))
print("1.2 LSB-收到来自客户端的α")
if r % 2 == 0:
xi = a
else:
xi = pub_key.encrypt(1)-a
print("1.3 LSB-得到E(x%d)" % i)
return xi
def SVR(Ex, EX, m):
temp = [EX[i]*(2**i) for i in range(m)]
U = sum(temp)
V = U-Ex
r = random.randint(0, N)
W = V*r
conn.sendall(pickle.dumps(W))
print("3.1 SVR-将W传输给客户端")
r = pickle.loads(conn.recv(size))
print("3.2 SVR-收到来自客户端的r")
return r
def SBD(m, x):
print("SBD:")
l = 2**(-1)
print("m =", m, 'x =', x)
while True:
T = pub_key.encrypt(x)
EX = []
for i in range(m):
Exi = Encrypted_LSB(pub_key, T, i)
EX.append(Exi)
Z = T-Exi
T = Z*l
print("2 完成E(xi)和T的计算")
r = SVR(pub_key.encrypt(x), EX, m)
if r == 1:
conn.sendall(pickle.dumps(0))
break
else:
conn.sendall(pickle.dumps(1))
return EX
def SMIN(m, u, v):
F = [random.random() for i in range(m)]
print("m =", m, 'u =', u, 'v =', v)
EU = SBD(m, u) # 获得[u],[v]
EU.reverse()
EV = SBD(m, v)
EV.reverse()
EUV, W, T, G, H, FAI, L = [], [], [], [], [], [], []
H.append(pub_key.encrypt(0))
r = [random.randint(0, N) for i in range(m)]
for i in range(m):
conn.sendall(pickle.dumps((EU[i], EV[i])))
print("(1) 将EU["+str(i)+"]、EV["+str(i)+"]传输给客户端")
r2 = random.randint(0, N)
r3 = random.randint(0, N)
print("r1 =", r[i], "r2 =", r2, "r3 =", r3)
EUV.append(SM())
if F[i] >= 0.5:
W.append(EU[i]-EUV[i])
T.append(EV[i]-EU[i]+pub_key.encrypt(r[i]))
else:
W.append(EV[i]-EUV[i])
T.append(EU[i]-EV[i]+pub_key.encrypt(r[i]))
G.append(EU[i]+EV[i]-2*EUV[i])
H.append(H[i]*r2+G[i])
FAI.append(pub_key.encrypt(-1)+H[i+1])
L.append(W[i]+FAI[i]*r3)
len_ls = list(range(m))
mp1 = Random_Function(len_ls)
mp2 = Random_Function(len_ls)
T2, L2 = [0]*m, [0]*m
for i in range(m): # 根据键映射值
T2[mp1[i]] = T[i]
L2[mp2[i]] = L[i]
for i in range(m):
conn.sendall(pickle.dumps(T2[i]))
conn.sendall(pickle.dumps(L2[i]))
print("(2) 将Γ’、L’传输给客户端")
a = pickle.loads(conn.recv(size))
M2 = pickle.loads(conn.recv(size))
print("(3) 收到来自客户端的E(α)和 M’")
M3 = [0]*m
for i in range(m): # 根据值反得到键
idex = list(mp1.keys())[list(mp1.values()).index(i)]
M3[idex] = M2[i]
lamda, EMIN = [], []
for i in range(m):
lamda.append(M3[i]-a*r[i])
if F[i] >= 0.5:
EMIN.append(EU[i]+lamda[i])
else:
EMIN.append(EV[i]+lamda[i])
return EMIN
def Hamming(m, a, b):
conn.sendall(pickle.dumps(m))
EA = SBD(m, a)
EA.reverse()
EB = SBD(m, b)
EB.reverse()
conn.sendall(pickle.dumps((EA, EB)))
EAB = [SM() for i in range(m)]
XOR = [EA[i]+EB[i]-2*EAB[i] for i in range(m)]
conn.sendall(pickle.dumps(XOR))
if __name__ == '__main__':
# 开启连接
ip_port = ('127.0.0.1', 9999)
sk = socket.socket() # 创建套接字
sk.bind(ip_port) # 绑定服务地址
sk.listen(5) # 监听连接请求
print('启动socket服务,等待客户端连接...\n')
conn, address = sk.accept() # 等待连接,此处自动阻塞
size = 204800
N = 1000
string = "========================================================\n"
pub_key = pickle.loads(conn.recv(size))
print("收到来自服务器的公钥:", pub_key)
# 一、验证SM算法
print(string+"一、验证SM算法\n"+string)
e = SM()
# 二、验证SSED算法
print(string+"二、验证SSED算法\n"+string)
SSED()
# 三、验证SBD算法
print(string+"三、验证SBD算法\n"+string)
m = 3 # 0≤x≤2^m
x = random.randint(0, 2**m-1) # 生成随机x
conn.sendall(pickle.dumps((m, x)))
EX = SBD(m, x)
for i in range(m):
conn.sendall(pickle.dumps(EX[i]))
print("4 将EX传输给客户端,验证结果\n")
temp = pickle.loads(conn.recv(size)) # 表示收到
# 四、验证SMIN算法
print(string+"四、验证SMIN算法\n"+string)
m = 3
u = random.randint(0, 2**m-1) # 生成随机数u,v
v = random.randint(0, 2**m-1)
# u,v=6,24
conn.sendall(pickle.dumps((m, u, v)))
print("1.1 将m传输给客户端")
EMIN = SMIN(m, u, v)
for i in range(m):
conn.sendall(pickle.dumps(EMIN[i]))
print("(4)将EMIN传输给客户端,验证结果\n")
# 五、汉明距离计算
print(string+"五、汉明距离计算\n"+string)
m = 3 # 二进制位数
a = random.randint(0, 2**m-1)
b = random.randint(0, 2**m-1)
conn.sendall(pickle.dumps((a, b)))
temp = pickle.loads(conn.recv(size))
Hamming(m, a, b)
sk.close() # 关闭连接
评论0