Add IS/Lab/Lab4/q1.py
This commit is contained in:
		
							parent
							
								
									4e73ae2382
								
							
						
					
					
						commit
						8fbddc4e51
					
				
					 1 changed files with 46 additions and 0 deletions
				
			
		
							
								
								
									
										46
									
								
								IS/Lab/Lab4/q1.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								IS/Lab/Lab4/q1.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| # mini_demo.py | ||||
| from Crypto.PublicKey import RSA, ECC | ||||
| from Crypto.Hash import SHA256 | ||||
| from Crypto.Cipher import AES | ||||
| from Crypto.Signature import pkcs1_15 | ||||
| from Crypto.Random import get_random_bytes as rb | ||||
| 
 | ||||
| def gen_role(n): | ||||
|     r = RSA.generate(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() | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| 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) | ||||
| 
 | ||||
| def sign(role, msg): | ||||
|     h = SHA256.new(msg) | ||||
|     return pkcs1_15.new(RSA.import_key(role["priv"])).sign(h) | ||||
| 
 | ||||
| def verify(pub, msg, sig): | ||||
|     try: | ||||
|         pkcs1_15.new(RSA.import_key(pub)).verify(SHA256.new(msg), sig); return True | ||||
|     except: return False | ||||
| 
 | ||||
| def demo(s, r, 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) | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     a, b = gen_role("A"), gen_role("B") | ||||
|     demo(a, b, "secret") | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue