secretsharing 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +3 -0
- data/lib/secretsharing/shamir.rb +18 -5
- data/test/test_shamir.rb +11 -0
- metadata +16 -5
data/README
CHANGED
data/lib/secretsharing/shamir.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'openssl'
|
2
2
|
require 'digest/sha1'
|
3
|
+
require 'base64'
|
3
4
|
|
4
5
|
module SecretSharing
|
5
6
|
# The SecretSharing::Shamir class can be used to share random
|
@@ -67,6 +68,14 @@ module SecretSharing
|
|
67
68
|
@secret
|
68
69
|
end
|
69
70
|
|
71
|
+
# The secret in a password representation (Base64-encoded)
|
72
|
+
def secret_password
|
73
|
+
if ! secret_set? then
|
74
|
+
raise "Secret not (yet) set."
|
75
|
+
end
|
76
|
+
Base64.encode64([@secret.to_s(16)].pack('h*')).split("\n").join
|
77
|
+
end
|
78
|
+
|
70
79
|
# Add a secret share to the object. Accepts either a SecretSharing::Shamir::Share
|
71
80
|
# instance or a string representing one. Returns true if enough shares have
|
72
81
|
# been added to recover the secret, false otherweise.
|
@@ -170,11 +179,13 @@ module SecretSharing
|
|
170
179
|
def recover_secret
|
171
180
|
@secret = OpenSSL::BN.new('0')
|
172
181
|
@received_shares.each do |share|
|
173
|
-
|
182
|
+
l_x = l(share.x, @received_shares)
|
183
|
+
summand = share.y * l_x
|
174
184
|
summand %= share.prime
|
175
185
|
@secret += summand
|
176
186
|
@secret %= share.prime
|
177
187
|
end
|
188
|
+
@secret
|
178
189
|
end
|
179
190
|
|
180
191
|
# Part of the Lagrange interpolation.
|
@@ -183,10 +194,12 @@ module SecretSharing
|
|
183
194
|
# for more information compare Wikipedia:
|
184
195
|
# http://en.wikipedia.org/wiki/Lagrange_form
|
185
196
|
def l(x, shares)
|
186
|
-
shares.select { |s| s.x != x }.map do |s|
|
187
|
-
OpenSSL::BN.new((-s.x).to_s)
|
188
|
-
OpenSSL::BN.new((x - s.x).to_s)
|
189
|
-
|
197
|
+
(shares.select { |s| s.x != x }.map do |s|
|
198
|
+
minus_xi = OpenSSL::BN.new((-s.x).to_s)
|
199
|
+
one_over_xj_minus_xi = OpenSSL::BN.new((x - s.x).to_s) \
|
200
|
+
.mod_inverse(shares[0].prime)
|
201
|
+
minus_xi.mod_mul(one_over_xj_minus_xi, shares[0].prime)
|
202
|
+
end.inject { |p, f| p.mod_mul(f, shares[0].prime) })
|
190
203
|
end
|
191
204
|
end
|
192
205
|
|
data/test/test_shamir.rb
CHANGED
@@ -59,6 +59,17 @@ class TestShamir < Test::Unit::TestCase
|
|
59
59
|
assert_equal(s.secret, s2.secret)
|
60
60
|
end
|
61
61
|
|
62
|
+
def test_recover_secret_k_eq_n_strings
|
63
|
+
s = SecretSharing::Shamir.new(2)
|
64
|
+
s.create_random_secret()
|
65
|
+
|
66
|
+
s2 = SecretSharing::Shamir.new(2)
|
67
|
+
s2 << s.shares[0].to_s
|
68
|
+
s2 << s.shares[1].to_s
|
69
|
+
|
70
|
+
assert_equal(s.secret, s2.secret)
|
71
|
+
end
|
72
|
+
|
62
73
|
def test_recover_secret_k_le_n
|
63
74
|
s = SecretSharing::Shamir.new(5, 3)
|
64
75
|
s.create_random_secret()
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: secretsharing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 15
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Alexander Klink
|
@@ -9,7 +14,7 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-09-
|
17
|
+
date: 2010-09-26 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies: []
|
15
20
|
|
@@ -41,21 +46,27 @@ rdoc_options: []
|
|
41
46
|
require_paths:
|
42
47
|
- lib
|
43
48
|
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ">="
|
46
52
|
- !ruby/object:Gem::Version
|
53
|
+
hash: 3
|
54
|
+
segments:
|
55
|
+
- 0
|
47
56
|
version: "0"
|
48
|
-
version:
|
49
57
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
50
59
|
requirements:
|
51
60
|
- - ">="
|
52
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 3
|
63
|
+
segments:
|
64
|
+
- 0
|
53
65
|
version: "0"
|
54
|
-
version:
|
55
66
|
requirements: []
|
56
67
|
|
57
68
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.3.
|
69
|
+
rubygems_version: 1.3.7
|
59
70
|
signing_key:
|
60
71
|
specification_version: 3
|
61
72
|
summary: A library to share secrets in an information-theoretically secure way.
|