summaryrefslogtreecommitdiff
path: root/set4/task25.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-08-15 12:22:31 +0200
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:25 +0100
commit8911c9595b9d553100951ff2653464ef5868b81d (patch)
treec7e8c428ad3af16c41e699850edc82f617a6e121 /set4/task25.c
parentcb990c73c478c1bb40d749d0f4e52c10a9ac80fd (diff)
set4, completed challenge 25
Diffstat (limited to 'set4/task25.c')
-rw-r--r--set4/task25.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/set4/task25.c b/set4/task25.c
new file mode 100644
index 0000000..7a29bf9
--- /dev/null
+++ b/set4/task25.c
@@ -0,0 +1,53 @@
+#include "../lib/lib.h"
+#include "../lib/lib2.h"
+#include "../lib/lib3.h"
+#include "../lib/lib4.h"
+#include <time.h>
+
+/**
+ * Assume same key AND same nonce, this leads to the same keystream
+ * every time. Than it is easy to discover the keystream with the edit
+ * function. Simple XOR cihertext agianst out inserted text.
+ *
+ * If the nonce change for each edit call, the above won't work. We have for
+ * every edit a new keystream, that makes it harder.
+ *
+ *
+ **/
+
+int main()
+{
+ generate_random_bytes(key, 16);
+ generate_random_bytes(nonce, 16);
+
+ char *file_content;
+ int file_length = read_base64_file("25.txt", &file_content);
+ char *base64_decoded = malloc(file_length);
+
+ int base64_decoded_length = decode_base64(file_content, base64_decoded);
+ // the file ist AES-ECB encrypted
+ char *plain_tmp = malloc(base64_decoded_length);
+ aes_ecb(base64_decoded, base64_decoded_length, plain_tmp, "YELLOW SUBMARINE",
+ 16, 0);
+ char *ciphertext = malloc(base64_decoded_length);
+
+ aes_ctr(plain_tmp, base64_decoded_length, ciphertext, key, nonce);
+
+ // start the attack
+ // recover 4-byte-keystream in each iteration
+ char *org_ciphertext = malloc(base64_decoded_length);
+ memcpy(org_ciphertext, ciphertext, base64_decoded_length);
+ int i, j;
+ char keystream[16];
+ char *plaintext = malloc(base64_decoded_length);
+ char newtext[16] = "ABABABABABABABAB";
+ for(i=0;i<(base64_decoded_length/16);i++) {
+ aes_ctr_edit(ciphertext, base64_decoded_length, (i*16), newtext);
+ for(j=0;j<16;j++) {
+ keystream[j] = newtext[j] ^ ciphertext[i*16+j];
+ plaintext[i*16+j] = keystream[j] ^ org_ciphertext[i*16+j];
+ }
+ }
+
+ printf("Recovered plaintext: %s\n", plaintext);
+}