From 2c26f4bbcc694f90568f71b4e4d8b551138f6069 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Fri, 5 Jun 2020 15:28:55 +0200 Subject: [PATCH] Find the most probable keysize using normalized edit distance --- ex06/main.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/ex06/main.c b/ex06/main.c index 167c594..0fa5e45 100644 --- a/ex06/main.c +++ b/ex06/main.c @@ -1,8 +1,32 @@ #include "utils.h" #include +#include #include #include +#define BUF_SIZE 4096 + +double normalized_edit_distance(const unsigned char *buf, + unsigned int keysize) { + char block1[keysize]; + char block2[keysize]; + char block3[keysize]; + char block4[keysize]; + + for (size_t i = 0; i < keysize; ++i) { + block1[i] = buf[i]; + block2[i] = buf[keysize + i]; + block3[i] = buf[2 * keysize + i]; + block4[i] = buf[3 * keysize + i]; + } + + double dist1 = hamming(block1, block2) / (double)keysize; + double dist2 = hamming(block2, block3) / (double)keysize; + double dist3 = hamming(block3, block4) / (double)keysize; + + return (dist1 + dist2 + dist3) / 3; +} + int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s \n", argv[0]); @@ -17,7 +41,31 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - printf("%u\n", hamming("this is a test", "wokka wokka!!!")); + char input[BUF_SIZE] = {'\0'}; + size_t nread = fread(input, 1, BUF_SIZE, fp); + if (nread == 0) { + printf("Cannot read any character from file %s\n", filename); + return EXIT_FAILURE; + } + + unsigned char buf[BUF_SIZE] = {0}; + size_t len = base64_to_bytes(buf, input); + if (len == 0) { + printf("Could not decode base64\n"); + return EXIT_FAILURE; + } + + unsigned int keysize = 40; + double min_edit_dist = INFINITY; + for (unsigned int i = 40; i > 1; --i) { + double edit_dist = normalized_edit_distance(buf, i); + if (edit_dist < min_edit_dist) { + min_edit_dist = edit_dist; + keysize = i; + } + } + + printf("keysize = %u, min edit distance = %f\n", keysize, min_edit_dist); if (fclose(fp)) { printf("Error closing file %s\n", filename);