This is short solution of task provided by Gynvael Coldwind on one of his online streams (here's a link ----> https://www.youtube.com/watch?v=fBEe8DGZL5o ) . We have to decrypt message:
1f9111 1799 0790001226d8 0a9e1e5c3ada 1f 099e195e 0a97075a21dac1 0a9710 199e075131d3 1199 12961350
The message is in english, XOR-ed by 160bit key. Every word is encrypted separately.
My approach to that is simply to assume that the single letter in the message has to be either 'a' or 'i'. If one of them is correct then XORing first letter of each word with correct key value (obtained by xoring 0x1f with 'a' or 'i') should print out english letter. In this case letter 'a' worked brilliantly ;-) Next step was to assume that first word has to be "and". The rest is even easier.
And here's the code to decrypt them all, and retrieve a key:
#include <cstdio> #include <vector> int main() { int key[7] = {0}; std::vector< std::vector<int> > words = { { 0x1f, 0x91, 0x11 }, { 0x17, 0x99 }, { 0x07, 0x90, 0x00, 0x12, 0x26, 0xd8 }, { 0x0a, 0x9e, 0x1e, 0x5c, 0x3a, 0xda }, { 0x1f }, { 0x09, 0x9e, 0x19, 0x5e }, { 0x0a, 0x97, 0x07, 0x5a, 0x21, 0xda, 0xc1 }, { 0x0a, 0x97, 0x10 }, { 0x19, 0x9e, 0x07, 0x51, 0x31, 0xd3 }, { 0x11, 0x99 }, { 0x12, 0x96, 0x13, 0x50 } }; key[0] = 0x1f ^ 'a'; key[1] = 0x91 ^ 'n'; key[2] = 0x11 ^ 'd'; key[3] = 0x50 ^ 'e'; key[4] = 0x26 ^ 'r'; key[5] = 0xd8 ^ 'e'; key[6] = 0xc1 ^ 'h'; for (int i = 0; i < 11; i++) { printf("[%.2d]: ", i); for (int j = 0; j < words[i].size(); j++) { printf("%c", words[i][j] ^ key[j]); } printf("\n"); } printf("[KEY]: "); for (int i = 0; i < 7; i++) printf("%.2x", key[i]); printf("\n"); return 0; }And here's an output of that:
[00]: and
[01]: if
[02]: you're
[03]: taking
[04]: a
[05]: walk
[06]: through
[07]: the
[08]: garden
[09]: of
[10]: life
[KEY]: 7eff753554bda9
Comments
Post a Comment