Add IS/Lab/Lab4/q2.py
This commit is contained in:
parent
5bdc322a0f
commit
4e73ae2382
1 changed files with 49 additions and 0 deletions
49
IS/Lab/Lab4/q2.py
Normal file
49
IS/Lab/Lab4/q2.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# pip install pycryptodome
|
||||||
|
import time, json
|
||||||
|
from Crypto.Util import number
|
||||||
|
|
||||||
|
log=[]
|
||||||
|
|
||||||
|
def blum_prime(bits): # p ≡ 3 (mod 4)
|
||||||
|
while True:
|
||||||
|
p = number.getPrime(bits)
|
||||||
|
if p % 4 == 3: return p
|
||||||
|
|
||||||
|
def keygen(bits=512, ttl=10):
|
||||||
|
p, q = blum_prime(bits//2), blum_prime(bits//2)
|
||||||
|
k = {"p":p, "q":q, "n":p*q, "exp":time.time()+ttl, "revoked":False}
|
||||||
|
log.append({"t":time.time(), "ev":"KEYGEN", "n":k["n"]}); return k
|
||||||
|
|
||||||
|
def publish(k):
|
||||||
|
log.append({"t":time.time(), "ev":"PUBLISH", "n":k["n"]}); return k["n"]
|
||||||
|
|
||||||
|
def revoke(k):
|
||||||
|
k["revoked"] = True; log.append({"t":time.time(), "ev":"REVOKE"})
|
||||||
|
|
||||||
|
def expired(k): return time.time() > k["exp"]
|
||||||
|
|
||||||
|
def renew(k, ttl=10):
|
||||||
|
revoke(k); k2 = keygen(bits=k["n"].bit_length(), ttl=ttl)
|
||||||
|
log.append({"t":time.time(), "ev":"RENEW"}); return k2
|
||||||
|
|
||||||
|
def enc(m, n): return pow(m, 2, n) # c = m^2 mod n
|
||||||
|
|
||||||
|
def dec(c, k): # return one root via CRT (Rabin has 4 roots)
|
||||||
|
p, q, n = k["p"], k["q"], k["n"]
|
||||||
|
mp, mq = pow(c, (p+1)//4, p), pow(c, (q+1)//4, q)
|
||||||
|
yp, yq = number.inverse(p, q), number.inverse(q, p)
|
||||||
|
return (mp*q*yq + mq*p*yp) % n
|
||||||
|
|
||||||
|
# Demo
|
||||||
|
k = keygen(ttl=2); n = publish(k)
|
||||||
|
m = 123456789
|
||||||
|
c = enc(m, n); m1 = dec(c, k)
|
||||||
|
print("ok:", m == m1)
|
||||||
|
|
||||||
|
time.sleep(2.1) # simulate expiry
|
||||||
|
if expired(k) or k["revoked"]:
|
||||||
|
k = renew(k, ttl=5); n = publish(k)
|
||||||
|
|
||||||
|
c2 = enc(m, n); m2 = dec(c2, k)
|
||||||
|
print("ok2:", m == m2)
|
||||||
|
print(json.dumps(log, indent=2))
|
Loading…
Add table
Add a link
Reference in a new issue