From 38b72793ade642f0118b6d0e763aafb5a88073c9 Mon Sep 17 00:00:00 2001 From: Trance-0 Date: Mon, 16 Feb 2026 12:26:36 -0600 Subject: [PATCH] init --- .env | 6 + .gitignore | 9 ++ CSE433S_HW2_net_block_cipher.pdf | Bin 0 -> 111532 bytes client-log.sh | 1 + client.cpp | 192 +++++++++++++++++++++++++++++ compile.sh | 30 +++++ docker-compose.yml | 38 ++++++ latex/H2_CSE4303_ZheyuanWu.out | 0 latex/H2_CSE4303_ZheyuanWu.pdf | Bin 0 -> 53507 bytes latex/H2_CSE4303_ZheyuanWu.tex | 148 +++++++++++++++++++++++ message.txt | 1 + server-log.sh | 1 + server.cpp | 200 +++++++++++++++++++++++++++++++ 13 files changed, 626 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 CSE433S_HW2_net_block_cipher.pdf create mode 100644 client-log.sh create mode 100644 client.cpp create mode 100755 compile.sh create mode 100644 docker-compose.yml create mode 100644 latex/H2_CSE4303_ZheyuanWu.out create mode 100644 latex/H2_CSE4303_ZheyuanWu.pdf create mode 100644 latex/H2_CSE4303_ZheyuanWu.tex create mode 100644 message.txt create mode 100644 server-log.sh create mode 100644 server.cpp diff --git a/.env b/.env new file mode 100644 index 0000000..9b8a2ff --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +NET_SUBNET=172.30.0.0/24 +SERVER_IP=172.30.0.10 +CLIENT_IP=172.30.0.11 +SERVER_PORT=3030 +INITIAL_VECTOR=EA514659DC556DEECFFA5FD061363642 +SECRET_KEY=0214BA9480AE8D21842B80FF5287418FD0465113070FDFF8263F0F1FCD6CF030 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ddd9f5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# latex garbages +*.aux +*.fdb_latexmk +*.fls +*.log +*.synctex.gz + +# vscode garbage +.vscode \ No newline at end of file diff --git a/CSE433S_HW2_net_block_cipher.pdf b/CSE433S_HW2_net_block_cipher.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4208d1d38f6d10680298b086a8ca78491dac0199 GIT binary patch literal 111532 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�`LSv_m^% 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 +#include +#include +#include + +// open ssl +#include +#include +#include + +#include // error handling +#include // for close() + +// load environment variables from .env file +#include +#include + +void load_env(const std::string& path) { + std::ifstream f(path); + std::string line; + while (std::getline(f, line)) { + if (line.empty() || line[0] == '#') continue; + auto pos = line.find('='); + if (pos == std::string::npos) continue; + + std::string key = line.substr(0, pos); + std::string val = line.substr(pos + 1); + + #ifdef _WIN32 + _putenv_s(key.c_str(), val.c_str()); + #else + setenv(key.c_str(), val.c_str(), 1); + #endif + } +} + +// hex to byte helper function +int hex_to_bytes_upper(const char* hex, unsigned char* out, size_t out_size) +{ + size_t i = 0; + while (hex[0] && hex[1]) { + if (i >= out_size) return -1; + unsigned char h = hex[0]; + unsigned char l = hex[1]; + int hi = (h <= '9') ? (h - '0') : (h - 'A' + 10); + int lo = (l <= '9') ? (l - '0') : (l - 'A' + 10); + // minimal sanity check + if (hi < 0 || hi > 15 || lo < 0 || lo > 15) + return -1; + out[i++] = (unsigned char)((hi << 4) | lo); + hex += 2; + } + return (int)i; +} + +// block cipher encryption function +int block_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { + /* Declare cipher context */ + EVP_CIPHER_CTX *ctx; + + int len, ciphertext_len; + + /* Create and initialise the context */ + ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + ERR_print_errors_fp(stderr); + } + + /* Initialise the encryption operation. */ + // choice for aes_256 ref: https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb + if (EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) != 1){ + ERR_print_errors_fp(stderr); + } + + /* Provide the message to be encrypted, and obtain the encrypted output. EVP_EncryptUpdate can be called multiple times if necessary */ + if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) != 1) { + ERR_print_errors_fp(stderr); + } + + /* Finalize the encryption. Further cipher text bytes may be written at this stage. */ + if (EVP_EncryptFinal_ex(ctx, ciphertext + len, &ciphertext_len) != 1) { + ERR_print_errors_fp(stderr); + } + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + return ciphertext_len; +} + +int main(void){ + load_env(".env"); + // Declare variables + const char *server_ip = std::getenv("SERVER_IP"); + const int server_port = std::atoi(std::getenv("SERVER_PORT")); + printf("Connecting to server %s:%d\n", server_ip, server_port); + + char client_message[1024]; + char server_message[1024]; + const char * custom_message="Zheyuan Wu: "; + + // encryption parameters + const char *inital_vector = std::getenv("INITIAL_VECTOR"); + const char *secret_key = std::getenv("SECRET_KEY"); + unsigned char key_bytes[32], iv_bytes[16]; + + int key_len = hex_to_bytes_upper(secret_key, key_bytes, sizeof(key_bytes)); + int iv_len = hex_to_bytes_upper(inital_vector, iv_bytes, sizeof(iv_bytes)); + + if (key_len != 32 || iv_len != 16) { + fprintf(stderr, "Invalid key/IV size for AES-256\n"); + return 1; + } + + // Create socket: + int client_socket = socket(AF_INET, SOCK_STREAM, 0); + if (client_socket == -1) { + perror("Failed to create socket"); + return 1; + }else{ + printf("Socket created successfully\n"); + } + + // Send connection request to server, be sure to set por tand IP the same as server-side + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(server_port); + inet_pton(AF_INET, server_ip, &server_addr.sin_addr); + + if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { + perror("Failed to connect to server"); + close(client_socket); + return 1; + }else{ + printf("Connected to server successfully\n"); + } + + // Get input from the user: + printf("Enter message sent to the server (type \\quit to exit): "); + // clean the buffer + memset(client_message, 0, sizeof(client_message)); + if (fgets(client_message, sizeof(client_message), stdin) == NULL) { + // EOF or error reading from stdin, exit the loop + perror("Error reading from stdin"); + return 1; + } + + while (strcmp(client_message, "\\quit\n") != 0) { + + // Send the message to server: + // add my name in the front + char buffer[2048]; + std::snprintf(buffer, sizeof(buffer), "%s%s", custom_message, client_message); + + unsigned char ciphertext[2048]; + + int plaintext_len = (int)strlen(buffer); + int ciphertext_len = stream_encrypt((unsigned char*)buffer, plaintext_len, key_bytes, iv_bytes, ciphertext); + if (ciphertext_len <= 0) { + printf("encrypt failed or produced empty ciphertext_len=%d\n", ciphertext_len); + break; + } + + ssize_t sent = send(client_socket, ciphertext, (size_t)ciphertext_len, 0); + if (sent <= 0) { perror("No message sent to server"); break; } + + // Receive the server's response: + // add terminator for string + ssize_t recvd = recv(client_socket, server_message, sizeof(server_message) - 1, 0); + if (recvd <= 0) { perror("No message received from server"); break; } + server_message[recvd] = '\0'; + + printf("Server's response: %s\n", server_message); + + printf("Enter message sent to the server (type \\quit to exit): "); + + // clean the buffer + memset(client_message, 0, sizeof(client_message)); + memset(server_message, 0, sizeof(server_message)); + + if (fgets(client_message, sizeof(client_message), stdin) == NULL) { + // EOF or error reading from stdin, exit the loop + perror("Error reading from stdin"); + break; + } + } + + // Close the socket + close(client_socket); + + return 0; +} \ No newline at end of file diff --git a/compile.sh b/compile.sh new file mode 100755 index 0000000..f314800 --- /dev/null +++ b/compile.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +mkdir -p bin + +# add libssl-dev if needed + +# apt-get update && apt-get install -y --no-install-recommends libssl-dev + +# Adjust flags as you like +CXXFLAGS="-std=c++17 -O2 -Wall -Wextra -pedantic" +OPENSSL_LIBS="-lssl -lcrypto" + +g++ ${CXXFLAGS} server.cpp -o bin/server ${OPENSSL_LIBS} +g++ ${CXXFLAGS} client.cpp -o bin/client ${OPENSSL_LIBS} + +echo "Built:" +file bin/server bin/client || true + +chmod a+x bin/server bin/client + +# stop the containers and free up network resources +docker compose down --remove-orphans || true +docker network rm net-hw2 >/dev/null 2>&1 || true + +# start the containers +docker compose up -d server +docker compose run --rm -it client + +echo "Done." \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3733727 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +services: + server: + image: debian:bookworm-slim + container_name: hw2-server + working_dir: /app + env_file: + - .env + networks: + net-hw2: + ipv4_address: ${SERVER_IP} + volumes: + - ./bin/server:/usr/local/bin/server:ro + entrypoint: ["bash", "-lc", "apt-get update && apt-get install -y --no-install-recommends libstdc++6 iproute2 libssl-dev; exec stdbuf -oL -eL /usr/local/bin/server"] + + client: + image: debian:bookworm-slim + container_name: hw2-client + working_dir: /app + env_file: + - .env + networks: + net-hw2: + ipv4_address: ${CLIENT_IP} + depends_on: + - server + stdin_open: true + tty: true + volumes: + - ./bin/client:/usr/local/bin/client:ro + entrypoint: ["bash", "-lc", "apt-get update && apt-get install -y --no-install-recommends libstdc++6 iproute2 libssl-dev; exec stdbuf -oL -eL /usr/local/bin/client"] + +networks: + net-hw2: + name: net-hw2 + driver: bridge + ipam: + config: + - subnet: ${NET_SUBNET} diff --git a/latex/H2_CSE4303_ZheyuanWu.out b/latex/H2_CSE4303_ZheyuanWu.out new file mode 100644 index 0000000..e69de29 diff --git a/latex/H2_CSE4303_ZheyuanWu.pdf b/latex/H2_CSE4303_ZheyuanWu.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef0ec65c204ac2411ba433be031efe722336769d GIT binary patch literal 53507 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 +#include +#include +#include + +// open ssl +#include +#include +#include + +#include // for perror() +#include // for close() + +// load environment variables from .env file +#include +#include + +void load_env(const std::string& path) { + std::ifstream f(path); + std::string line; + while (std::getline(f, line)) { + if (line.empty() || line[0] == '#') continue; + auto pos = line.find('='); + if (pos == std::string::npos) continue; + + std::string key = line.substr(0, pos); + std::string val = line.substr(pos + 1); + + #ifdef _WIN32 + _putenv_s(key.c_str(), val.c_str()); + #else + setenv(key.c_str(), val.c_str(), 1); + #endif + } +} + +// hex to byte helper function +int hex_to_bytes_upper(const char* hex, unsigned char* out, size_t out_size) +{ + size_t i = 0; + while (hex[0] && hex[1]) { + if (i >= out_size) return -1; + unsigned char h = hex[0]; + unsigned char l = hex[1]; + int hi = (h <= '9') ? (h - '0') : (h - 'A' + 10); + int lo = (l <= '9') ? (l - '0') : (l - 'A' + 10); + // minimal sanity check + if (hi < 0 || hi > 15 || lo < 0 || lo > 15) + return -1; + out[i++] = (unsigned char)((hi << 4) | lo); + hex += 2; + } + return (int)i; +} + +// Define the decryption function +int block_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { + /* Declare cipher context */ + EVP_CIPHER_CTX *ctx; + int len, plaintext_len; + + /* Create and initialise the context */ + ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + ERR_print_errors_fp(stderr); + } + + /* Initialise the decryption operation. */ + if (EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) != 1){ + ERR_print_errors_fp(stderr); + } + + /* Provide the message to be decrypted, and obtain the plaintext output. EVP_DecryptUpdate can be called multiple times if necessary */ + if (EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len) != 1) { + ERR_print_errors_fp(stderr); + } + + /* Finalize the decryption. Further plaintext bytes may be written at this stage. */ + if (EVP_DecryptFinal_ex(ctx, plaintext + len, &plaintext_len) != 1) { + ERR_print_errors_fp(stderr); + } + + /* Clean up */ + EVP_CIPHER_CTX_free(ctx); + + return plaintext_len; +} + +int main(void){ + printf("Server starting...\n"); + load_env(".env"); + + // Declare variables + const char *server_ip = std::getenv("SERVER_IP"); + const int server_port = std::atoi(std::getenv("SERVER_PORT")); + char client_message[2048]; + char server_message[2048]; + const char * custom_message="Server: Hello from server, message recieved!\n"; + + // decryption parameters + const char *inital_vector = std::getenv("INITIAL_VECTOR"); + const char *secret_key = std::getenv("SECRET_KEY"); + unsigned char key_bytes[32], iv_bytes[16]; + + int key_len = hex_to_bytes_upper(secret_key, key_bytes, sizeof(key_bytes)); + int iv_len = hex_to_bytes_upper(inital_vector, iv_bytes, sizeof(iv_bytes)); + + if (key_len != 32 || iv_len != 16) { + fprintf(stderr, "Invalid key/IV size for AES-256\n"); + return 1; + } + + // debug + printf("Server starting at IP: %s, Port: %d\n", server_ip, server_port); + + // Create socket + const int server_socket = socket(AF_INET, SOCK_STREAM, 0); + if (server_socket == -1) { + perror("Failed to create socket"); + return 1; + } + + // Bind to the set port and IP + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(server_port); + inet_pton(AF_INET, server_ip, &server_addr.sin_addr); + + if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { + perror("Failed to bind socket"); + close(server_socket); + return 1; + } + printf("Done with binding with IP: %s, Port: %d\n", server_ip, server_port); + + // Listen for clients: + const char *client_ip = std::getenv("CLIENT_IP"); + if (listen(server_socket, 1) == -1) { + perror("Failed to listen on socket"); + close(server_socket); + return 1; + } + printf("Listening for incoming connections...\n"); + + // Accept an incoming connection + struct sockaddr_in client_addr; + socklen_t client_addr_len = sizeof(client_addr); + int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); + if (client_socket == -1) { + perror("Failed to accept connection"); + close(server_socket); + return 1; + } + printf("Client connected at IP: %s \n", client_ip); + + // clean exising buffer + memset(client_message, 0, sizeof(client_message)); + + // Receive client's message + while (1) { + // clean exising buffer + memset(client_message, 0, sizeof(client_message)); + + ssize_t n = recv(client_socket, client_message, sizeof(client_message), 0); + if (n == 0) break; + if (n < 0) { perror("recv"); break; } + + // decrypt client message + unsigned char plaintext[2048]; + int plaintext_len = stream_decrypt((unsigned char*)client_message, (int)n, key_bytes, iv_bytes, plaintext); + if (plaintext_len < 0) { + fprintf(stderr, "decrypt failed\n"); + break; + } + + if (plaintext_len >= (int)sizeof(plaintext)) plaintext_len = (int)sizeof(plaintext) - 1; + plaintext[plaintext_len] = '\0'; + + if (strcmp((char*)plaintext, "\\exit\n") == 0) break; + + printf("Msg from client: %s", plaintext); + + // Respond to client + // prepare server message + memcpy(server_message, custom_message, strlen(custom_message)); + + size_t reply_len = strlen(server_message); + if (send(client_socket, server_message, reply_len, 0) == -1) { + perror("Send failed"); + break; + } + + printf("Response sent to client: %s\n", server_message); + } + // Close the socket + close(client_socket); + close(server_socket); + + return 0; +} \ No newline at end of file