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 "utils.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("Usage: %s <filename>\n", argv[0]);
|
printf("Usage: %s <filename>\n", argv[0]);
|
||||||
|
@ -17,7 +41,31 @@ int main(int argc, char *argv[]) {
|
||||||
return EXIT_FAILURE;
|
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)) {
|
if (fclose(fp)) {
|
||||||
printf("Error closing file %s\n", filename);
|
printf("Error closing file %s\n", filename);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue