ASCII, Unicode i reprezentacja tekstu
Poznają Państwo sposób, w jaki tekst staje się bajtami, oraz dowiedzą się, dlaczego kodowanie znaków ma znaczenie w kontekście kryptografii.
ASCII, Unicode i reprezentacja tekstu to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
ASCII jako kodowanie 7-bitowe
ASCII (American Standard Code for Information Interchange), ustandaryzowany w 1963 roku, koduje 128 znaków za pomocą 7 bitów (wartości 0-127). Obejmuje alfabet angielski (wielkie i małe litery), cyfry, znaki interpunkcyjne i znaki sterujące.
ASCII zaprojektowano z myślą o języku angielskim i amerykańskim sprzęcie telekomunikacyjnym. Dobrze sprawdzał się w zamierzonym zastosowaniu, ale z założenia nie nadawał się do obsługi żadnego języka poza angielskim.
Znaki sterujące w ASCII
Pierwsze 32 znaki ASCII (0-31) oraz DEL (127) to znaki sterujące. Pierwotnie zaprojektowano je do sterowania dalekopisami: LF (wysunięcie wiersza, 10), CR (powrót karetki, 13), BEL (dzwonek, 7), TAB (9), ESC (27).
W kontekstach kryptograficznych znaki sterujące mogą powodować problemy. Bajt null (0x00) zbyt wcześnie kończy łańcuchy C, a znak DEL lub ESC może zostać zinterpretowany przez emulator terminala.
Rozszerzony ASCII i jego problemy
Poszczególne kraje tworzyły własne rozszerzenia ASCII, wykorzystując ósmy bit (wartości 128-255), co doprowadziło do powstania setek niezgodnych ze sobą kodowań: ISO-8859-1 (Latin-1) dla Europy Zachodniej, KOI-8R dla języka rosyjskiego oraz Big5 dla języka chińskiego.
Dokument zapisany w jednym kodowaniu wygląda jak niezrozumiały ciąg znaków po otwarciu w innym kodowaniu. Brak uniwersalnego standardu był poważnym wyzwaniem dla międzynarodowego tworzenia oprogramowania przez całe lata 80. i 90.
Unicode jako uniwersalny zestaw znaków
Unicode utworzono w celu zapewnienia jednego uniwersalnego zestawu znaków obejmującego wszystkie systemy pisma używane przez ludzi. Obecnie definiuje on ponad 149 000 znaków obejmujących 161 pism, w tym pisma historyczne i symbole.
Unicode oddziela tożsamość znaku (punkt kodowy, taki jak U+0041 dla „A”) od kodowania (sposobu przechowywania tego punktu kodowego w bajtach). Dzięki temu rozdzieleniu wiele formatów kodowania może reprezentować te same znaki.
Kodowanie UTF-8 o zmiennej długości
UTF-8 koduje punkty kodowe Unicode za pomocą od 1 do 4 bajtów. Znaki ASCII (od U+0000 do U+007F) zajmują dokładnie 1 bajt, identyczny z ich wartością ASCII, dzięki czemu UTF-8 zachowuje zgodność wsteczną z ASCII.
Znaki od U+0080 do U+07FF zajmują 2 bajty. Znaki od U+0800 do U+FFFF zajmują 3 bajty (obejmując większość popularnych pism, w tym chińskie, japońskie i koreańskie). Znaki od U+10000 wzwyż zajmują 4 bajty.
UTF-16 i UTF-32
UTF-16 używa 2 bajtów dla najczęściej używanych znaków (Podstawowej Płaszczyzny Wielojęzycznej, od U+0000 do U+FFFF) oraz 4 bajtów (par zastępczych) dla znaków spoza zakresu U+FFFF. Jest używany wewnętrznie przez Windows i Java.
UTF-32 używa dokładnie 4 bajtów na punkt kodowy, dzięki czemu ma stałą szerokość i ułatwia indeksowanie według pozycji znaku, ale marnuje miejsce w przypadku tekstu składającego się głównie z ASCII. Jest używany w niektórych reprezentacjach wewnętrznych, aby zapewnić szybki dostęp swobodny.
Znacznik kolejności bajtów (BOM)
Znacznik kolejności bajtów (BOM) to znak Unicode U+FEFF umieszczany na początku pliku w celu wskazania kolejności bajtów i kodowania. W UTF-16 rozróżnia kolejność big-endian (FE FF) od little-endian (FF FE).
W UTF-8 BOM (EF BB BF) jest niepotrzebny, ponieważ UTF-8 nie ma problemów z kolejnością bajtów, ale niektóre programy systemu Windows mimo to go dodają. Powoduje to problemy w zastosowaniach kryptograficznych, w których BOM jest traktowany jako dane, a nie znacznik.
Dlaczego kodowanie ma znaczenie w kryptografii
Kryptograficzne funkcje skrótu i kody MAC działają na sekwencjach bajtów, a nie na abstrakcyjnych znakach. Ten sam ciąg „café” jest kodowany inaczej w UTF-8 (4 bajty: 63 61 66 C3 A9) niż w Latin-1 (4 bajty: 63 61 66 E9).
Jeśli dwa systemy obliczą skrót tego samego ciągu, używając różnych kodowań, otrzymają różne skróty, a uwierzytelnianie zakończy się niepowodzeniem. Protokoły kryptograficzne muszą jawnie określać kodowanie, aby zapewnić interoperacyjność.
Emoji w UTF-8
Emoji są znakami Unicode należącymi do dodatkowej płaszczyzny wielojęzycznej. Emoji „Grinning Face” (U+1F600) jest kodowane w UTF-8 za pomocą 4 bajtów: F0 9F 98 80.
W kontekstach związanych z bezpieczeństwem emoji i znaki Unicode o pełnej szerokości były wykorzystywane w atakach homograficznych, w których adres URL taki jak „xn--pple-43d.com” (wyglądający jak „apple.com”) nakłania użytkowników do odwiedzenia złośliwej witryny.
Normalizacja Unicode i kryptografia
Niektóre znaki można reprezentować w wielu formach Unicode. „e z akcentem ostrym” może być zapisane jako U+00E9 (postać złożona) albo U+0065 U+0301 (e, po którym następuje łączony akcent, postać rozłożona). Wyglądają identycznie, ale mają różne reprezentacje bajtowe.
Systemy kryptograficzne, które nie normalizują Unicode przed obliczeniem skrótu, mogą wygenerować różne skróty dla wizualnie identycznych ciągów. Przed wykonaniem operacji kryptograficznych na tekście często zaleca się normalizację NFKC.
Wybór właściwego kodowania dla kryptografii
Podczas implementowania systemów kryptograficznych wybór kodowania jest kluczową decyzją, którą należy udokumentować. Hasła należy kodować jako UTF-8 przed obliczeniem skrótu. Kodowanie pól protokołu powinno być określone w dokumentacji specyfikacji.
Błędy interoperacyjności spowodowane niezgodnością kodowań są częstym źródłem problemów w systemach kryptograficznych. Dwie implementacje tego samego protokołu mogą dawać różne wyniki uwierzytelniania, jeśli kodują ciągi w różny sposób.
Quiz z kodowania UTF-8
Proszę sprawdzić swoje rozumienie kodowania UTF-8.
Najważniejsze informacje: kodowanie tekstu
ASCII obejmuje 128 znaków kodowanych za pomocą 7 bitów. Unicode zapewnia uniwersalną przestrzeń punktów kodowych dla wszystkich pism używanych przez ludzi. UTF-8 koduje Unicode za pomocą od 1 do 4 bajtów, przy czym ASCII jest jego 1-bajtowym podzbiorem.
W kryptografii kodowanie ma znaczenie, ponieważ funkcje skrótu działają na bajtach. Ten sam tekst w różnych kodowaniach daje różne skróty. Przed wykonaniem operacji kryptograficznych na tekście niezbędna jest normalizacja Unicode.
Często zadawane pytania
Czy lekcja „ASCII, Unicode i reprezentacja tekstu” jest bezpłatna?
Tak — pełny tekst „ASCII, Unicode i reprezentacja tekstu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „ASCII, Unicode i reprezentacja tekstu”?
Poznają Państwo sposób, w jaki tekst staje się bajtami, oraz dowiedzą się, dlaczego kodowanie znaków ma znaczenie w kontekście kryptografii. Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?
Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „ASCII, Unicode i reprezentacja tekstu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?
Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Kodowanie Base64: jak działa
- ASCII, Unicode i reprezentacja tekstu
- System szesnastkowy w wynikach kryptograficznych
- Kodowanie a szyfrowanie i haszowanie