Update IS/Lab/Lab4/q1.py
This commit is contained in:
		
							parent
							
								
									8fbddc4e51
								
							
						
					
					
						commit
						00c58d5d17
					
				
					 1 changed files with 26 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -7,40 +7,55 @@ from Crypto.Random import get_random_bytes as rb
 | 
			
		|||
 | 
			
		||||
def gen_role(n):
 | 
			
		||||
    r = RSA.generate(2048)
 | 
			
		||||
    print(f"[keygen] role={n} RSA-2048")
 | 
			
		||||
    return {"name": n, "priv": r.export_key(), "pub": r.publickey().export_key()}
 | 
			
		||||
 | 
			
		||||
def ecdh_key():
 | 
			
		||||
    a, b = ECC.generate(curve="P-256"), ECC.generate(curve="P-256")
 | 
			
		||||
    s = a._multiply(b.pointQ, a.d).x.to_bytes()
 | 
			
		||||
    return SHA256.new(s).digest()
 | 
			
		||||
    s1 = (b.pointQ * a.d).x.to_bytes(32, "big")
 | 
			
		||||
    s2 = (a.pointQ * b.d).x.to_bytes(32, "big")
 | 
			
		||||
    assert s1 == s2
 | 
			
		||||
    k = SHA256.new(s1).digest()
 | 
			
		||||
    print(f"[ecdh] P-256 shared -> AES key {len(k)*8} bits")
 | 
			
		||||
    return k
 | 
			
		||||
 | 
			
		||||
def enc(k, m, aad=b""):
 | 
			
		||||
    n = rb(12); c = AES.new(k, AES.MODE_GCM, nonce=n); c.update(aad)
 | 
			
		||||
    t = c.encrypt_and_digest(m)[1]
 | 
			
		||||
    return n, c.encrypt(b""), t  # ciphertext unused; keeping API tiny
 | 
			
		||||
    ct, t = c.encrypt_and_digest(m)
 | 
			
		||||
    print(f"[enc] nonce={n.hex()} tag={t.hex()}")
 | 
			
		||||
    return n, ct, t
 | 
			
		||||
 | 
			
		||||
def dec(k, n, ct, t, aad=b""):
 | 
			
		||||
    c = AES.new(k, AES.MODE_GCM, nonce=n); c.update(aad)
 | 
			
		||||
    c.decrypt(b""); c.verify(t)
 | 
			
		||||
    pt = c.decrypt_and_verify(ct, t)
 | 
			
		||||
    print(f"[dec] ok len={len(pt)}")
 | 
			
		||||
    return pt
 | 
			
		||||
 | 
			
		||||
def sign(role, msg):
 | 
			
		||||
    h = SHA256.new(msg)
 | 
			
		||||
    return pkcs1_15.new(RSA.import_key(role["priv"])).sign(h)
 | 
			
		||||
    sig = pkcs1_15.new(RSA.import_key(role["priv"])).sign(h)
 | 
			
		||||
    print(f"[sign] by {role['name']} siglen={len(sig)}")
 | 
			
		||||
    return sig
 | 
			
		||||
 | 
			
		||||
def verify(pub, msg, sig):
 | 
			
		||||
    try:
 | 
			
		||||
        pkcs1_15.new(RSA.import_key(pub)).verify(SHA256.new(msg), sig); return True
 | 
			
		||||
    except: return False
 | 
			
		||||
        pkcs1_15.new(RSA.import_key(pub)).verify(SHA256.new(msg), sig)
 | 
			
		||||
        print("[verify] signature OK")
 | 
			
		||||
        return True
 | 
			
		||||
    except:
 | 
			
		||||
        print("[verify] signature FAIL")
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
def demo(s, r, msg):
 | 
			
		||||
    print(f"[demo] {s['name']} -> {r['name']}: {msg}")
 | 
			
		||||
    k = ecdh_key()
 | 
			
		||||
    hdr = f"{s['name']}->{r['name']}".encode()
 | 
			
		||||
    sig = sign(s, hdr)
 | 
			
		||||
    n, ct, t = enc(k, msg.encode(), hdr)
 | 
			
		||||
    assert verify(s["pub"], hdr, sig)
 | 
			
		||||
    dec(k, n, ct, t, hdr)
 | 
			
		||||
    print("OK:", msg)
 | 
			
		||||
    pt = dec(k, n, ct, t, hdr).decode()
 | 
			
		||||
    print(f"[result] {pt}")
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    a, b = gen_role("A"), gen_role("B")
 | 
			
		||||
    demo(a, b, "secret")
 | 
			
		||||
    demo(a, b, "secret message")
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue