forked from akalin/cryptopals-python3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
challenge40.py
48 lines (37 loc) · 1.01 KB
/
challenge40.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
import challenge39
import binascii
import math
(pub0, priv0) = challenge39.genKey(256)
(pub1, priv1) = challenge39.genKey(256)
(pub2, priv2) = challenge39.genKey(256)
plaintext = b'This is a plaintext string'
plainnum = challenge39.bytestonum(plaintext)
c0 = challenge39.encryptnum(pub0, plainnum)
c1 = challenge39.encryptnum(pub1, plainnum)
c2 = challenge39.encryptnum(pub2, plainnum)
n0 = pub0[1]
n1 = pub1[1]
n2 = pub2[1]
ms0 = n1 * n2
ms1 = n0 * n2
ms2 = n0 * n1
N = n0 * n1 * n2
r0 = (c0 * ms0 * challenge39.invmod(ms0, n0))
r1 = (c1 * ms1 * challenge39.invmod(ms1, n1))
r2 = (c2 * ms2 * challenge39.invmod(ms2, n2))
r = (r0 + r1 + r2) % N
def floorRoot(n, s):
b = n.bit_length()
p = math.ceil(b/s)
x = 2**p
while x > 1:
y = (((s - 1) * x) + (n // (x**(s-1)))) // s
if y >= x:
return x
x = y
return 1
if __name__ == '__main__':
m = floorRoot(r, 3)
mstr = challenge39.numtobytes(m)
if mstr != plaintext:
raise Exception(mstr + b' != ' + plaintext)