Find the most probable keysize using normalized edit distance
This commit is contained in:
parent
5b0ec4d3d8
commit
2c26f4bbcc
1 changed files with 49 additions and 1 deletions
50
ex06/main.c
50
ex06/main.c
|
@ -1,8 +1,32 @@
|
|||
#include "utils.h"
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 <filename>\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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue