diff options
| -rw-r--r-- | lib/lib.c | 51 | ||||
| -rw-r--r-- | lib/lib.h | 2 | ||||
| -rw-r--r-- | lib/lib2.c | 39 | ||||
| -rw-r--r-- | lib/lib2.h | 5 | ||||
| -rw-r--r-- | set1/task6.c | 53 | ||||
| -rw-r--r-- | set2/10.txt | 64 | ||||
| -rw-r--r-- | set2/Makefile | 13 | ||||
| -rw-r--r-- | set2/task10.c | 30 |
8 files changed, 204 insertions, 53 deletions
@@ -471,3 +471,54 @@ char brute_force_single_byte_xor(char *string, int length, struct key_and_freq * return key; } + + +/** + * reads a base64 an decode it + * @param file path of the file + * @param out writes file in this buffer, allocated by this method + */ +int read_base64_file(const char *file, char **out) +{ + char ch; + FILE *fp; + int file_size = 60; + char *new_file_content; + int file_pos = 0; + + fp = fopen(file, "r"); + + if (fp == NULL) { + printf("Error open file\n"); + exit(1); + } + + *out = malloc(file_size); + + if (*out == NULL) { + perror("out of memory"); + exit(1); + } + + // read data and decode it from base64 + while ( (ch = fgetc(fp)) != EOF) { + // ignore new lines as this is part of base64 + if (ch == '\n' || ch == '\r') + continue; + + if (file_pos+1 >= file_size) { + new_file_content = realloc(*out, (file_size+60)); + if (new_file_content != NULL) { + *out = new_file_content; + file_size += 60; + } + else { + printf("error allocating memory\n"); + exit(1); + } + } + (*out)[file_pos++] = ch; + } + return file_pos; + +} @@ -22,6 +22,6 @@ void print_base64_string(char *string); int hamming_distance_equal_length(char *string1, char *string2, int length); char brute_force_single_byte_xor(char *string, int length, struct key_and_freq *tmp); int isprintable(char *string, int length); - +int read_base64_file(const char *file, char **out); #endif /* __CYRPTO_LIB__ */ @@ -1,4 +1,5 @@ #include "lib2.h" +#include "lib.h" /** * appends PKCS#7 padding to string. devide string in blocks of size blocksize @@ -21,3 +22,41 @@ char *pkcs7_padding(char *string, int length_string, int blocksize) return result; } + +/** + * decrypts content which is encrypted in AES CBC mode + * @param in input content + * @param length_in length of parametere in + * @param out place where the decrypted content should be written to + * @param string_key key with which the content in in has been decrypted + * @param iv initalization vector + */ +int aes_cbc(char *in, int length_in, char *out, unsigned char *string_key, char *init_vector) +{ + char iv[16]; + AES_KEY key; + int number_blocks = length_in / 16; + int i, j; + unsigned char ciphertext[128+1]; + unsigned char tmp_after_aes[128+1]; + unsigned char cleartext[128+1]; + // set the key and bits + AES_set_decrypt_key(string_key, 128, &key); + + memcpy(init_vector, iv, 16); + + // implement cbc mode + for(i=0;i<number_blocks;i++) { + //do aes decryption + AES_decrypt(&in[i*16], tmp_after_aes, &key); + // xor + xor_string(iv, tmp_after_aes, &out[i*16], 16, 16); + // this ciphertext block is the next iv + for(j=0;j<16;j++) { + iv[j] = in[i*16+j]; + } + } + + return 0; + +} @@ -1,11 +1,12 @@ #ifndef __LIB2_H__ -#define __LIN2_H__ +#define __LIB2_H__ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <openssl/aes.h> char *pkcs7_padding(char *string, int length_string, int blocksize); - +int aes_cbc(char *in, int length_in, char *out, unsigned char *string_key, char *init_vector); #endif diff --git a/set1/task6.c b/set1/task6.c index 7055044..10e19b2 100644 --- a/set1/task6.c +++ b/set1/task6.c @@ -27,56 +27,19 @@ char **transpose_blocks(char *ciphertext, int blocksize, int length) return blocks; } + int main() { - FILE *fp; int keysize; - char ch; - char *file_content, *new_file_content, *chiphertext, *block1, *block2; - int file_size = 60, file_pos = 0; - int i; + char *chiphertext, *block1, *block2; + char *file_content; + int i, file_length; double min_hamming_distance, tmp; + int ciphertext_len; - fp = fopen("6.txt", "r"); - - if (fp == NULL) { - printf("Error open file\n"); - exit(1); - } - - file_content = malloc(file_size); - - if (file_content == NULL) { - perror("out of memory"); - exit(1); - } - - // read data and decode it from base64 - // result is not a hex strin or? - - while ( (ch = fgetc(fp)) != EOF) { - // ignore new lines as this is part of base64 - if (ch == '\n' || ch == '\r') - continue; - - if (file_pos+1 >= file_size) { - new_file_content = realloc(file_content, (file_size+60)); - if (new_file_content != NULL) { - file_content = new_file_content; - file_size += 60; - } - else { - printf("error allocating memory\n"); - exit(1); - } - } - file_content[file_pos++] = ch; - } - file_content[file_pos] = '\0'; - - int ciphertext_len = 0; - - chiphertext = malloc(file_pos+1); + file_length = read_base64_file("6.txt", &file_content); + printf("read: %i, address: %p\n", file_length, file_content); + chiphertext = malloc(file_length+1); ciphertext_len = decode_base64(file_content, chiphertext); block1 = malloc(41); diff --git a/set2/10.txt b/set2/10.txt new file mode 100644 index 0000000..f0802a5 --- /dev/null +++ b/set2/10.txt @@ -0,0 +1,64 @@ +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 diff --git a/set2/Makefile b/set2/Makefile index abbacc0..b0c56a2 100644 --- a/set2/Makefile +++ b/set2/Makefile @@ -1,10 +1,13 @@ -LIB=../lib/lib2.c +LIB=../lib/lib2.c ../lib/lib.c CC=gcc -CFLAGS := -g -Wall $(CFLAGS) +CFLAGS := -g $(CFLAGS) +CLIBS=`pkg-config --cflags --libs libcrypto` -all: task9 +all: task9 task10 task9: - $(CC) $(CFLAGS) task9.c $(LIB) -o task9 + $(CC) $(CFLAGS) task9.c $(LIB) $(CLIBS) -o task9 +task10: + $(CC) $(CFLAGS) task10.c $(LIB) $(CLIBS) -o task10 clean: - rm task9 + rm task9 task10 diff --git a/set2/task10.c b/set2/task10.c new file mode 100644 index 0000000..fb8d0c1 --- /dev/null +++ b/set2/task10.c @@ -0,0 +1,30 @@ +#include "../lib/lib.h" +#include "../lib/lib2.h" + + +int main(int argc, char **argv) +{ + int read = 0, len = 0; + char *cleartext; + char *file_content; + char *decoded_content; + int decoded_content_length = 0; + int file_length = 0; + char *string_key = "YELLOW SUBMARINE"; + char iv[16]; + + memset(iv, 0, 16); + + // file is base64 + file_length = read_base64_file("10.txt", &file_content); + // decode base64 + decoded_content = malloc(file_length); + decoded_content_length = decode_base64(file_content, decoded_content); + cleartext = malloc(decoded_content_length+1); + // aes cbc + aes_cbc(decoded_content, decoded_content_length, cleartext, string_key, iv); + printf("%s\n", cleartext); + free(decoded_content); + free(cleartext); + return 0; +} |
