def split(self, secret, deterministic=True): if secret >= self.P: raise ValueError("secret must be smaller than P") prng = Prng(deterministic=deterministic) prng.addEntropy(secret.to_bytes(512, byteorder="big")) a = [0] * self.k a[0] = secret for i in range(1, self.k): a[i] = prng.getRandomLong(512) % self.P x = [] for i in range(self.n): while True: r = int(prng.getRandomLong(16)) if r != 0 and r not in x: x += [r] break y = [0] * self.n for i in range(self.n): y[i] = Shamir.fPoly(x[i], a, self.P) shares = [] for i in range(self.n): shares += [(x[i], y[i])] return shares
def test_deterministic_Prng_2_1(self): prng = Prng(deterministic=True) value = prng.getRandomLong(32) expected = 3563776190 self.assertEqual( value, expected, "Prng not deterministic (expected: %d, got: %d)" % (expected, value))
def test_deterministic_Prng_2_2(self): prng = Prng(deterministic=True) prng.addEntropy(b"entropy") value = prng.getRandomLong(32) expected = 1783747816 self.assertEqual( value, expected, "Prng not deterministic (expected: %d, got: %d)" % (expected, value))
def encode(self, share): prng = Prng(deterministic=self.deterministic) prng.addEntropy(share[0].to_bytes(512, byteorder="big") + share[1].to_bytes(512, byteorder="big")) result = b"" result += bytes([prng.getRandomLong(8) & 0xF0 | self.version]) result += bytes([prng.getRandomLong(8) & 0xF0 | self.k]) result += rawFromLong(share[0], 16) result += rawFromLong(share[1], self.width) return result
Use 5 D6 dice, loaded or not. After each roll of all dice: - Put the dice in line without looking at them - Starting from the right, remove any dice which have the same value as those on their left - Roll the removed dice again - Repeat until all dice have different values - Enter the result and press return eg: 5 1 2 1 5 : first throw 5 1 2 : remove 1 5 on the right 5 1 2 4 2 : second throw 5 1 2 4 : remove 2 on the right 5 1 2 4 6 : Ok! Enter 51246 """) de = DiceEntropy() prng = Prng() while True: print("roll: ") roll = sys.stdin.readline() de.addRoll(roll) (dice_result, length) = de.getResult() rand_value = prng.getRandomLong(length) result = rand_value ^ dice_result # print("rv={:x}".format(rand_value)) print("{} rolls, {} bits: {:x}".format(de.count_rolls, length, result))