summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-08-04 19:24:17 +0200
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:25 +0100
commit4e0e29f48f797206a21aa5ba7855ffde72e85cf9 (patch)
tree951795c82c357aa9560f7b529f5b93e51554ed86 /lib
parent11b2ff584c67cf85ebe2405f6a74ab2799736927 (diff)
completed set3, challenge 20
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.c27
-rw-r--r--lib/lib.h2
-rw-r--r--lib/lib2.c10
-rw-r--r--lib/lib2.h1
4 files changed, 36 insertions, 4 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 7c8beae..0e02726 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -555,4 +555,31 @@ int string_is_ecb_encrypted(char *string, int length_string, int blocksize)
return (count_equal_blocks(string, length_string, blocksize) > (length_string/blocksize));
}
+/**
+* split ciphertext in blocks of size blocksize
+ * @return returns an array of string of size with blocksize elements
+ */
+
+
+char **transpose_blocks(char *ciphertext, int blocksize, int length)
+{
+ char **blocks;
+ int i, j;
+ int number_blocks = length / blocksize;
+
+ blocks = malloc(blocksize*(sizeof(char*)));
+
+ for(i=0;i<blocksize;i++) {
+ blocks[i] = malloc(number_blocks+1);
+ }
+
+ for(j=0;j<blocksize;j++) {
+ for(i=0;i<number_blocks;i++) {
+ blocks[j][i] = ciphertext[(i*blocksize)+j];
+ }
+ }
+
+ return blocks;
+}
+
diff --git a/lib/lib.h b/lib/lib.h
index 8e384e8..a561442 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -24,6 +24,6 @@ char brute_force_single_byte_xor(char *string, int length, struct key_and_freq *
int isprintable(char *string, int length);
int read_base64_file(const char *file, char **out);
int string_is_ecb_encrypted(char *string, int length_string, int blocksize);
-
+char **transpose_blocks(char *ciphertext, int blocksize, int length);
#endif /* __CYRPTO_LIB__ */
diff --git a/lib/lib2.c b/lib/lib2.c
index c7e6ebb..e447054 100644
--- a/lib/lib2.c
+++ b/lib/lib2.c
@@ -6,12 +6,11 @@
* and append to last block so that it is also of blocksize length
*/
-char *pkcs7_padding(char *string, int length_string, int blocksize)
+char *__pkcs7_padding(char *string, int length_string, int blocksize, int *padding)
{
char *result = NULL;
int i;
int value = blocksize - (length_string % blocksize);
-
result = malloc(length_string+value+1);
memcpy(result, string, length_string);
@@ -19,10 +18,15 @@ char *pkcs7_padding(char *string, int length_string, int blocksize)
result[length_string+i] = (char) value;
}
result[length_string+i] = '\0';
-
+ *padding = value;
return result;
}
+char *pkcs7_padding(char *string, int length_string, int blocksize)
+{
+ int not_interested;
+ return __pkcs7_padding(string, length_string, blocksize, &not_interested);
+}
/**
* unpadd a string
* @param in string which should be unpadded
diff --git a/lib/lib2.h b/lib/lib2.h
index f0a1a26..e5666ea 100644
--- a/lib/lib2.h
+++ b/lib/lib2.h
@@ -15,6 +15,7 @@ char key[17];
char iv[17];
char *pkcs7_padding(char *string, int length_string, int blocksize);
+char *__pkcs7_padding(char *string, int length_string, int blocksize, int *padding);
int aes_cbc(char *in, int length_in, char *out, unsigned char *string_key, char *init_vector, int encrypt);
int valid_pkcs7_padding(const char *in, int length_in, char *unpadded, int blocksize);
int aes_ecb(char *in, int length_in, char *out, unsigned char *string_key,