ts is SO ASS

This commit is contained in:
lda committed 2026-03-05 12:31:23 +07:00
1 parent 886ae12241
commit 4511e3444b
1 file changed
+114
+114
View File
@@ -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()