-
Notifications
You must be signed in to change notification settings - Fork 2
/
sample.py
79 lines (66 loc) · 2.78 KB
/
sample.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"""
sample.py: A sample python code to do secret sharing using sss.py
Author: Jun Kurihara <kurihara at ieee.org>
"""
from pysss import rs_sss
from pysss import file_wrapper
import numpy as np
FILE_NAME = './sample_data/rashomon.txt'
FILE_NAME_SHARE_EXT = '.sss'
DEGREE = 8
def main():
# set params
threshold = 3
ramp = 2
num = 5
index_list = [1, 2, 4]
shares = []
# assertion to check if given parameters is appropriate
assert 1 < ramp < threshold
assert threshold < num
assert len(index_list) >= threshold
# read file to numpy array
orig_secret = file_wrapper.get_npbytes_from_file(FILE_NAME)
orig_size = orig_secret.size
np.set_printoptions(formatter={'int': hex})
get_share_name = (lambda idx: FILE_NAME + str(idx) + FILE_NAME_SHARE_EXT)
# share generation
s = rs_sss.RS_SSS(DEGREE)
print("Share generation:")
print("Params: (k, l, n) = ({0}, {1}, {2}) over GF(2^{3})".format(
threshold, ramp, num, DEGREE))
s.initialize(threshold, ramp, num) # initialize with given parameters
print("Secret file: {0}".format(FILE_NAME))
print("Secret: {0}".format(orig_secret))
print("Secret size: {0} bytes".format(int(orig_size * DEGREE / 8)))
s.set_secret(orig_secret) # set the secret into the instance
s.generate_shares() # execute share generation with given parameters and secret
for i in range(num):
print("Share {0}, file = {1}: {2}".format(
i, get_share_name(i), s.get_shares()[i]))
# write shares to files
file_wrapper.get_sharefile_from_npbytes(
get_share_name(i), orig_size, i, s.get_shares()[i])
for i in index_list:
# shares.append(s.get_shares()[i])
shares.append(file_wrapper.get_share_npbytes_from_file(
get_share_name(i))[-1:])
# secret reconstruct
s.__init__(DEGREE) # just remove all instance variables
print("\nSecret reconstruction:")
s.initialize(threshold, ramp, num) # initialize with given parameters
# set given shares in the instance
s.set_external_shares(shares, index_list)
print("Given params: (k, l, n, share indices, original size) = ({0}, {1}, {2}, {3}, {4}) over GF(2^{5})"
.format(threshold, ramp, num, index_list, orig_size, DEGREE))
for i, j in zip(index_list, shares):
print("Given share {0}: {1}".format(i, j))
# execute secret reconstruction with given shares under given parameter setting
s.reconstruct_secret(orig_size)
reco_secret = s.get_secret()
print("Reconstructed secret: {0}".format(reco_secret))
# check if the original secret coincides with the reconstructed one
print("Original secret == Reconstructed secret ?: {0}".format(
np.allclose(orig_secret, reco_secret)))
if __name__ == '__main__':
main()