Dopełnianie Bloków

Dopełnianie bloków danych polega na dodawaniu pewnych uzgodnionych wartości na końcu przesyłanych wiadomości. Jest wykorzystywane w algorytmach, które wykonują operacje na całych blokach danych, takich jak symetryczne szyfry blokowe lub algorytmy MAC. Jeżeli długość przetwarzanych danych nie jest całkowitą wielokrotnością długości jednego bloku danych, to potrzebny jest mechanizm, który będzie dopisywał pewne przewidywalne znaki na końcu wiadomości, w celu odpowiedniego zwiększenia jej długości.

Informacja o użytym standardzie dopełniania musi zostać przekazana do odbiorcy. To pozwala mu określić (po odszyfrowaniu szyfrogramu) gdzie kończy się oryginalna wiadomość, a zaczynają się nieistotne bajty dopełnienia.

Wszystkie standardy dopełniania bloków zaprezentowane poniżej działają w podobny sposób. Opisują one jakie wartości powinny być dodawane do wiadomości w celu zapełnienia ostatniego bloku danych.

Używanie ogólnie przyjętych standardów dopełniania jest wygodnym sposobem gwarantowania poprawnej długości szyfrowanych danych. Jedyną wadą dopełniania bloków jest fakt, że nawet jeśli wiadomość zawiera odpowiednią liczbę bajtów (całkowitą wielokrotność długości jednego bloku), to dopełnienie i tak musi zostać dodane, aby zagrawantować, że odbiorca będzie w stanie zrozumieć wiadomość. Zwykle dodawany jest jeszcze jeden blok, zawierający jedynie nieistotne bajty dopełnienia.

Kilka typów dopełniania bloków przedstawionych jest poniżej. Pierwsze dwa standardy bazują na dopełnianiu przy użyciu pojedynczych bitów, natomiast pozostałe polegają na dopisywaniu całych bajtów.

Dopełnianie Bitowe

Pojedynczy bit 1 jest dołączany do wiadomości. Pozostałe bity dopełnienia (jeśli jakieś są jeszcze potrzebne) będą zerami.

1 0 1 0 0 0 0 1 1 0  1 0 0 0 0 0

Ten typ dopełniania jest zdefiniowany przez dokumentację ISO/IEC 9797-1.

Dopełnianie TBC

Jeśli dane konćzą się bitem 0, to wszystkie bity dopełnienia będą jedynkami. Natomiast jeśli dane konćzą się bitem 1, to wszystkie bity dopełnienia będą zerami.

1 0 1 0 0 0 0 1 1 0  1 1 1 1 1 1
1 0 1 0 0 0 0 1 1 1  0 0 0 0 0 0

Dopełniania PKCS#5 i PKCS#7

Każdy bajt dopełnienia ma wartość równą ilości wszystkich dodanych bajtów dopełnienia. Oczywiście, ilość dodanych bajtów zależy od wielkości bloku.

Na przykład, jeśli wiadomość jest krótsza o 3 bajty niż całkowita wielokrotność długości jednego bloku, to wtedy 3 bajty powinny zostać dodane do tej wiadomości, każda o wartości 3. Jeśli 5 bajtów powinno być dodanych, to każdy z nich powinien być 5.

0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0xEF  0x03 0x03 0x03
0x10 0x11 0x36 0x67 0x38 0xBC  0x06 0x06 0x06 0x06 0x06 0x06

Dopełnianie ISO 7816-4

Pierwszy bajt dopełnienia ma wartość równą 0x80. Pozostałe bajty dopełnienia są zerami. Taka konstrukcja umożliwia tworzenie dopełnień o dowolnej długości.

0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0xEF  0x80 0x00 0x00

Ten typ dopełniania jest zdefiniowany przez dokumentację ISO/IEC 7816-4.

Dopełnianie ISO 10126-2

Ostatni bajt dopełnienia (czyli ostatni bajt ostatniego bloku danych) ma wartość równą ilości bajtów dopełnienia. Pozostałe bajty dopełnienia są losowymi liczbami.

0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0xEF  0x23 0x86 0x03

Ten typ dopełniania jest zdefiniowany przez dokumentację ISO 10126-2.

Dopełnianie ANSI X9.23

Ostatni bajt dopełnienia (czyli ostatni bajt ostatniego bloku danych) ma wartość równą ilości bajtów dopełnienia. Pozostałe bajty dopełnienia są zerami.

0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0xEF  0x00 0x00 0x03

Ten typ dopełniania jest zdefiniowany przez standard ANSI X9.23.

Dopełnianie Bajtami Zerowymi

Wszystkie bajty dopełnienia są zerami. Ten sposób dopełniania jest raczej zawodny (co jeśli oryginalne dane kończą się zerami?) i powinien być używany jedynie jeśli jest to wymagane przez istniejące, przestarzałe aplikacje.

0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0xEF  0x00 0x00 0x00
0x10 0x11 0x36 0x67 0x38 0xBC 0x03 0x21 0x00  0x00 0x00 0x00