5
5
6
6
#include " ../oprf/ote_oprf.hpp"
7
7
#include " ../ot/alsz_ote.hpp"
8
- // 为什么会出现错误率过高的情况
8
+ // 基于 bloom的 psi可以使用 直接使用plain的不行
9
9
10
10
namespace OPRFPSI {
11
+ std::string uintTostring (std::vector<uint8_t > num) {
12
+ std::string str = " " ;
13
+ for (int i = 0 ; i < num.size (); i++) {
14
+ str += std::to_string (static_cast <int >(num[i]));
15
+
16
+ }
17
+ return str;
18
+ }
19
+
11
20
std::vector<block> Receive (NetIO &io, OTEOPRF::PP &pp, std::vector<block> &vec_Y) {
12
- if (vec_Y.size ()!= pp.LEN ){
21
+ if (vec_Y.size () != pp.LEN ) {
13
22
std::cerr << " |Y| does not match public parameter" << std::endl;
14
23
exit (1 );
15
24
}
16
25
auto start_time = std::chrono::steady_clock::now ();
17
- std::vector<std::vector<uint8_t >> oprf_value = OTEOPRF::Client (io, pp, vec_Y, vec_Y.size ());
26
+ std::vector<std::vector<uint8_t >> oprf_key = OTEOPRF::Server (io, pp);
27
+ std::vector<std::vector<uint8_t >> oprf_value = OTEOPRF::Evaluate (pp, oprf_key, vec_Y, vec_Y.size ());
18
28
std::vector<uint8_t > vec_indication_bit (vec_Y.size ());
29
+ std::vector<block> ans;
19
30
std::string choice = " bloom" ;
20
31
if (choice == " bloom" ) {
21
32
BloomFilter filter;
@@ -24,63 +35,73 @@ namespace OPRFPSI {
24
35
char *buffer = new char [filter_size];
25
36
io.ReceiveBytes (buffer, filter_size);
26
37
filter.ReadObject (buffer);
27
-
28
38
auto bloom_start_time = std::chrono::steady_clock::now ();
29
- vec_indication_bit= filter.Contain (oprf_value);
39
+ vec_indication_bit = filter.Contain (oprf_value);
30
40
auto bloom_end_time = std::chrono::steady_clock::now ();
31
41
auto running_time1 = bloom_end_time - bloom_start_time;
32
- std::cout << " Receiver excute bloom filter query time "
42
+ std::cout << " Receiver excute bloom filter query takes time= "
33
43
<< std::chrono::duration<double , std::milli>(running_time1).count () << " ms" << std::endl;
34
44
delete[] buffer;
35
-
36
45
PrintSplitLine (' -' );
37
- std::cout << " mpOPRF-based PSI: Sender ===> BloomFilter(F_k(x_i)) ===> Receiver ["
46
+ std::cout << " mpOPRF-based PSI: Receive < === BloomFilter(F_k(x_i)) < === Sender ["
38
47
<< (double ) (filter_size) / (1 << 20 ) << " MB]" << std::endl;
48
+ for (int i = 0 ; i < vec_indication_bit.size (); i++) {
49
+ if ((int ) vec_indication_bit[i] == 1 ) ans.push_back (vec_Y[i]);
50
+ }
51
+ auto end_time = std::chrono::steady_clock::now ();
52
+ auto running_time = end_time - start_time;
53
+ std::cout << " mpOPRF-based PSI [bloom filter]: Receiver side takes time "
54
+ << std::chrono::duration<double , std::milli>(running_time).count () << " ms" << std::endl;
39
55
}
40
- int count=0 ;
41
- for (int i=0 ;i<vec_indication_bit.size ();i++){
42
- if ((int )vec_indication_bit[i]==1 ) std::cout<<i<<std::endl,count++;
43
56
57
+ if (choice == " plain" ) {
58
+
59
+ std::vector<std::string> rev_oprf_values (pp.LEN );
60
+ std::unordered_set<std::string> S;
61
+ // #pragma omp parallel for num_threads(thread_count)
62
+ for (auto i = 0 ; i < pp.LEN ; i++) {
63
+ int len;
64
+ io.ReceiveInteger (len);
65
+ std::string str (len,' 0' );
66
+ io.ReceiveString (str);
67
+ if (i==1 ) std::cout<<str<<std::endl;
68
+ S.insert (str);
69
+ // std::cout<<rev_oprf_values[i]<<std::endl;
70
+ }
71
+
72
+ #pragma omp parallel for num_threads(thread_count)
73
+ for (auto i = 0 ; i < pp.LEN ; i++) {
74
+ if (S.find (uintTostring (oprf_value[i])) == S.end ()) vec_indication_bit[i] = 0 ;
75
+ else vec_indication_bit[i] = 1 ;
76
+ }
77
+ #pragma omp parallel for num_threads(thread_count)
78
+ for (int i = 0 ; i < vec_indication_bit.size (); i++) {
79
+ if ((int ) vec_indication_bit[i] == 1 ) ans[i]=vec_Y[i];
80
+ }
81
+ auto end_time = std::chrono::steady_clock::now ();
82
+ auto running_time = end_time - start_time;
83
+ std::cout << " mpOPRF-based PSI (plain): Receiver side takes time "
84
+ << std::chrono::duration<double , std::milli>(running_time).count () << " ms" << std::endl;
44
85
}
45
- std::cout<<count<<std::endl;
46
- std::vector<block> ans;
47
- for (int i=0 ;i<vec_indication_bit.size ();i++){
48
- if ((int )vec_indication_bit[i]==1 ) ans.push_back (vec_Y[i]);
49
- }
50
- // OT
51
- // auto stime = std::chrono::steady_clock::now();
52
- // ALSZOTE::PP p1;
53
- // p1 = ALSZOTE::Setup(128);
54
- // std::cout<<"start execute OT"<<std::endl;
55
- // std::vector<block> ans = ALSZOTE::OnesidedReceive(io, p1, vec_indication_bit, vec_indication_bit.size());
56
- // auto etime = std::chrono::steady_clock::now();
57
- // auto running_time = etime - stime;
58
- // std::cout << "mpOPRF-based PSI: Receiver OT receive time "
59
- // << std::chrono::duration<double, std::milli>(running_time).count() << " ms" << std::endl;
60
- auto end_time = std::chrono::steady_clock::now ();
61
- auto running_time1 = end_time - start_time;
62
- std::cout << " mpOPRF-based PSI: Receiver side takes time "
63
- << std::chrono::duration<double , std::milli>(running_time1).count () << " ms" << std::endl;
64
86
return ans;
65
87
}
66
88
67
89
void Send (NetIO &io, OTEOPRF::PP &pp, std::vector<block> &vec_X) {
68
- if (vec_X.size ()!= pp.LEN ){
90
+ if (vec_X.size () != pp.LEN ) {
69
91
std::cerr << " |X| does not match public parameter" << std::endl;
70
92
exit (1 );
71
93
}
72
94
auto start_time = std::chrono::steady_clock::now ();
73
- std::vector<std::vector<uint8_t >> oprf_key = OTEOPRF::Server (io, pp);
74
- std::vector<std::vector<uint8_t >> oprf_value = OTEOPRF::Evaluate (pp, oprf_key, vec_X, vec_X.size ());
95
+ std::vector<std::vector<uint8_t >> oprf_value = OTEOPRF::Client (io, pp, vec_X, vec_X. size () );
96
+ // std::vector<std::vector<uint8_t>> oprf_value = OTEOPRF::Evaluate(pp, oprf_key, vec_X, vec_X.size());
75
97
std::string choice = " bloom" ;
76
98
if (choice == " bloom" ) {
77
- BloomFilter filter (pp.LEN , 40 );
78
-
99
+ BloomFilter filter (oprf_value.size (), 40 );
79
100
auto bloom_start_time = std::chrono::steady_clock::now ();
80
101
filter.Insert (oprf_value);
81
102
auto bloom_end_time = std::chrono::steady_clock::now ();
82
103
auto running_time1 = bloom_end_time - bloom_start_time;
83
- std::cout << " Receiver execute bloom filter insert time "
104
+ std::cout << " Sender execute bloom filter insert takes time= "
84
105
<< std::chrono::duration<double , std::milli>(running_time1).count () << " ms" << std::endl;
85
106
86
107
size_t filter_size = filter.ObjectSize ();
@@ -90,23 +111,41 @@ namespace OPRFPSI {
90
111
io.SendBytes (buffer, filter_size);
91
112
filter.ReadObject (buffer);
92
113
delete[] buffer;
114
+ std::cout << " mpOPRF-based PSI: Sender ===> BloomFilter(F_k(x_i)) ===> Receiver ["
115
+ << (double ) (oprf_value.size () * pp.LEN ) / (1 << 20 ) << " MB]" << std::endl;
116
+ PrintSplitLine (' -' );
117
+ auto end_time = std::chrono::steady_clock::now ();
118
+ auto running_time = end_time - start_time;
119
+ std::cout << " mpOPRF-based PSI [bloom filter]: Sender side takes time "
120
+ << std::chrono::duration<double , std::milli>(running_time).count () << " ms" << std::endl;
121
+ }
122
+ if (choice == " plain" ) {
123
+
124
+ for (int i = 0 ; i < oprf_value.size (); i++) {
93
125
126
+ std::string str = uintTostring (oprf_value[i]);
127
+ if (i==1 ) std::cout<<str<<std::endl;
128
+ io.SendInteger (str.size ());
129
+ io.SendString (str);
130
+ }
131
+ auto end_time = std::chrono::steady_clock::now ();
132
+ auto running_time = end_time - start_time;
133
+ std::cout << " mpOPRF-based PSI: Sender side takes time "
134
+ << std::chrono::duration<double , std::milli>(running_time).count () << " ms" << std::endl;
94
135
}
95
136
PrintSplitLine (' -' );
96
- // auto stime = std::chrono::steady_clock::now();
97
- // ALSZOTE::PP p1;
98
- // p1 = ALSZOTE::Setup(128);
99
- // std::cout<<"start execute OT"<<std::endl;
100
- // ALSZOTE::OnesidedSend(io, p1, vec_X, vec_X.size());
101
- // auto etime = std::chrono::steady_clock::now();
102
- // auto running_time = etime - stime;
103
- // std::cout << "mpOPRF-based PSI: Sender send OT time "
104
- // << std::chrono::duration<double, std::milli>(running_time).count() << " ms" << std::endl;
105
- auto end_time = std::chrono::steady_clock::now ();
106
- auto running_time1 = end_time - start_time;
107
- std::cout << " mpOPRF-based PSI [bloom filter]: Sender side takes time "
108
- << std::chrono::duration<double , std::milli>(running_time1).count () << " ms" << std::endl;
137
+ /* auto stime = std::chrono::steady_clock::now();
138
+ ALSZOTE::PP p1;
139
+ p1 = ALSZOTE::Setup(128);
140
+ std::cout<<"start execute OT"<<std::endl;
141
+ ALSZOTE::OnesidedSend(io, p1, vec_X, vec_X.size());
142
+ auto etime = std::chrono::steady_clock::now();
143
+ auto running_time = etime - stime;
144
+ std::cout << "mpOPRF-based PSI: Sender send OT time "
145
+ << std::chrono::duration<double, std::milli>(running_time).count() << " ms" << std::endl;*/
146
+
109
147
}
110
148
}
111
149
150
+
112
151
#endif
0 commit comments