From 1cae5a78d7f42d47045230e91725ab8a9882fe5c Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 22 Mar 2025 11:05:08 +0000 Subject: [PATCH] [CT437]: Assignment 2 Part 2 code --- .../assignments/assignment2/code/3des_plot.py | 42 +++++++ .../assignment2/code/3des_results.tsv | 5 + .../assignment2/code/benchmark_3des | Bin 0 -> 16552 bytes .../assignment2/code/benchmark_3des.c | 107 ++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 year4/semester2/CT437/assignments/assignment2/code/3des_plot.py create mode 100644 year4/semester2/CT437/assignments/assignment2/code/3des_results.tsv create mode 100755 year4/semester2/CT437/assignments/assignment2/code/benchmark_3des create mode 100644 year4/semester2/CT437/assignments/assignment2/code/benchmark_3des.c diff --git a/year4/semester2/CT437/assignments/assignment2/code/3des_plot.py b/year4/semester2/CT437/assignments/assignment2/code/3des_plot.py new file mode 100644 index 00000000..07d188ea --- /dev/null +++ b/year4/semester2/CT437/assignments/assignment2/code/3des_plot.py @@ -0,0 +1,42 @@ +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + +plt.style.use('seaborn-v0_8-muted') + +# Load data +file_path = "3des_results.tsv" # Update if using .csv or another name +df = pd.read_csv(file_path, sep='\t') + +# Add a new label for combined grouping +df["Label"] = df.apply(lambda row: f"{row['Cipher']}, {row['Key Size']}b, {row['Mode']}, {row['Data Size (MB)']}MB", axis=1) + +# Sort to keep logical order +df = df.sort_values(by=["Cipher", "Key Size", "Mode", "Data Size (MB)"]) + +# Prepare data for plotting +labels = df["Label"] +x = np.arange(len(labels)) # label positions +width = 0.35 # width of the bars + +color_encrypt = "#AEC6CF" # Pastel blue +color_decrypt = "#F4C2C2" # Pastel red + +# Create the bar chart +fig, ax = plt.subplots(figsize=(14, 6)) +ax.bar(x - width/2, df["Encryption Time (s)"], width, label="Encryption Time", color=color_encrypt) +ax.bar(x + width/2, df["Decryption Time (s)"], width, label="Decryption Time", color=color_decrypt) + +# Labels and styling +ax.set_xlabel("Cipher, Key Size, Mode, Data Size") +ax.set_ylabel("CPU Time (s)") +ax.set_title("Encryption & Decryption Times for All Ciphers (100MB & 1000MB)") +ax.set_xticks(x) +ax.set_xticklabels(labels) +ax.legend() +ax.grid(True, axis='y', linestyle='--', alpha=0.5) + +# Save plot +plt.tight_layout() +plt.savefig("../latex/images/3des.png", dpi=300) +plt.close() diff --git a/year4/semester2/CT437/assignments/assignment2/code/3des_results.tsv b/year4/semester2/CT437/assignments/assignment2/code/3des_results.tsv new file mode 100644 index 00000000..5583b9fc --- /dev/null +++ b/year4/semester2/CT437/assignments/assignment2/code/3des_results.tsv @@ -0,0 +1,5 @@ +Cipher Key Size Mode Data Size (MB) Encryption Time (s) Decryption Time (s) +TripleDES 192 ECB 100 2.998375 2.924084 +TripleDES 192 CBC 100 3.049974 3.044817 +TripleDES 192 ECB 1000 30.411056 30.296341 +TripleDES 192 CBC 1000 31.411292 30.818811 diff --git a/year4/semester2/CT437/assignments/assignment2/code/benchmark_3des b/year4/semester2/CT437/assignments/assignment2/code/benchmark_3des new file mode 100755 index 0000000000000000000000000000000000000000..2b7f45b50f5d3ec9103bff1fcf39e87a9eac5731 GIT binary patch literal 16552 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 X`(;^L-n&F((`^To#O*Ex7c2e~MHBC( literal 0 HcmV?d00001 diff --git a/year4/semester2/CT437/assignments/assignment2/code/benchmark_3des.c b/year4/semester2/CT437/assignments/assignment2/code/benchmark_3des.c new file mode 100644 index 00000000..7cdf4ba8 --- /dev/null +++ b/year4/semester2/CT437/assignments/assignment2/code/benchmark_3des.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include + +#define DATA_SIZE_100MB (100 * 1024 * 1024) +#define DATA_SIZE_1000MB (1000 * 1024 * 1024) +#define RESULTS_FILE_3DES "3des_results.tsv" + +// Utility to measure CPU time +double get_cpu_time() { + struct rusage usage; + getrusage(RUSAGE_SELF, &usage); + return (double) usage.ru_utime.tv_sec + (double) usage.ru_utime.tv_usec / 1e6; +} + +// Encrypt or decrypt data using a given EVP_CIPHER +int encrypt_decrypt(const EVP_CIPHER *cipher, unsigned char *key, unsigned char *iv, + unsigned char *input, unsigned char *output, int encrypt, int data_size) { + EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + fprintf(stderr, "Failed to create cipher context\n"); + return -1; + } + + int len, outlen; + if (encrypt) + EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv); + else + EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv); + + EVP_CipherUpdate(ctx, output, &len, input, data_size); + outlen = len; + + EVP_CipherFinal_ex(ctx, output + len, &len); + outlen += len; + + EVP_CIPHER_CTX_free(ctx); + return outlen; +} + +void benchmark_3des_mode(const EVP_CIPHER *cipher, const char *mode, int data_size) { + unsigned char key[24] = {0}; // 3DES uses 192 bits = 24 bytes key + unsigned char iv[8] = {0}; // 3DES block size = 64 bits = 8 bytes + unsigned char *input = malloc(data_size); + unsigned char *output = malloc(data_size); + + if (!input || !output) { + fprintf(stderr, "Memory allocation failed\n"); + free(input); + free(output); + return; + } + + memset(input, 'A', data_size); + + double start, end; + + // Encryption + start = get_cpu_time(); + encrypt_decrypt(cipher, key, iv, input, output, 1, data_size); + end = get_cpu_time(); + double enc_time = end - start; + + // Decryption + start = get_cpu_time(); + encrypt_decrypt(cipher, key, iv, output, input, 0, data_size); + end = get_cpu_time(); + double dec_time = end - start; + + // Write to results file + FILE *file = fopen(RESULTS_FILE_3DES, "a"); + if (!file) { + fprintf(stderr, "Failed to write to %s\n", RESULTS_FILE_3DES); + free(input); + free(output); + return; + } + + fprintf(file, "TripleDES\t192\t%s\t%d\t%.6f\t%.6f\n", mode, data_size / (1024 * 1024), enc_time, dec_time); + fclose(file); + + free(input); + free(output); +} + +int main() { + FILE *file = fopen(RESULTS_FILE_3DES, "w"); + if (!file) { + fprintf(stderr, "Failed to create file %s\n", RESULTS_FILE_3DES); + return 1; + } + fprintf(file, "Cipher\tKey Size\tMode\tData Size (MB)\tEncryption Time (s)\tDecryption Time (s)\n"); + fclose(file); + + int data_sizes[] = {DATA_SIZE_100MB, DATA_SIZE_1000MB}; + + for (int i = 0; i < 2; i++) { + benchmark_3des_mode(EVP_des_ede3_ecb(), "ECB", data_sizes[i]); + benchmark_3des_mode(EVP_des_ede3_cbc(), "CBC", data_sizes[i]); + } + + printf("3DES Benchmarking completed. Results saved in %s\n", RESULTS_FILE_3DES); + return 0; +}