Skip to content

Commit 09e2be2

Browse files
committed
init
0 parents  commit 09e2be2

File tree

3 files changed

+289
-0
lines changed

3 files changed

+289
-0
lines changed

client.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from secretsharing import SecretSharer as Shamir
2+
import numpy as np
3+
import json
4+
import requests
5+
import time
6+
from random import randint
7+
8+
#m1_raw = raw_input("User message:")
9+
m1_raw = "It is a secret message"
10+
11+
u_length = 3
12+
v_length = 3
13+
location_U = randint(0, u_length-1)
14+
location_V = randint(0, v_length-1)
15+
16+
def parser(u1,a,b):
17+
k = []
18+
19+
for i in range(len(u1)):
20+
shares = Shamir.split_secret(u1[i],a,b)
21+
tmp = []
22+
for i in shares:
23+
tmp.append(int(i[2:],16))
24+
k.append(tmp)
25+
26+
k = np.transpose(np.array(k)).tolist()
27+
return k
28+
29+
# url = 'http://localhost:5000/server_0_uploader'
30+
url = 'http://localhost:5000/batch_predict'
31+
32+
server_number = 3
33+
m1 = m1_raw.encode('hex')
34+
# m2 = 'let me die'.encode('hex')
35+
36+
u1 = []
37+
v1 = []
38+
v1_square = []
39+
for i in range(u_length):
40+
if i == location_U:
41+
u1.append('1')
42+
else:
43+
u1.append('0')
44+
45+
for i in range(v_length):
46+
if i == location_V:
47+
v1.append(m1)
48+
v1_square.append(hex(int(m1,16) ** 2)[2:-1])
49+
else:
50+
v1.append('0')
51+
v1_square.append('0')
52+
53+
# u2 = ['0','1','0','0']
54+
# v2 = [m2,'0','0','0']
55+
56+
start_time = time.time()
57+
u1_split = parser(u1,2,server_number)
58+
v1_split = parser(v1,2,server_number)
59+
v1_square = parser(v1_square,2,server_number)
60+
# h,i,j = parser(u2,2,server_number)
61+
# k,l,m = parser(v2,2,server_number)
62+
print("--- %s seconds ---" % (time.time() - start_time))
63+
#print u1_split
64+
#print v1_split
65+
66+
67+
# payload = { 'u_0' : u1_split[0],
68+
# 'u_1' : u1_split[1],
69+
# 'u_2' : u1_split[2],
70+
# 'v_0' : v1_split[0],
71+
# 'v_1' : v1_split[1],
72+
# 'v_2' : v1_split[2],
73+
# 'v1_square_0' : v1_square[0],
74+
# 'v1_square_1' : v1_square[1],
75+
# 'v1_square_2' : v1_square[2],
76+
# }
77+
payload = { 'u_0' : 0,
78+
'u_1' : 1,
79+
}
80+
r = requests.post(url, json=payload)

collision.py

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from secretsharing import SecretSharer as Shamir
2+
import numpy as np
3+
from decimal import *
4+
5+
server_number = 3
6+
7+
def parser(u1,a,b):
8+
k = []
9+
10+
for i in range(len(u1)):
11+
shares = Shamir.split_secret(u1[i],a,b)
12+
tmp = []
13+
for i in shares:
14+
tmp.append(int(i[2:],16))
15+
k.append(tmp)
16+
17+
k = np.transpose(np.array(k))
18+
return k
19+
20+
def recover(s):
21+
db = []
22+
23+
for i in range(np.shape(s)[1]):
24+
for j in range(np.shape(s)[2]):
25+
tmp1 = []
26+
for k in range(np.shape(s)[0]):
27+
tmp1.append(str(k+1)+"-"+str(hex(s[k][i][j]))[2:-1])
28+
answer = Shamir.recover_secret(tmp1)
29+
if len(answer) % 2 == 1:
30+
answer = '0' + answer
31+
db.append(answer.decode('hex'))
32+
return db
33+
34+
35+
36+
m1 = 'the first secret message'.encode('hex')
37+
m2 = 'the second secret message'.encode('hex')
38+
39+
u1 = ['1']
40+
v1 = [m1]
41+
v1_square = [hex(int(m1,16) ** 2)[2:-1]]
42+
43+
u2 = ['1']
44+
v2 = [m2]
45+
v2_square = [hex(int(m2,16) ** 2)[2:-1]]
46+
47+
#for i in range(server_number):
48+
# s = u_share[i].reshape([-1,1]).dot(v_share[i].reshape([1,-1]))
49+
50+
a,b,c = parser(u1,2,server_number)
51+
d,e,f = parser(v1,2,server_number)
52+
d_1,e_1,f_1 = parser(v1_square,2,server_number)
53+
h,i,j = parser(u2,2,server_number)
54+
k,l,m = parser(v2,2,server_number)
55+
k_1,l_1,m_1 = parser(v2_square,2,server_number)
56+
57+
s1 = a.reshape([-1,1]).dot(d.reshape([1,-1]))
58+
s2 = b.reshape([-1,1]).dot(e.reshape([1,-1]))
59+
s3 = c.reshape([-1,1]).dot(f.reshape([1,-1]))
60+
61+
s1_1 = a.reshape([-1,1]).dot(d_1.reshape([1,-1]))
62+
s2_1 = b.reshape([-1,1]).dot(e_1.reshape([1,-1]))
63+
s3_1 = c.reshape([-1,1]).dot(f_1.reshape([1,-1]))
64+
65+
s4 = h.reshape([-1,1]).dot(k.reshape([1,-1]))
66+
s5 = i.reshape([-1,1]).dot(l.reshape([1,-1]))
67+
s6 = j.reshape([-1,1]).dot(m.reshape([1,-1]))
68+
69+
s4_1 = h.reshape([-1,1]).dot(k_1.reshape([1,-1]))
70+
s5_1 = i.reshape([-1,1]).dot(l_1.reshape([1,-1]))
71+
s6_1 = j.reshape([-1,1]).dot(m_1.reshape([1,-1]))
72+
73+
s1 += s4
74+
s2 += s5
75+
s3 += s6
76+
77+
s1_1 += s4_1
78+
s2_1 += s5_1
79+
s3_1 += s6_1
80+
81+
s = np.array([s1,s2,s3])
82+
s_1 = np.array([s1_1,s2_1,s3_1])
83+
84+
msg_sum = recover(s)[0].encode('hex')
85+
square_sum = recover(s_1)[0].encode('hex')
86+
87+
getcontext().prec = 100
88+
msg_minus = long(Decimal(int(square_sum,16) * 2-int(msg_sum,16) ** 2).sqrt())
89+
90+
print hex((-msg_minus + int(msg_sum,16))/2)[2:-1].decode('hex')
91+
print hex((msg_minus + int(msg_sum,16))/2)[2:-1].decode('hex')
92+

offline_message.py

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
from flask import Flask, render_template, request
2+
import requests
3+
import json
4+
import os
5+
from secretsharing import SecretSharer as Shamir
6+
import numpy as np
7+
import time
8+
from werkzeug.contrib.cache import SimpleCache
9+
import atexit
10+
from apscheduler.schedulers.background import BackgroundScheduler
11+
from apscheduler.triggers.interval import IntervalTrigger
12+
import logging
13+
logging.basicConfig()
14+
15+
cache = SimpleCache()
16+
app = Flask(__name__)
17+
18+
scheduler = BackgroundScheduler()
19+
scheduler.start()
20+
# log = logging.getLogger('apscheduler.executors.default')
21+
# log.setLevel(logging.INFO) # DEBUG
22+
23+
# fmt = logging.Formatter('%(levelname)s:%(name)s:%(message)s')
24+
# h = logging.StreamHandler()
25+
# h.setFormatter(fmt)
26+
# log.addHandler(h)
27+
28+
29+
@app.route('/')
30+
def hello_world():
31+
return 'Welcome to test'
32+
33+
#request function that receive clients' vectors with jason form
34+
@app.route('/server_0_uploader', methods = ['POST'])
35+
def upload_request_():
36+
if request.method == 'POST':
37+
request_json = request.get_json()
38+
#print request_json
39+
u_0 = np.array(request_json.get('u_0'))
40+
u_1 = np.array(request_json.get('u_1'))
41+
u_2 = np.array(request_json.get('u_2'))
42+
v_0 = np.array(request_json.get('v_0'))
43+
v_1 = np.array(request_json.get('v_1'))
44+
v_2 = np.array(request_json.get('v_2'))
45+
# v1_square_0 = np.array(request_json.get('v_0_square'))
46+
# v1_square_1 = np.array(request_json.get('v_1_square'))
47+
# v1_square_2 = np.array(request_json.get('v_2_square'))
48+
# use reshape to perform 1-d array transpose
49+
u_0_v_0 = u_0.reshape([-1,1]).dot(v_0.reshape([1,-1]))
50+
u_1_v_1 = u_1.reshape([-1,1]).dot(v_1.reshape([1,-1]))
51+
u_2_v_2 = u_2.reshape([-1,1]).dot(v_2.reshape([1,-1]))
52+
53+
# u_0_v_0_square = u_0.reshape([-1,1]).dot(v1_square_0.reshape([1,-1]))
54+
# u_1_v_1_square = u_1.reshape([-1,1]).dot(v1_square_1.reshape([1,-1]))
55+
# u_2_v_2_square = u_2.reshape([-1,1]).dot(v1_square_2.reshape([1,-1]))
56+
57+
batch_list = np.array([u_0_v_0,u_1_v_1,u_2_v_2])
58+
# batch_square_list = [u_0_v_0_square,u_1_v_1_square,u_2_v_2_square]
59+
# batch_list = np.array([batch_list, batch_square_list])
60+
batch_result_save(batch_list)
61+
62+
return 'message sent'
63+
64+
#batch function that used to save client's results
65+
def batch_result_save(batch_list):
66+
batch_result = get_batch_result()
67+
if (type(batch_result) is not np.ndarray):
68+
set_batch_result(batch_list)
69+
else:
70+
for i in range(0,3):
71+
batch_result[i] = batch_result[i] + batch_list[i]
72+
set_batch_result(batch_result)
73+
74+
#used to print result for simple demo, will be replaced if database is implemented
75+
def batch_result():
76+
batch_result = get_batch_result()
77+
if (type(batch_result) is not np.ndarray):
78+
print "message is empty"
79+
else:
80+
print recover(batch_result)
81+
set_batch_result(None)
82+
83+
84+
#recover function perform database reconstruction
85+
def recover(s):
86+
db = []
87+
88+
for i in range(np.shape(s)[1]):
89+
for j in range(np.shape(s)[2]):
90+
tmp1 = []
91+
for k in range(np.shape(s)[0]):
92+
tmp1.append(str(k+1)+"-"+str(hex(s[k][i][j]))[2:-1])
93+
answer = Shamir.recover_secret(tmp1)
94+
if len(answer) % 2 == 1:
95+
answer = '0' + answer
96+
db.append(answer.decode('hex'))
97+
return db
98+
99+
def get_batch_result():
100+
return cache.get('batch_result')
101+
102+
def set_batch_result(batch_input):
103+
cache.set('batch_result', batch_input, timeout=5 * 60)
104+
105+
scheduler.add_job(
106+
func=batch_result,
107+
trigger=IntervalTrigger(seconds=8),
108+
id='batch_result',
109+
name='Print datebase with 5s batch',
110+
replace_existing=True)
111+
# Shut down the scheduler when exiting the app
112+
atexit.register(lambda: scheduler.shutdown())
113+
114+
if __name__ == '__main__':
115+
app.run(host='0.0.0.0', port=80, debug=True)
116+
117+

0 commit comments

Comments
 (0)