Created
April 19, 2019 23:43
-
-
Save marcoonroad/e9339e462755f868500762ffb1287f90 to your computer and use it in GitHub Desktop.
Simple Secret Sharing using XOR operation (OCaml example).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let shuffle list = | |
let cmp _ _ = (Random.int 3) - 1 in | |
List.sort cmp list;; | |
let share ~secret ~length = | |
let rec loop secret length buffer = | |
if length <= 0 then secret :: buffer else | |
let noise = Random.bits () in | |
let piece = secret lxor noise in | |
loop piece (length - 1) (noise :: buffer) | |
in | |
let pieces = loop secret (length - 1) [] in | |
shuffle pieces;; | |
let recover pieces = | |
let op x y = x lxor y in | |
let head = List.hd pieces in | |
let tail = List.tl pieces in | |
List.fold_left op head tail;; | |
let pieces = | |
Random.self_init (); | |
share ~secret:23 ~length:10;; | |
assert (23 = recover pieces);; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
UPDATE:
Full code available here: https://github.com/marcoonroad/shareholders
The shares are encrypted using the checksum (of the secret) as the AES CBC key & IV, then HMAC-alike signed with the digest of this secret checksum.
By encrypting the shares, I can add metadata on them, such as their position
(i, j)
on the random numbers matrix. Such metadata allow me to track missing matrix cells and them brute-force them against the checksum to recover the secret. The implemented redundancy on the library above will help here, 'cause it will reduce the vector space of missing share pieces to brute-force/discover.