Witam,
Zastanawiam się w jaki sposób można osiągnąć naraz pesymistyczną złożność obliczeniową 2*2^56 i pesymistyczną złożność pamięciową 2^56 w przypadku ataku meet in the middle na dane zaszyfrowane dwukrotnie algorytmem DES. Dla przykładu załóżmy, że dysponuję dwoma parami tekstów jawnych i zaszyfrowanych, które mają te same klucze (dane są podane jako liczby heksadecymalne, klucze mają ustawione bity parzystości).
Tekst jawny 1:
1111111111111111
Tekst jawny 2:
2222222222222222
Tekst zaszyfrowany 1:
54C99F28781CED9F
Tekst zaszyfrowany 2:
F0E0C4236687BE79
Klucze do odgadnięcia:
ABABABABABABABAB
CDCDCDCDCDCDCDCD
Z tego co zrozumiałem czytając ten artykuł na wikipedii: https://pl.wikipedia.org/wiki/Meet_in_the_middle to należy najpierw przygotować tablicę, w której zaszyfruję tekst jawny 1111111111111111 wszystkimi możliwymi kluczami DES. Jej początek powinien wyglądać tak:
Klucz | Tekst zaszyfrowany
- | -
0101010101010101 | 89B07B35A1B3F47E - | -
0101010101010102 | A52E042B7956BDBB - | -
0101010101010104 | C6C93339DD7070DD - | -
0101010101010107 | 0150F71195A68027 - | -
0101010101010108 | F734FB85C3B62799 - | -
010101010101010B | 53E9B7DC7D06E348 - | -
... | ...
Ilość wierszy wynosi 2^56.
Następnie próbuję odszyfrować tekst zaszyfrowany 54C99F28781CED9F po kolei każdym możliwym kluczem DES i wyszukać otrzymany (potencjalnie nieprawidłowy) tekst jawny w tablicy z poprzedniego kroku.
Próba #1: klucz 0101010101010101 daje 84CF6B79C6683406, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
Próba #2: klucz 0101010101010102 daje 3295F05FC26482B6, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
Próba #3: klucz 0101010101010104 daje D90DAB5658129502, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
Próba #4: klucz 0101010101010107 daje FB06F0BE85BD8A6D, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
Próba #5: klucz 0101010101010108 daje 585BFE568AA4A87F, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
Próba #6: klucz 010101010101010B daje 244140483E4437FB, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się niepowieść albo na etapie wyszukiwania, albo na etapie szyfrowania drugiego tekstu jawnego)
...
Próba #57873028282430311: klucz CDCDCDCDCDCDCDCD daje A202EE26F8A71460, wyszukuję go w tablicy z poprzedniego kroku, jeżeli znalazłem ten tekst to sprawdzam poprawność 2 kluczy szyfrując drugi tekst jawny (powinno się udać zarówno na etapie wyszukiwania, jak i na etapie szyfrowania drugiego tekstu jawnego)
I teraz zasadnicze pytanie: żeby szybko wyszukać tekst w tablicy, to mogę ją najpierw posortować i potem użyć wyszukiwania binarnego, ale wtedy złożoność obliczeniowa dla długości klucza n bitów wyniesie 2^nlog(2^n)=n2^n, złożoność pamięciowa wyniesie c2^56, gdzie c jest stałą wynoszącą 56+64=120 bitów, ale ta stała nie jest istotna. Dowiedziałem się, że można użyć tablicy z haszowaniem, żeby złożność czasowa wyniosła 22^56, ale czy wtedy złożność pamięciowa nadal będzie wynosić 2^56? Przez złożoność pamięciową mam na myśli, że dodatkowa ilość danych potrzebna do stworzenia tej struktury danych (względem prostej tablicy z kluczami i tekstami zaszyfrowanymi) jest stała i niezależna od długości klucza i może wynieść np. 1000000 bitów, ale jakbym użył innego algorytmu zamiast DES (np. IDEA o tej samej długości bloku, ale 128 bitowej długości klucza) to ta ilość nadal wynosiłaby 1000000 bitów. Jak można zrealizować taką tablicę z haszowaniem w pamięci?
Shalom