diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 55 |
1 files changed, 55 insertions, 0 deletions
@@ -0,0 +1,55 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +void decodeEmail(char encoded[]) + { + int len = strlen(encoded); + + char temp[3]; + char email[len/2];//the encoded string/2 gives the length of the result email+1 + + memcpy(temp, encoded, 2); + temp[2] = '\0'; + + char xorKey = strtol(temp, NULL, 16);//the value of the xorKey is the first two bytes in hex, encoded in UTF-8 + + int j = 0; + for (int i = 2; i < len; i += 2, ++j)//decode the rest of the two bytes + { + memcpy(temp, encoded+i,2); + temp[2] = '\0'; + + email[j] = strtol(temp, NULL, 16) ^ xorKey;//xor two bytes with the xorkey to get a UTF-8 character + } + email[j] = '\0';//terminate the string + + printf("Decoded email: %s\n", email); + } + + + +int main(int argc, char *argv[]) + { + if (!argv[1]) + { + char input[512+1];//as the maximun length of an email should be 255 chars, we allocate 255*2+2 chars for the longest valid input (+1 for the newline) + fprintf(stderr,"Input email to decode (string within data-cfemail=\"\"): "); + + ssize_t length = read(0, input, 512); + if (length < 5){fprintf(stderr,"Invalid input.\n"); exit(1);} + + input[length-1] = '\0';//overwrite newline with null char + + decodeEmail(input); + } + else + { + if (strlen(argv[1]) < 4 || strlen(argv[1]) > 512){fprintf(stderr,"Invalid input.\n"); exit(1);} + decodeEmail(argv[1]); + } + + //test string: e4908d9497a4908b9696818a90829681858fca878b89 + } + |