50 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import os
 | 
						|
import socket
 | 
						|
 | 
						|
from Crypto.PublicKey import RSA
 | 
						|
from Crypto.Cipher import PKCS1_OAEP
 | 
						|
 | 
						|
 | 
						|
def recv_exact(conn: socket.socket, n: int) -> bytes:
 | 
						|
    buf = b""
 | 
						|
    while len(buf) < n:
 | 
						|
        chunk = conn.recv(n - len(buf))
 | 
						|
        if not chunk:
 | 
						|
            raise ConnectionError("connection closed")
 | 
						|
        buf += chunk
 | 
						|
    return buf
 | 
						|
 | 
						|
 | 
						|
def main() -> None:
 | 
						|
    host = "127.0.0.1"
 | 
						|
    port = 5003
 | 
						|
    default_msg = os.environ.get("LAB6_MESSAGE", "rsa hello")
 | 
						|
    try:
 | 
						|
        user_msg = input(f"Enter plaintext [{default_msg}]: ").strip()
 | 
						|
    except EOFError:
 | 
						|
        user_msg = ""
 | 
						|
    message = (user_msg or default_msg).encode()
 | 
						|
 | 
						|
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as c:
 | 
						|
        c.connect((host, port))
 | 
						|
        # Receive server public key
 | 
						|
        klen = int.from_bytes(recv_exact(c, 4), "big")
 | 
						|
        kbytes = recv_exact(c, klen)
 | 
						|
        server_pub = RSA.import_key(kbytes)
 | 
						|
 | 
						|
        # Encrypt message to server
 | 
						|
        cipher = PKCS1_OAEP.new(server_pub)
 | 
						|
        ctext = cipher.encrypt(message)
 | 
						|
        c.sendall(len(ctext).to_bytes(4, "big") + ctext)
 | 
						|
 | 
						|
        # Receive acknowledgement
 | 
						|
        rlen = int.from_bytes(recv_exact(c, 4), "big")
 | 
						|
        reply = recv_exact(c, rlen)
 | 
						|
        print("server reply:", reply.decode(errors="ignore"))
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 | 
						|
 | 
						|
curl
 | 
						|
 |