- Chcę zaszyfrować dane za pomocą 128 bitowego klucza, 16 bajtów. Co jeśli użytkownik poda klucz o długości, np. 10 bajtów? Pozostałe 6 wypełniamy zerami? Mam na myśli dopisanie tych 6 zer jeszcze przed operacją rozszerzania klucza do 176 bajtów.
- Mamy dane o długości 40 bajtów. Pierwsze 32 B szyfrujemy normalnie, ale czy do 8 ostatnich potrzebujemy pełen blok, tzn. macierz stanu o wymiarach 4x4? W tym przypadku można dopisać 8 bajtów i to zaszyfrować. Problem jest taki, że po odszyfrowaniu dane mają nie, 40 a 48 bajtów wraz z tymi 8 niepotrzebnymi zerami. Mogę w pliku zapisać sobie nagłówek informujący ile bajtów z ostatniego 16 bajtowego bloku stanowią rzeczywiste dane i wykorzystać to przy deszyfracji, ale może jest jakieś lepsze rozwiązanie?
0
4
- Nie ma takiej możliwosci, użytkownik musi podać cały klucz! Podanie klucza krótszego skutkuje osłabieniem algorytmu. Trudność łamania klucza rośnie wykładniczo z rozmiarem klucza, ale także spada wykładniczo jeśli klucz skracasz! O ile złamanie AESa z 16 bajtowym kluczem jest póki co niewykonalne o tyle brutowanie mniejszej liczby bajtów już niekoniecznie. Konkretnie twój 10 bajtowy klucz można złamać 248 razy szybciej niż pełny klucz...
- Stosuje się padding PKCS7. Padding występuje zawsze (tzn nawet jeśli user podał dokładnie tyle bajtów ile trzeba to dodajesz caly nowy blok paddingu). Padding ma postać bajtów o tej samej wartości, które mówią ile bajtów paddingu jest. Np. 3 bajty paddingu to będzie:
XXXXXXXXXXXXX 0x3 0x3 0x3
gdzieX
to bajty wiadomości a0x3
to padding. W ten sposób usuwanie paddingu jest banalnie proste:
- odczytujesz ostatni bajt zdekodowanej wiadomości
- usuwasz od końca tyle bajtów ile wynosiła ta liczba
Dodatkowo mozesz też dokonać weryfikacji i sprawdzić czy te usuwane bajty paddingu mają wszystkie poprawną wartość. Jeśli nie, to znaczy ze ktoś modyfikował ciphertext.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.