{"id":31692,"date":"2025-07-31T05:00:00","date_gmt":"2025-07-31T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=31692"},"modified":"2025-07-30T12:01:30","modified_gmt":"2025-07-30T10:01:30","slug":"aes-od-srodka","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/aes-od-srodka\/","title":{"rendered":"AES od \u015brodka"},"content":{"rendered":"\n<p>\u017byjemy w \u015bwiecie zdominowanym przez transmisj\u0119 danych za po\u015brednictwem r\u00f3\u017cnych medi\u00f3w. Bezpiecze\u0144stwo tej transmisji traktujemy jako oczywisto\u015b\u0107 i wiele o niej nie my\u015blimy \u2013 sp\u00f3jrzmy na kilka przypadk\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Has\u0142a dost\u0119pu do naszych kont bankowych czy medi\u00f3w spo\u0142eczno\u015bciowych, kt\u00f3re w jaki\u015b spos\u00f3b musz\u0105 zosta\u0107 bezpiecznie przekazane do serwera uwierzytelniaj\u0105cego, by nikt ich \u201epo drodze\u201d nie wykrad\u0142.<\/li>\n\n\n\n<li>Mimo wielu tysi\u0119cy samochod\u00f3w danego modelu, kluczyk bezprzewodowo otworzy tylko i wy\u0142\u0105cznie nasze auto.<\/li>\n\n\n\n<li>Inteligentne domy w coraz popularniejszym \u201eInternecie rzeczy\u201d, gdzie mikser potrzebuje dost\u0119pu do naszej sieci wi-fi. Wszystko si\u0119 ze sob\u0105 komunikuje.<\/li>\n<\/ul>\n\n\n\n<p>Do naszego hipotetycznego scenariusza \u017cycia, w kt\u00f3rym korzystamy z tych wszelkich dobrodziejstw technologicznych, wprowad\u017amy dodatkow\u0105 posta\u0107 \u2013 atakuj\u0105cego. Za\u0142\u00f3\u017cmy, \u017ce nie dba on o fizyczne blokady, kt\u00f3re przed nim postawimy. W ko\u0144cu zamkni\u0119te drzwi mo\u017cna si\u0142owo otworzy\u0107, okno rozt\u0142uc, a telefon nale\u017c\u0105cy do \u015bpi\u0105cego turysty na lotnisku widzia\u0142 bezpieczniejsze miejsca ni\u017c zewn\u0119trzna kiesze\u0144 plecaka. Naszym zadaniem jest go powstrzyma\u0107.<br><br>Z perspektywy \u017cyciowej fakt, \u017ce na zabezpieczenie swoich d\u00f3br materialnych trzeba uwa\u017ca\u0107, jest oczywisty. Z danymi cyfrowymi \u2013 na przyk\u0142ad has\u0142ami dost\u0119pu \u2013 jest jednak nieco trudniej. My, jako deweloperzy, mamy obowi\u0105zek zapewnienia poufno\u015bci danych, kt\u00f3re powinny by\u0107 znane tylko przez dw\u00f3ch zainteresowanych \u2013 nadawc\u0119 i odbiorc\u0119. W jaki spos\u00f3b zabezpieczy\u0107 dane na dysku, kt\u00f3ry zosta\u0142 skradziony i kto\u015b, kto teraz chce si\u0119 do nich dosta\u0107, ma dost\u0119p do ca\u0142ej wsp\u00f3\u0142czesnej technologii, by je stamt\u0105d wyci\u0105gn\u0105\u0107?<br><br>Wr\u00f3\u0107my do codzienno\u015bci. W projekcie, w kt\u00f3rym pracujemy, dostajemy nowe zadanie: <strong>nowy modu\u0142 do systemu, nad kt\u00f3rym pracujemy, zabezpieczaj\u0105cy dane u\u017cytkownika. Ma by\u0107 kompatybilny z innymi na rynku, bezpieczny, gruntownie przetestowany oraz tak szybki, by jego u\u017cywanie dla ko\u0144cowego u\u017cytkownika by\u0142o niezauwa\u017calne<\/strong>. Zadanie zosta\u0142o oszacowane w poniedzia\u0142ek \u2013 mamy na to tydzie\u0144.<br><br>Im bardziej w ten temat si\u0119 zag\u0142\u0119biamy, tym \u0142atwiej zda\u0107 sobie spraw\u0119, \u017ce bezpiecze\u0144stwo przekazywanych danych nie jest prost\u0105 spraw\u0105. Po drugiej stronie barykady s\u0105 ju\u017c ludzie inteligentniejsi od nas, kt\u00f3rych teraz musimy jako\u015b powstrzyma\u0107.<\/p>\n\n\n\n<p>Na szcz\u0119\u015bcie mam dobr\u0105 wiadomo\u015b\u0107 \u2013 wi\u0119kszo\u015b\u0107 tej pracy ju\u017c jest zrobiona.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dla kogo jest ten artyku\u0142?<\/strong><\/h2>\n\n\n\n<p>Temat jest dosy\u0107 obszerny, a my zajmiemy si\u0119 tutaj tylko niewielkim kawa\u0142kiem kryptografii.<\/p>\n\n\n\n<p>Postaram si\u0119 om\u00f3wi\u0107 tematy od podstaw, aby ka\u017cdy by\u0142 w stanie rozumie\u0107 pe\u0142ny obraz tego, co aktualnie poruszamy. Z tego powodu znajd\u0105 si\u0119 tu fragmenty mog\u0105ce by\u0107 oczywistymi dla bardziej wtajemniczonych.<\/p>\n\n\n\n<p>Mam nadziej\u0119, \u017ce mimo tego zar\u00f3wno kto\u015b dopiero zaczynaj\u0105cy swoj\u0105 przygod\u0119 z programowaniem, jak i kto\u015b zaawansowany, znajdzie tu element chocia\u017c pobudzaj\u0105cy ciekawo\u015b\u0107. Nie wszystko trzeba zrozumie\u0107 od razu i nie wszystko, co proste trzeba pomin\u0105\u0107, \u201eaby nie traci\u0107 czasu\u201d.<\/p>\n\n\n\n<p>Nie ka\u017cda definicja b\u0119dzie wyt\u0142umaczona, wi\u0119c je\u017celi co\u015b nie brzmi znajomo, zach\u0119cam do indywidualnego zg\u0142\u0119bienia znaczenia danego s\u0142owa czy konceptu.<\/p>\n\n\n\n<p>Dane, na kt\u00f3rych b\u0119dziemy pracowa\u0107, b\u0119d\u0105 reprezentowane w formacie szesnastkowym, wi\u0119c je\u017celi nie brzmi to znajomo, zacznijmy od tego: <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Szesnastkowy_system_liczbowy\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >szesnastkowy model liczbowy<\/a>.<\/p>\n\n\n\n<p>Przeczytane? No to zaczynamy!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kocham Standaryzacj\u0119 Trudnych Problem\u00f3w<\/strong><\/h2>\n\n\n\n<p>W 1977 roku opublikowany zosta\u0142 nowy algorytm szyfruj\u0105cy o generycznej nazwie Data Encryption Standard (DES). Opisywa\u0142 on problem bezpiecze\u0144stwa danych i oferowa\u0142 jego algorytmiczne rozwi\u0105zanie. Niestety, wraz ze wzrostem mocy obliczeniowej komputer\u00f3w jego bezpiecze\u0144stwo stopniowo mala\u0142o, a\u017c nadszed\u0142 czas na emerytur\u0119 i szukanie nast\u0119pcy.<\/p>\n\n\n\n<p>W 1997 og\u0142oszono konkurs na algorytm b\u0119d\u0105cy nast\u0119pc\u0105 DES-a. Z wielu propozycji finalnie wygra\u0142 algorytm autorstwa dw\u00f3ch belgijskich kryptolog\u00f3w \u2013 Joana Daemena i Vincenta Rijmena. Po\u0142\u0105czyli swoje nazwiska w chwytliw\u0105 nazw\u0119 Rijndael i po przyj\u0119ciu przez&nbsp;Narodowy Instytut Standaryzacji i Technologii (NIST) sta\u0142 si\u0119 znany \u015bwiatu jako <strong>Advanced Encryption Standard \u2013 AES.<\/strong><\/p>\n\n\n\n<p>(* Pewna klaryfikacja \u2013 sam Rijndael to nie konkretny algorytm, lecz ca\u0142a rodzina szyfr\u00f3w o r\u00f3\u017cnych d\u0142ugo\u015bciach klucza oraz r\u00f3\u017cnych rozmiarach bloku. NIST wybra\u0142 oficjalnie trzech kandydat\u00f3w AES128, AES192 i AES256, ka\u017cdy z blokiem o rozmiarze 128 bit\u00f3w.)<br><br>Ca\u0142a idea jego u\u017cycia dla wi\u0119kszo\u015bci deweloper\u00f3w opiera si\u0119 na traktowaniu go jako certyfikowany black-box. Nie potrzebujemy zna\u0107 szczeg\u00f3\u0142\u00f3w implementacyjnych \u2013 wk\u0142adamy dane, dajemy has\u0142o (klucz) i uzyskujemy wynik, kt\u00f3ry magicznie, za pomoc\u0105 tego samego klucza, mo\u017cemy przetransformowa\u0107 z powrotem w nasze dane wej\u015bciowe.<\/p>\n\n\n\n<p>Szczeg\u00f3\u0142y jego dzia\u0142ania s\u0105 fascynuj\u0105ce. <strong>Co takiego robi z tymi danymi, \u017ce gwarantuje takie bezpiecze\u0144stwo?<\/strong> Zapraszam do zag\u0142\u0119bienia si\u0119 w szczeg\u00f3\u0142y czego\u015b, co otacza nas na ka\u017cdym kroku, w niemal\u017ce ka\u017cdym sprz\u0119cie, w tak wielu codziennych scenariuszach \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nieco \u201einna\u201d matematyka<\/strong><\/h2>\n\n\n\n<p>Zanim zaczniemy rozpracowywa\u0107 nasz algorytm, musimy om\u00f3wi\u0107 pewien problem, kt\u00f3ry pojawia si\u0119, gdy przek\u0142adamy obliczenia, kt\u00f3re chcemy wykona\u0107, na kod.<\/p>\n\n\n\n<p>Liczby w komputerach reprezentowane s\u0105 przez kombinacje bit\u00f3w \u2013 zer i jedynek.<\/p>\n\n\n\n<p>Przez to, \u017ce posiadamy ograniczon\u0105 ilo\u015b\u0107 bit\u00f3w do reprezentacji warto\u015bci (ka\u017cda liczba zajmuje okre\u015blon\u0105 ilo\u015b\u0107 miejsca w pami\u0119ci), operujemy tylko na podzbiorze liczb ca\u0142kowitych oraz wy\u0142\u0105cznie na wymiernych przybli\u017ceniach liczb zmiennoprzecinkowych. Zwyczajnie nie starcza nam kombinacji bit\u00f3w, by zaprezentowa\u0107 ka\u017cd\u0105 mo\u017cliw\u0105 warto\u015b\u0107!<\/p>\n\n\n\n<p>Przyk\u0142adow\u0105 konsekwencj\u0105 tego faktu jest tzw. <strong>problem overflow \u2013 b\u0142\u0105d przepe\u0142nienia<\/strong>. Je\u017celi wykonujemy obliczenia na liczbach o rozmiarze jednego bajtu, przyjmuj\u0105 one warto\u015bci od 0 do 255. Gdy dodajemy dwie liczby do siebie, mo\u017cliwe jest, \u017ce nasz oczekiwany wynik przekroczy \u201emaksymaln\u0105\u201d dopuszczaln\u0105 granic\u0119 warto\u015bci. Nie mo\u017cemy rozwi\u0105za\u0107 tego zwyczajnie, oferuj\u0105c wi\u0119cej miejsca w pami\u0119ci \u2013 to jedynie przesuwa nasz\u0105 granic\u0119 dalej. Niekt\u00f3rych wynik\u00f3w oblicze\u0144 po prostu nie jeste\u015bmy w stanie zaprezentowa\u0107 na X bajtach, mimo, \u017ce cz\u0119\u015bci sk\u0142adowe danych oblicze\u0144 indywidualnie si\u0119 w tym zakresie mieszcz\u0105.<\/p>\n\n\n\n<p>Oznacza to, \u017ce <strong>wychodzimy poza domen\u0119, w kt\u00f3rej nasze operacje maj\u0105 sens<\/strong>. Dla szybkiego przypomnienia, domena danej funkcji f(x) okre\u015bla \u201eczym mo\u017ce by\u0107 x\u201d. Na zaj\u0119ciach matematyki w szkole cz\u0119sto trzeba by\u0142o tak\u0105 domen\u0119 wyznacza\u0107 \u2013 pilnowa\u0107, by\u015bmy przez przypadek nie podzielili gdzie\u015b przez 0, czy nie brali pierwiastka z liczby ujemnej (i chocia\u017c tu mo\u017cna by zrobi\u0107 dygresj\u0119 na temat omini\u0119cia tematu liczb zespolonych w takich przypadkach, zostawmy to w spokoju ;)).<\/p>\n\n\n\n<p>To zal\u0105\u017cek naszego problemu. Matematyka opiera si\u0119 na <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Aksjomaty_i_konstrukcje_liczb\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >aksjomatach<\/a> \u2013 pewnych za\u0142o\u017ceniach, kt\u00f3re traktujemy jako fundamentalne i zak\u0142adamy, \u017ce s\u0105 prawdziwe. Inaczej wszelkie matematyczne dowody musia\u0142by zacz\u0105\u0107 od udowadniania trywialnych z punktu praktycznego rzeczy.<\/p>\n\n\n\n<p>Zerknijmy na jeden z nich i upewnijmy si\u0119, czy ma on dla nas zastosowanie:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"857\" height=\"149\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/1.jpg\" alt=\"\" class=\"wp-image-31693\" style=\"object-fit:cover\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/1.jpg 857w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/1-300x52.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/1-768x134.jpg 768w\" sizes=\"(max-width: 857px) 100vw, 857px\" \/><\/figure>\n\n\n\n<p>I cho\u0107 wygl\u0105da nieco strasznie, ten aksjomat jest podstaw\u0105 do tego, by\u015bmy mogli wykona\u0107 prawid\u0142owo operacj\u0119 dzielenia \u2013 w ko\u0144cu dzielenie to mno\u017cenie przez liczb\u0119 odwrotn\u0105.<\/p>\n\n\n\n<p>Szybko mo\u017cemy zauwa\u017cy\u0107 pewien problem \u2013 tu tak\u017ce dzia\u0142amy w innej domenie. Mamy dost\u0119pne tylko warto\u015bci, kt\u00f3re mieszcz\u0105 si\u0119 nam w jednym bajcie \u2013 od 0 do 255.<\/p>\n\n\n\n<p>No c\u00f3\u017c, spr\u00f3bujmy i tak \u2013 znajd\u017amy odwrotno\u015b\u0107 jakiej\u015b przyk\u0142adowej warto\u015bci: 58<\/p>\n\n\n\n<p>Po przejrzeniu wszystkich kombinacji (mno\u017c\u0105c dwie warto\u015bci i \u201eodcinaj\u0105c\u201d z wyniku wszystko ponad 1 bajt) okazuje si\u0119, \u017ce 58 nie posiada liczby odwrotnej w naszej domenie. Ba, co wi\u0119cej, <strong>\u017cadna liczba parzysta nie posiada liczby odwrotnej<\/strong>! I co z naszym dzieleniem?<\/p>\n\n\n\n<p>Gdyby\u015bmy zacz\u0119li si\u0119 przygl\u0105da\u0107 innym aksjomatom, zobaczymy, \u017ce mamy tu o wiele wi\u0119cej problem\u00f3w. Tradycyjna, znana nam ze szko\u0142y matematyka, okazuje si\u0119 niewystarczaj\u0105ca. I tu, kiedy wszystko wydaje si\u0119 by\u0107 stracone, <strong>pojawia si\u0119 nam Cia\u0142o Sko\u0144czone.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cia\u0142o Sko\u0144czone, GF(2^8)<\/strong><\/h2>\n\n\n\n<p>Aby poradzi\u0107 sobie z wykonywaniem oblicze\u0144 w ograniczonych domenach, AES korzysta z konceptu operacji wewn\u0105trz cia\u0142a sko\u0144czonego znanego tak\u017ce jako cia\u0142a Galois, rz\u0119du 2^8.<\/p>\n\n\n\n<p>Co to w praktyce oznacza?<\/p>\n\n\n\n<p>W ciele sko\u0144czonym mamy \u2013 jak sama nazwa wskazuje \u2013 sko\u0144czon\u0105 ilo\u015b\u0107 element\u00f3w.<\/p>\n\n\n\n<p>Dowolna operacja matematyczna na dw\u00f3ch elementach cia\u0142a sko\u0144czonego ko\u0144czy si\u0119 wynikiem, kt\u00f3ry tak\u017ce do tego cia\u0142a sko\u0144czonego nale\u017cy.<\/p>\n\n\n\n<p>Ka\u017cdy bajt danych mo\u017cna zapisa\u0107 jako wielomian 7 stopnia.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"531\" height=\"58\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/2.jpg\" alt=\"\" class=\"wp-image-31695\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/2.jpg 531w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/2-300x33.jpg 300w\" sizes=\"(max-width: 531px) 100vw, 531px\" \/><\/figure>\n\n\n\n<p>Gdzie b reprezentuje warto\u015b\u0107 bitu na danej pozycji.<\/p>\n\n\n\n<p>Wygl\u0105da znajomo \u2013 przecie\u017c tak wygl\u0105da konwersja pomi\u0119dzy systemem binarnym a decymalnym:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"629\" height=\"57\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/3.jpg\" alt=\"\" class=\"wp-image-31697\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/3.jpg 629w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/3-300x27.jpg 300w\" sizes=\"(max-width: 629px) 100vw, 629px\" \/><\/figure>\n\n\n\n<p>Ka\u017cdy z takich wielomian\u00f3w to element naszego cia\u0142a. Oznacza to, \u017ce posiadamy 256 element\u00f3w (jako, \u017ce ka\u017cdy bajt jest reprezentowany przez inny wielomian, ma 8 bit\u00f3w i ka\u017cdy bit mo\u017ce by\u0107 1 lub 0).<\/p>\n\n\n\n<p>Jednocze\u015bnie operacje matematyczne musz\u0105 spe\u0142nia\u0107 niekt\u00f3re z wybranych aksjomat\u00f3w, by dany zbi\u00f3r mo\u017cna by\u0142o takim cia\u0142em sko\u0144czonym nazwa\u0107.<\/p>\n\n\n\n<p>Aby nasze aksjomaty dodawania, odejmowania, mno\u017cenia i dzielenia by\u0142y poprawne, zmie\u0144my nieco znan\u0105 nam definicj\u0119 tego, co to znaczy dodawa\u0107 i mno\u017cy\u0107 ze sob\u0105 warto\u015bci:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dodawanie w naszym GF b\u0119dziemy realizowa\u0107 przez znany nam XOR.<\/li>\n\n\n\n<li>Mno\u017cenie w naszym GF to mno\u017cenie dw\u00f3ch bajt\u00f3w jako wielomian\u00f3w, modulo odg\u00f3rnie ustalony wielomian wy\u017cszego rz\u0119du. W przypadku AES-a zosta\u0142 wybrany<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"212\" height=\"51\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/4.jpg\" alt=\"\" class=\"wp-image-31699\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"899\" height=\"466\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/5.jpg\" alt=\"\" class=\"wp-image-31701\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/5.jpg 899w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/5-300x156.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/5-768x398.jpg 768w\" sizes=\"(max-width: 899px) 100vw, 899px\" \/><\/figure>\n\n\n\n<p>Pe\u0142ne zrozumienie teorii cia\u0142 sko\u0144czonych zostawiam jako zadanie domowe dla czytelnika \ud83d\ude09<\/p>\n\n\n\n<p>Nie do\u015b\u0107, \u017ce dzi\u0119ki temu jeste\u015bmy w stanie doda\u0107, odj\u0105\u0107, pomno\u017cy\u0107 i podzieli\u0107 przez siebie dowolne bajty, mamy gwarancj\u0119, \u017ce nigdy nie zostanie nam reszta z dzielenia (powoduj\u0105ca pewn\u0105 strat\u0119 informacji, je\u017celi by\u015bmy jej prawid\u0142owo nie obs\u0142u\u017cyli), ani nigdy nie wyjdziemy poza zakres jednego bajtu \u2013 od razu rozwi\u0105zuj\u0105c nasz problem overflow! <strong>I oto mamy ca\u0142y matematyczny \u015bwiat dost\u0119pny do bezpiecznego przetwarzania danych!<\/strong><\/p>\n\n\n\n<p>W ramach ciekawostki \u2013 Cia\u0142o Galois 2^8 jest perfekcyjne do pracy z bajtami, lecz ca\u0142y koncept cia\u0142 sko\u0144czonych pierwszy raz zosta\u0142 og\u0142oszony \u015bwiatu przez E. H. Moore\u2019a w roku\u2026 1893. I tak jak transformata Fouriera, kt\u00f3ra towarzyszy nam nieod\u0142\u0105cznie w \u015bwiecie przetwarzania sygna\u0142\u00f3w, niekt\u00f3re rzeczy znajduj\u0105 swoje zastosowania dopiero po jakim\u015b \u2013 niekiedy i wielopokoleniowym \u2013 czasie. <strong>St\u0105d ostrzeg\u0142bym o rych\u0142ym m\u00f3wieniu \u201ea po co to komu\u201d w kontek\u015bcie matematycznych odkry\u0107 \ud83d\ude09<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nieco o kryptografii<\/strong><\/h2>\n\n\n\n<p>Kryptografia to z\u0142o\u017cony temat. Sam algorytm le\u017cy u jej podstaw, lecz aby zapewni\u0107 odpowiedni poziom bezpiecze\u0144stwa, dane na kt\u00f3rych pracujemy i klucze, kt\u00f3re mamy dost\u0119pne, przechodz\u0105 skomplikowan\u0105 tras\u0119.<\/p>\n\n\n\n<p>Jak wymieni\u0107 klucze daj\u0105ce de facto dost\u0119p do naszych danych pomi\u0119dzy nadawc\u0105 a odbiorc\u0105? Jak chroni\u0107 sam algorytm, by metod\u0105 pr\u00f3b i b\u0142\u0119d\u00f3w nie m\u00f3c wydedukowa\u0107 naszego sekretnego klucza? Tym akurat zajmowa\u0107 si\u0119 nie b\u0119dziemy, gdy\u017c, cho\u0107 pasjonuj\u0105ce (dla zapewne konkretnego typu cz\u0142owieka), miejsca na p\u00f3\u0142ce by nie starczy\u0142o, by przechowa\u0107 o tym ca\u0142\u0105 literatur\u0119 w domu.<\/p>\n\n\n\n<p>Roz\u0142\u00f3\u017cmy cz\u0119sto pojawiaj\u0105cy si\u0119 skr\u00f3t na cz\u0119\u015bci pierwsze.<br><br>Kto zajmowa\u0142 si\u0119 kryptografi\u0105, m\u00f3g\u0142 zobaczy\u0107 przyk\u0142adowy ci\u0105g znak\u00f3w:<\/p>\n\n\n\n<p><strong>AES128-GCM AEAD<\/strong>. Co to ze sob\u0105 niesie?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AES<\/strong> \u2013 Advanced Encryption Standard, czyli nasz algorytm.<\/li>\n\n\n\n<li><strong>128 <\/strong>\u2013 d\u0142ugo\u015b\u0107 u\u017cywanego klucza, w bitach. Wspierane s\u0105 klucze o d\u0142ugo\u015bci 128, 192 lub 256 bit\u00f3w.<\/li>\n\n\n\n<li><strong>GCM <\/strong>\u2013 Galois Counter Mode. Tryb enkrypcji, kt\u00f3ry okre\u015bla, jak dany blok podczas szyfrowania wp\u0142ywa na kolejny.<\/li>\n\n\n\n<li><strong>AEAD <\/strong>\u2013 Authenticated Encryption with Associated Data. Dodatkowa gwarancja integralno\u015bci danych, kt\u00f3re przekazujemy.<\/li>\n<\/ul>\n\n\n\n<p>W tym tek\u015bcie <strong>zajmiemy si\u0119 wy\u0142\u0105cznie AES-ow\u0105 cz\u0119\u015bci\u0105 enkrypcji, czyli szczeg\u00f3\u0142ami algorytmu szyfruj\u0105cego ka\u017cdy blok danych<\/strong>. O w\u0142a\u015bnie, blok. Co to w zasadzie znaczy?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Koncept AES-a<\/strong><\/h2>\n\n\n\n<p>AES jest algorytmem blokowym. Oznacza to, \u017ce w danym momencie operujemy tylko na ograniczonej ilo\u015bci danych i dokonujemy transformacji na nich, by wygenerowa\u0107 nasz finalny szyfr. B\u0119dzie on pochodn\u0105 danych wej\u015bciowych oraz tajnego klucza dost\u0119pnego tylko dla stron, kt\u00f3re b\u0119d\u0105 si\u0119 ze sob\u0105 komunikowa\u0107.<br><br>Jeden blok sk\u0142ada si\u0119 z 16 bajt\u00f3w \u2013 128 bit\u00f3w. Na samym pocz\u0105tku, \u0142adujemy nasze dane wej\u015bciowe do AES-owego \u201estanu\u201d. Jest on tablic\u0105 o wymiarach 4&#215;4, na kt\u00f3rej owe transformacje b\u0119dziemy wykonywa\u0107.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim_Input_to_state.mp4\"><\/video><\/figure>\n\n\n\n<p>Nast\u0119pnie wykonujemy N rund, gdzie N jest odg\u00f3rnie ustalon\u0105 warto\u015bci\u0105 w zale\u017cno\u015bci od d\u0142ugo\u015bci klucza (10,12,14 rund dla kluczy o d\u0142ugo\u015bci 128,192,256 bit\u00f3w), gdzie ka\u017cda runda to zestaw operacji:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Podmiana bajt\u00f3w (<em>SUB BYTES)<\/em><\/strong><\/h3>\n\n\n\n<p>Ka\u017cdy z bajt\u00f3w w stanie jest zamieniany na inny na podstawie swojej warto\u015bci, korzystaj\u0105c z tak zwanego S-Boxa (o S-boxie powiemy sobie nieco p\u00f3\u017aniej)<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim_Sub_Bytes.mp4\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Przesuni\u0119cie rz\u0119d\u00f3w (SHIFT ROWS)<\/strong><\/h3>\n\n\n\n<p>Ka\u017cdy z rz\u0119d\u00f3w przesuwamy o M pozycji w lewo, gdzie M to indeks danego rz\u0119du (zaczynaj\u0105c od indeksu 0):<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim_Shift_Rows-1.mp4\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Mieszanie kolumn (MIX COLUMNS)<\/strong><\/h3>\n\n\n\n<p>Mieszamy kolumny stanu, by ka\u017cdy bajt wp\u0142ywa\u0142 na wszystkie inne w danej kolumnie. Dokonywane jest to przez proste mno\u017cenie macierzy, gdzie traktujemy nasz\u0105 kolumn\u0119 jako macierz 4&#215;1, przez kt\u00f3r\u0105 mno\u017cymy sta\u0142\u0105 macierz:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"526\" height=\"152\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/6.jpg\" alt=\"\" class=\"wp-image-31712\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/6.jpg 526w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/6-300x87.jpg 300w\" sizes=\"(max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim_Mix_columns.mp4\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. Dodanie klucza rundy (ADD ROUND KEY)<\/strong><\/h3>\n\n\n\n<p>Do stanu dodajemy warto\u015b\u0107 klucza dla danej rundy. O kluczu rundy powiemy sobie tak\u017ce p\u00f3\u017aniej.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim_Add_round_key.mp4\"><\/video><\/figure>\n\n\n\n<p>W dok\u0142adnej implementacji, przed pierwsz\u0105 rund\u0105 wykonujemy dodatkow\u0105 operacj\u0119 ADD ROUND KEY, a w ostatniej rundzie pomijamy MIX COLUMNS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>AES S-Box<\/strong><\/h2>\n\n\n\n<p>AES Substitution Box, znany jako AES S-Box, jest fundamentaln\u0105 cz\u0119\u015bci\u0105 algorytmu. Mo\u017cna go przedstawi\u0107 w formie tabeli z szesnastkowymi warto\u015bciami. Kiedy w dowolnym momencie algorytmu robimy operacj\u0119 podmiany z S-Boxem, oznacza to, \u017ce zast\u0119pujemy dany bajt innym. G\u00f3rne 4 bity naszego podmienianego bajtu okre\u015blaj\u0105 nam rz\u0105d, a dolne 4 bity okre\u015blaj\u0105 kolumn\u0119 w owym S-Boxie, kt\u00f3ra tego bajtu dotyczy.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"1025\" height=\"707\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/S_Box-02.png\" alt=\"\" class=\"wp-image-31718\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/S_Box-02.png 1025w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/S_Box-02-300x207.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/S_Box-02-768x530.png 768w\" sizes=\"(max-width: 1025px) 100vw, 1025px\" \/><\/figure>\n\n\n\n<p>Dane wewn\u0105trz nie wzi\u0119\u0142y si\u0119 oczywi\u015bcie z niczego. Mo\u017cna skonstruowa\u0107 takiego S-Boxa, wyliczaj\u0105c go przy ka\u017cdej okazji, gdy jest potrzebny, lecz dla wygody i szybko\u015bci, praktycznie zawsze jest dost\u0119pny jako tzw. lookup table, obliczony (lub zwyczajnie przekopiowany) zawczasu i trzymany w statycznej pami\u0119ci RAM.<\/p>\n\n\n\n<p>Fakt, \u017ce S-Box jest publicznie znany i zawsze taki sam okaza\u0142 si\u0119 pewn\u0105 s\u0142abo\u015bci\u0105 tego algorytmu.<\/p>\n\n\n\n<p><a href=\"https:\/\/tches.iacr.org\/index.php\/TCHES\/article\/view\/8548\/8113\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Odnaleziono<\/a>, i\u017c istnieje Persistent Fault Attack (PFA), gdzie atakuj\u0105cy strzela laserem w pami\u0119\u0107 dzia\u0142aj\u0105cego urz\u0105dzenia elektronicznego i zmienia warto\u015b\u0107 jednego z bajt\u00f3w S-Boxa. Taki bajt pozostaje zmieniony a\u017c do resetu urz\u0105dzenia i mimo braku znajomo\u015bci, kt\u00f3ry z tych bajt\u00f3w ani na jak\u0105 warto\u015b\u0107 zosta\u0142 zmieniony, tw\u00f3rcy tego dokumentu wyci\u0105gn\u0119li sekretny klucz AES-a w 1641 szyfrach.<\/p>\n\n\n\n<p>Spos\u00f3b poradzenia sobie z takowym PFA proponowany przez autor\u00f3w, to trzymanie znanego wyniku szyfrowania pewnych sta\u0142ych danych wej\u015bciowych i weryfikowanie go, dokonuj\u0105c takiego szyfrowania za ka\u017cdym razem, kiedy dokonujemy operacji na \u201eprawdziwych\u201d danych. Jest to jednak czasoch\u0142onne, a jednocze\u015bnie potrzebny by\u0142by taki ci\u0105g danych wej\u015bciowych, kt\u00f3ry \u201edotyka\u201d ka\u017cdego bajtu z S-Boxa.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.researchgate.net\/publication\/352427642_A_Fast-Detection_and_Fault-Correction_Algorithm_against_Persistent_Fault_Attack\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Ukaza\u0142a si\u0119 ciekawa praca naukowa<\/a> na temat tej s\u0142abo\u015bci i dodatkowej idei, jak z ni\u0105 walczy\u0107. Obejmuje ona wykorzystanie faktu, \u017ce wewn\u0105trz AES-owego S-Boxa mo\u017cna znale\u017a\u0107 5 zamkni\u0119tych p\u0119tli. Na tej podstawie tw\u00f3rcy dokumentu zaproponowali algorytm wykrywania PFA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Key Expansion<\/strong><\/h2>\n\n\n\n<p>Jako, \u017ce AES sk\u0142ada si\u0119 z wielu rund, a klucz, jaki jest u\u017cywany, to jedyna niejawna cz\u0119\u015b\u0107 ca\u0142ego algorytmu, ka\u017cda runda AES-a u\u017cywa innego klucza.<\/p>\n\n\n\n<p><strong>\u201eAle chwileczk\u0119, przecie\u017c klucz nie jest tak d\u0142ugi, nie starczy go na wszystkie rundy\u201d<\/strong> powiesz Ty, uwa\u017cny czytelniku. Fakt!<\/p>\n\n\n\n<p>Do tego wytworzony zosta\u0142 algorytm rozszerzenia klucza. Nie musimy zag\u0142\u0119bia\u0107 si\u0119 w jego szczeg\u00f3\u0142y, lecz, opisuj\u0105c w skr\u00f3cie, u\u017cywa on podobnie jak sam AES kombinacji operacji podmiany bajt\u00f3w z S-Boxem (SUB BYTES), rotacji bajt\u00f3w (SHIFT ROWS) oraz operacji XOR z odg\u00f3rnie okre\u015blon\u0105 warto\u015bci\u0105 nazywan\u0105 \u201esta\u0142\u0105 rundy\u201d, aby finalnie stworzy\u0107 unikatowy 16-bajtowy klucz dla ka\u017cdej rundy naszego AES-a, ca\u0142kowicie pochodny od naszego pocz\u0105tkowego klucza.<\/p>\n\n\n\n<p>Zainteresowanych odsy\u0142am <a href=\"https:\/\/www.nist.gov\/publications\/advanced-encryption-standard-aes\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >do oficjalnego NIST-owego dokumentu<\/a> opisuj\u0105cego szczeg\u00f3\u0142y ka\u017cdego etapu algorytmu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Propagacja wp\u0142ywu danych wej\u015bciowych<\/strong><\/h2>\n\n\n\n<p>Ka\u017cdy z temat\u00f3w jest swoist\u0105 kr\u00f3licz\u0105 nor\u0105, kt\u00f3r\u0105 mo\u017cna zg\u0142\u0119bia\u0107 oraz dokopywa\u0107 si\u0119 bada\u0144 i odkry\u0107 (Sk\u0105d taka warto\u015b\u0107? Dlaczego akurat tak?). Chcia\u0142em jednak jeszcze powr\u00f3ci\u0107 do w\u0105tku wp\u0142ywu naszego klucza na dane wej\u015bciowe.<\/p>\n\n\n\n<p>Ca\u0142y algorytm jest jawnie opisany. Na bitach, kt\u00f3re przekazujemy w kluczu, spoczywa wi\u0119c obowi\u0105zek ukrycia danych wej\u015bciowych. <strong>Dlatego prze\u015bled\u017amy jeden z bajt\u00f3w klucza<\/strong>.<\/p>\n\n\n\n<p>Poni\u017cej <strong>mo\u017cemy zaobserwowa\u0107 symulacj\u0119 jednej rundy AES-a nie pod k\u0105tem warto\u015bci a wp\u0142ywu danych wzajemnie na siebie<\/strong>. Wybra\u0142em losowy bajt w kluczu i zmieni\u0142em jego t\u0142o na niebieskawe. Kiedy ten konkretny bajt klucza b\u0119dzie mia\u0142 wp\u0142yw na jak\u0105\u015b \u201ekom\u00f3rk\u0119\u201d (bajt) stanu, jej kolor si\u0119 zmieni.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/AES_Anim.mp4\"><\/video><\/figure>\n\n\n\n<p>Jak wida\u0107, ju\u017c zaledwie po dw\u00f3ch rundach, nasz wybrany bajt wp\u0142yn\u0105\u0142 na ka\u017cd\u0105 kom\u00f3rk\u0119 stanu. Nie uwzgl\u0119dniamy w tej symulacji faktu, \u017ce klucze kolejnych rund s\u0105 pochodne od naszego oryginalnego klucza, wi\u0119c poza tym, co widzimy na animacji, nasz wybrany bajt z oryginalnego klucza wp\u0142ywa dodatkowo na dane w ka\u017cdej p\u00f3\u017aniejszej rundzie.<\/p>\n\n\n\n<p>To tak\u017ce dobrze obrazuje dlaczego runda AES-a sk\u0142ada si\u0119 z tych konkretnych krok\u00f3w.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SUB WORDS \u2013 zapewnia, \u017ce pojedynczy bit ma wp\u0142yw na zmian\u0119 warto\u015bci wszystkich innych bit\u00f3w w bajcie w kt\u00f3rym si\u0119 zawiera, gdy\u017c zmiana dowolnego z nich spowoduje zast\u0105pienie ca\u0142ego bajtu zupe\u0142nie inn\u0105 warto\u015bci\u0105 z S-Boxa.<\/li>\n\n\n\n<li>MIX COLUMNS \u2013 zapewnia, \u017ce zmiana jednego bajtu wp\u0142ywa na wszystkie pozosta\u0142e w tej samej kolumnie stanu, propaguj\u0105c zmian\u0119 bajtu \u201ew pionie\u201d.<\/li>\n\n\n\n<li>SHIFT ROWS \u2013 zapewnia, \u017ce ka\u017cda kolumna b\u0119dzie posiada\u0142a po jednym bajcie z ka\u017cdej pozosta\u0142ej, propaguj\u0105c zmian\u0119 bajtu \u201ew poziomie\u201d.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-m.jpg\" alt=\"\" class=\"wp-image-31723\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-m.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-m-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Na zako\u0144czenie<\/strong><\/h2>\n\n\n\n<p>Wyja\u015bnienie szczeg\u00f3\u0142\u00f3w algorytmicznych opar\u0142em na ich fundamentalnej idei zgodnie z oficjaln\u0105 dokumentacj\u0105. Wa\u017cne jest jednak, aby pami\u0119ta\u0107, \u017ce te funkcje i algorytmy maj\u0105 du\u017co miejsca do optymalizacji.<\/p>\n\n\n\n<p>W praktycznych zastosowaniach faktyczna implementacja mo\u017ce si\u0119 znacz\u0105co r\u00f3\u017cni\u0107 lub nawet by\u0107 dopasowana do danego scenariusza u\u017cycia. Przyk\u0142adowo, je\u017celi wiadomym jest, \u017ce chcemy korzysta\u0107 wy\u0142\u0105cznie z AES-128, algorytm rozszerzenia klucza mo\u017cna znacz\u0105co upro\u015bci\u0107. Mno\u017cenie w GF(2^8) mo\u017cna zaimplementowa\u0107 na wiele r\u00f3\u017cnych sposob\u00f3w. I tak dalej\u2026<\/p>\n\n\n\n<p>Wszystkie etapy opisane tutaj dotyczy\u0142y procesu szyfrowania. Deszyfrowanie dokonywane jest analogicznie \u201eod ty\u0142u\u201d, gdzie trzeba korzysta\u0107 z innego S-Boxa, kt\u00f3ry jest oczywi\u015bcie znacz\u0105co spokrewniony z tym ju\u017c nam znanym. <strong>Jako dobre \u0107wiczenie polecam zerkn\u0105\u0107 sobie na tzw. InvSBox (Inverse S-Box) i zastanowi\u0107 si\u0119, dlaczego w danym miejscu znajduje si\u0119 akurat taka warto\u015b\u0107 \ud83d\ude09<\/strong><\/p>\n\n\n\n<p>Animacje widoczne w tym artykule zosta\u0142y wygenerowane za pomoc\u0105 <a href=\"https:\/\/www.manim.community\/\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >biblioteki manim<\/a>. Dane do wizualizacji pobrane zosta\u0142y bezpo\u015brednio z zaprogramowanego AES-a zgodnie z <a href=\"https:\/\/www.nist.gov\/publications\/advanced-encryption-standard-aes\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >NIST-ow\u0105 dokumentacj\u0105<\/a>.<\/p>\n\n\n\n<p><br><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;31692&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;AES od \u015brodka&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u017byjemy w \u015bwiecie zdominowanym przez transmisj\u0119 danych za po\u015brednictwem r\u00f3\u017cnych medi\u00f3w. Bezpiecze\u0144stwo tej transmisji traktujemy jako oczywisto\u015b\u0107 i wiele o &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/aes-od-srodka\/\">Continued<\/a><\/p>\n","protected":false},"author":726,"featured_media":31725,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2855,1512,563,846],"class_list":["post-31692","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-aes","tag-poradnik","tag-embedded","tag-kryptografia"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/Code-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31692"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/726"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=31692"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31692\/revisions"}],"predecessor-version":[{"id":31743,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31692\/revisions\/31743"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/31725"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=31692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=31692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=31692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}