ts is SO ASS
This commit is contained in:
1 parent
886ae12241
commit
4511e3444b
1 file changed
+114
@@ -0,0 +1,114 @@
|
||||
from math import gcd
|
||||
|
||||
|
||||
def ex1(x):
|
||||
table = [
|
||||
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
|
||||
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
|
||||
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
|
||||
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13],
|
||||
]
|
||||
r = ((x & 0b100000) >> 4) | (x & 1)
|
||||
c = (x & 0b11110) >> 1
|
||||
return r, c, table[r][c]
|
||||
|
||||
|
||||
def ex2p1():
|
||||
# 1a
|
||||
p, q = 139, 227
|
||||
potential_e = {122, 123, 124, 125}
|
||||
e = next(e for e in potential_e if gcd(e, (p - 1) * (q - 1)) == 1)
|
||||
# 1b
|
||||
d = pow(e, -1, (p - 1) * (q - 1))
|
||||
print(f"{e = }, {d = }")
|
||||
return p * q, e, d
|
||||
|
||||
|
||||
def ex2p2_pre():
|
||||
p_ca = 997
|
||||
alpha = 6
|
||||
d_ca = 25
|
||||
|
||||
beta = pow(alpha, d_ca, p_ca)
|
||||
return (p_ca, alpha, beta), d_ca
|
||||
|
||||
|
||||
def elgamal_generate(x, k_E, p_ca, alpha, d_ca):
|
||||
beta = pow(alpha, d_ca, p_ca)
|
||||
r = pow(alpha, k_E, p_ca)
|
||||
kei = pow(k_E, -1, p_ca - 1) # mod p - 1
|
||||
uhh = (x - d_ca * r) % (p_ca - 1)
|
||||
print(f"{x = }, {d_ca = }, {beta = }, {r = }, {uhh = }, {kei = }")
|
||||
s = (uhh * kei) % (p_ca - 1)
|
||||
return (r, s)
|
||||
|
||||
|
||||
def elgamal_verify(x, r, s, p_ca, alpha, beta):
|
||||
br = pow(beta, r, p_ca)
|
||||
rs = pow(r, s, p_ca)
|
||||
t = (br * rs) % p_ca
|
||||
ax = pow(alpha, x, p_ca)
|
||||
print(f"{br = }, {rs = }, {t = }, {ax = }")
|
||||
return (t - ax) % p_ca == 0, t
|
||||
|
||||
|
||||
def ex2p2(x):
|
||||
(p_ca, alpha, beta), d_ca = ex2p2_pre()
|
||||
_, e, _ = ex2p1()
|
||||
k_E = 185
|
||||
(r, s) = elgamal_generate(x + e, k_E, p_ca, alpha, d_ca)
|
||||
v, t = elgamal_verify(x + e, r, s, p_ca, alpha, beta)
|
||||
assert v, f"{t = }"
|
||||
return x + e, (r, s)
|
||||
|
||||
|
||||
def rsa_encrypt(M, e, n):
|
||||
return pow(M, e, n)
|
||||
|
||||
|
||||
def ex2p3():
|
||||
M = 20260
|
||||
N, e, _ = ex2p1()
|
||||
C = rsa_encrypt(M, e, N)
|
||||
return M, C
|
||||
|
||||
|
||||
def ex3():
|
||||
M = 20260
|
||||
l = (M + 64) % 512
|
||||
p = 512 - l
|
||||
return l, p, M
|
||||
|
||||
|
||||
def key(p, g, k):
|
||||
"g could be an existing key or the generator."
|
||||
return pow(g, k, p)
|
||||
|
||||
|
||||
def ex4():
|
||||
p = 27361
|
||||
k_a, k_b = ex2p3()
|
||||
g = 6
|
||||
# public
|
||||
ka = key(p, g, k_a)
|
||||
kb = key(p, g, k_b)
|
||||
# exchange
|
||||
kab = key(p, kb, k_a)
|
||||
kab2 = key(p, ka, k_b)
|
||||
assert kab == kab2
|
||||
return p, g, (k_a, k_b), (ka, kb), kab
|
||||
|
||||
|
||||
def main():
|
||||
x = 21
|
||||
print(ex1(x))
|
||||
print(ex2p1())
|
||||
print(ex2p2_pre())
|
||||
print(ex2p2(x))
|
||||
print(ex2p3())
|
||||
print(ex3())
|
||||
print(ex4())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user