Szyfrowanie XOR plików historii Konnekta (.dtb)

0

Muszę znaleźć sposób na odszyfrowanie tekstu. Najprawdopodobniej został tutaj zastosowany XOR. Jako, że mogę dowolnie szyfrować tekst, zakodowałem najpierw string 200 literek 'a', a później 200 literek 'b'.

Próbowałem sprawdzić czy to faktycznie XOR - wyczytałem gdzieś, że XORując dwa teksty zaszyfrowane tym samym kluczem otrzymamy odszyfrowane dane z pominięciem klucza, ale ..jakoś mi nie wyszło, wynik to:

3  1  7  5  | 3  1  7  5  | 3  D  7  1  | 3  3D 7  1  | 
3  3D 3F 1D | 3  1  1F D  | 3  1  FF D  | 3  5  7F 1  | 
3  5  F  1  | 3  5  7  5  | 3  1  7  5  | 3  1  7  5  | 
3  1D 7  1  | 3  D  7  1  | 3  D  F  D  | 3  1  F  1D | 
3  1  F  1D | 3  5  F  1  | 3  5  1F 1  | 3  5  7  5  | 
3  1  7  5  | 3  1  7  5  | 3  D  7  1  | 3  1D 7  1  | 
3  1D 1F 7D | 3  1  FF D  | 3  1  1F D  | 3  5  1F 1  | 
3  5  F  1  | 3  5  7  5  | 3  1  7  5  | 3  1  7  5  | 
3  3D 7  1  | 3  D  7  1  | 3  D  F  D  | 3  1  F  3D | 
3  1  F  3D | 3  5  F  1  | 3  5  FF 1  | 3  5  7  5  | 
3  1  7  5  | 3  1  7  5  | 3  D  7  1  | 3  FD 7  1  | 
3  FD 7F 1D | 3  1  1F D  | 3  1  3F D  | 3  5  3F 1  | 
3  5  F  1  | 3  5  7  5

Również napisałem sobie program do znalezienia klucza przez brute-force, ale bez powodzenia.

Proszę o pomoc o nakierowanie, moja wiedza o szyfrowaniu jest minimalna.
Plik z 'aaa...':

21 73 9b d6 e9 47 6b d6 16 65 2b 7d a5 e0 f3 51
75 e0 20 6f 35 87 af ea fd 5b 7f ea 2a 79 3f 91
b9 f4 07 65 89 f4 34 83 49 9b c3 fe 11 6f 93 fe
3e 8d 53 a5 cd 08 1b 79 9d 08 48 97 5d af d7 12
25 83 a7 12 52 a1 67 b9 e1 1c 2f 8d b1 1c 5c ab
71 c3 eb 26 39 97 bb 26 66 b5 7b cd f5 30 43 a1
c5 30 70 bf 85 d7 ff 3a 4d ab cf 3a 7a c9 8f e1
09 44 57 b5 d9 44 84 d3 99 eb 13 4e 61 bf e3 4e
8e dd a3 f5 1d 58 6b c9 ed 58 98 e7 ad ff 27 62
75 d3 f7 62 a2 f1 b7 09 31 6c 7f dd 01 6c ac fb
c1 13 3b 76 89 e7 0b 76 b6 05 cb 1d 45 80 93 f1
15 80 c0 0f d5 27 4f 8a 9d fb 1f 8a ca 19 df 31
59 94 a7 05 29 94 d4 23

Plik z 'bbb...':

22 72 9c d3 ea 46 6c d3 15 68 2c 7c a6 dd f4 50
76 dd 1f 72 36 86 b0 e7 fe 5a 80 e7 29 7c 40 90
ba f1 08 64 8a f1 33 86 4a 9a c4 fb 12 6e 94 fb
3d 90 54 a4 ce 05 1c 78 9e 05 47 9a 5e ae d8 0f
26 82 a8 0f 51 a4 68 b8 e2 19 30 8c b2 19 5b ae
72 c2 ec 23 3a 96 bc 23 65 b8 7c cc f6 2d 44 a0
c6 2d 6f c2 86 d6 00 37 4e aa d0 37 79 cc 90 e0
0a 41 58 b4 da 41 83 d6 9a ea 14 4b 62 be e4 4b
8d e0 a4 f4 1e 55 6c c8 ee 55 97 ea ae fe 28 5f
76 d2 f8 5f a1 f4 b8 08 32 69 80 dc 02 69 ab fe
c2 12 3c 73 8a e6 0c 73 b5 08 cc 1c 46 7d 94 f0
16 7d bf 12 d6 26 50 87 9e fa 20 87 c9 1c e0 30
5a 91 a8 04 2a 91 d3 26
0

Jeśli to xor, to xorując zaszyfrowany tekst tekstem niezaszyfrowanym dostaniesz klucz.

0

No tak, ale żeby to było tak proste, wszystkie bajty musiały by powtarzać się o długość klucza, prawda? Wydaje mi się, że dodane jest jeszcze coś.

Tutaj xor pierwszego pliku o 0x61, a drugiego o 0x62:

40 12 fa b7 88 26 0a b7 77 04 4a 1c c4 81 92 30
14 81 41 0e 54 e6 ce 8b 9c 3a 1e 8b 4b 18 5e f0
d8 95 66 04 e8 95 55 e2 28 fa a2 9f 70 0e f2 9f
5f ec 32 c4 ac 69 7a 18 fc 69 29 f6 3c ce b6 73
44 e2 c6 73 33 c0 06 d8 80 7d 4e ec d0 7d 3d ca
10 a2 8a 47 58 f6 da 47 07 d4 1a ac 94 51 22 c0
a4 51 11 de e4 b6 9e 5b 2c ca ae 5b 1b a8 ee 80
68 25 36 d4 b8 25 e5 b2 f8 8a 72 2f 00 de 82 2f
ef bc c2 94 7c 39 0a a8 8c 39 f9 86 cc 9e 46 03
14 b2 96 03 c3 90 d6 68 50 0d 1e bc 60 0d cd 9a
a0 72 5a 17 e8 86 6a 17 d7 64 aa 7c 24 e1 f2 90
74 e1 a1 6e b4 46 2e eb fc 9a 7e eb ab 78 be 50
38 f5 c6 64 48 f5 b5 42
40 10 fe b1 88 24 0e b1 77 0a 4e 1e c4 bf 96 32
14 bf 7d 10 54 e4 d2 85 9c 38 e2 85 4b 1e 22 f2
d8 93 6a 06 e8 93 51 e4 28 f8 a6 99 70 0c f6 99
5f f2 36 c6 ac 67 7e 1a fc 67 25 f8 3c cc ba 6d
44 e0 ca 6d 33 c6 0a da 80 7b 52 ee d0 7b 39 cc
10 a0 8e 41 58 f4 de 41 07 da 1e ae 94 4f 26 c2
a4 4f 0d a0 e4 b4 62 55 2c c8 b2 55 1b ae f2 82
68 23 3a d6 b8 23 e1 b4 f8 88 76 29 00 dc 86 29
ef 82 c6 96 7c 37 0e aa 8c 37 f5 88 cc 9c 4a 3d
14 b0 9a 3d c3 96 da 6a 50 0b e2 be 60 0b c9 9c
a0 70 5e 11 e8 84 6e 11 d7 6a ae 7e 24 1f f6 92
74 1f dd 70 b4 44 32 e5 fc 98 42 e5 ab 7e 82 52
38 f3 ca 66 48 f3 b1 44

Każdy bajt co 4 bajty w obu plikach jest ten sam. Oznacza to, że klucz jest 4-bajtowy?

0

niekoniecznie..

ps. wiesz.. wklejalbys wyniki hexowe (bo to ASCII z boku raczej nie potrzebne) jako tekst.. jakby ktos sie chcial pobawic to przepisywac to to khem.. przesada

ciekawe. spojrz np. ze xorujac dwa ostatnie pliki (tzn. te zxorowane z 0x61 i 0x62) dostajesz:

00020406 00020406 000E0402 003E0402
003E3C1E 00021C0E ...

wyglada na blokowy co 4B (albo 8B) ale sa pewnie jakies wtracone zaleznosci miedzy blokami, z 'czasem' sie nawarstawiaja i zaszumiaja xora

0

na pewno jest nalozona na niego wariacja +-'a
zerknij na pierwsze linie:

aaa'   40 12 fa b7 | 88 26 0a b7 | 77 04 4a 1c | c4 81 92 30
bbb'   40 10 fe b1 | 88 24 0e b1 | 77 0a 4e 1e | c4 bf 96 32

kolejne roznice: 0 -2 +4 -6 | 0 -2 +4 -6 | 0 +6 +4 +2 | 0 +3e +4 +2

drugie linie:

aaa'  14 81 41 0e | 54 e6 ce 8b | 9c 3a 1e 8b | 4b 18 5e f0
bbb'  14 bf 7d 10 | 54 e4 d2 85 | 9c 38 e2 85 | 4b 1e 22 f2

roznice: 0 +3e +3c +2 | 0 -2 +4 -6 | 0 -2 +c4 -6 | 0 +6 -3c +2

wszystkie sa parzyste. ah, uwaga, to sa roznice pomiedzy AAA i BBB!

to by znaczylo ze szum w pliku A i B jest rozny, ale symetryczny, np:
0 -1 +2 -3 | 0 -1 +2 -3 | 0 +3 +2 +1 | 0 +1f +2 +1
a w pliku B:
0 +1 -2 +3 | 0 +1 -2 +3 | 0 -3 -2 -1 | 0 -1f -2 -1

0

jelsi to prawda, to po odjeciu tego szumu +-, pierwsze dwie linie obu dexorowanych to:

aaa' +( 0 -1 +2 -3 | 0 -1 +2 -3 | 0 +3 +2 +1 | 0 +1f +2 +1)
aaa' +( 0 +1f +1e +1 | 0 -1 +2 -3 | 0 -1 +62 -3 | 0 +3 -1e +1)

aaa''   40 11 fc b4 | 88 25 0c b4 | 77 07 4c 1d | c4 a0 94 31
aaa''  14 a0 5f 0f | 54 e5 d0 88 | 9c 39 80 88 | 4b 1b 40 f1

bbb' -( 0 -1 +2 -3 | 0 -1 +2 -3 | 0 +3 +2 +1 | 0 +1f +2 +1)
bbb' -( 0 +1f +1e +1 | 0 -1 +2 -3 | 0 -1 +62 -3 | 0 +3 -1e +1)

bbb''   40 11 fc b4 | 88 25 0c b4 | 77 07 4c 1d | c4 a0 94 31
bbb''  14 a0 5f 0f | 54 e5 d0 88 | 9c 39 80 88 | 4b 1b 40 f1

widac wyraznie sekwencje +0 -1 +2 -3 oraz +0 +3 +2 +1
gdzieniegdzie sekwencja jest zaburzona, np.
0 +1f +1e +1 pasuje do +0 +3 +2 +1 z szumem +1C na 2' i 3' pozycji
0 -1 +62 -3 pasuje do +0 -1 +2 -3 z szumem +60 na 3' pozycji

mogl ow szum np. powstac przez zla kolejnosc +- oraz xora z 0x61/0x62 ? do sprawdzenia czy dwie pierwsze linie plikow AAA i BBB najpierw offsetowane o niezaszumione 321123 i potem xorowane z 0x61/0x62 dadza to samo? jesli tak to to bylby klucz xora i pozostawalo by dojsc na podstawie czego sa:

  • dobierana jedna z dwoch sekwencji +-
  • generowany klucz xora ;)
0

Wielkie dzięki za naprawdę spore rozmyślenia nt. szyfrowania.

Te dane, które podawałem to pliki zapisanych wiadomości z Konnekta. Chciałem napisać eksporter całej historii (szkoda tracić 3 lata wspomnień ;)), by móc zaimportować je później do innego komunikatora - nie ma co się oszukiwać, twórcy olali Konnekta, a, że open source ich nie interesuje, projekt umarł.

Te pliki z wiadomościami to format wewnętrznej biblioteki, której używa Konnekt - Stamina.lib. Dokopałem się do jej źródeł i znalazłem klasę do obsługi tych plików. Po całodniowym jej kompilowaniu i uczeniu się w jej użyciu (nikt oprócz twórców Konnekta jej nie używa) udało mi się uzyskać dostęp do bezpośrednich wiadomości. Okazało się, że pierwsze szyfrowanie XOR było już na poziomie całego pliku. Następnie są zaszyfrowane same wiadomości - tutaj już musiałem użyć ataku z tekstem jawnym, żeby uzyskać klucz XOR i udało mi się.

Jeżeli ktoś kiedyś w przyszłości będzie chciał przeczytać historię Konnekta z pliku dtb:
Klucz XOR, którym szyfrowane są stringi:
0x40, 0x13, 0xf8, 0xb2, 0x84, 0x23, 0x04, 0xae, 0x6f, 0x3d

1 użytkowników online, w tym zalogowanych: 0, gości: 1