{"id":1566,"date":"2026-04-30T11:33:33","date_gmt":"2026-04-30T09:33:33","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1566"},"modified":"2026-04-30T11:33:34","modified_gmt":"2026-04-30T09:33:34","slug":"szyfr-cezara","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/30\/szyfr-cezara\/","title":{"rendered":"Szyfr Cezara"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Szyfrowanie podstawieniowe to najprostsza klasa technik kryptograficznych, w kt\u00f3rych ka\u017cda litera tekstu jawnego jest zast\u0119powana inn\u0105 liter\u0105 wed\u0142ug ustalonej regu\u0142y. Mechanizm jest deterministyczny, \u0142atwy do implementacji i zrozumienia, a jednocze\u015bnie dobrze pokazuje podstawowe poj\u0119cia kryptografii: klucz, przestrze\u0144 kluczy, operacje na alfabetach i podatno\u015b\u0107 na ataki analityczne. Historycznie wykorzystywano go do ochrony kr\u00f3tkich komunikat\u00f3w, dzi\u015b pe\u0142ni g\u0142\u00f3wnie rol\u0119 dydaktyczn\u0105 i wprowadza do my\u015blenia o szyfrach klasycznych, gdzie transformacja danych odbywa si\u0119 na poziomie symboli, a nie bit\u00f3w, czego przyk\u0142adem jest Szyfr Cezara.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#szyfr-cezara-jako-przyklad-szyfru-podstawieniowego-z-przesunieciem-cyklicznym-i-ograniczeniami-wynikajacymi-z-malej-przestrzeni-kluczy\">Szyfr Cezara jako przyk\u0142ad szyfru podstawieniowego z przesuni\u0119ciem cyklicznym i ograniczeniami wynikaj\u0105cymi z ma\u0142ej przestrzeni kluczy<\/a><ol><li><a href=\"#wzor-matematyczny-i-przyklad-obliczeniowy\">Wz\u00f3r matematyczny i przyk\u0142ad obliczeniowy<\/a><\/li><\/ol><\/li><li><a href=\"#implementacja-algorytmu-szyfr-cezara-w-jezykach-c-c-i-python-z-uwzglednieniem-operacji-na-kodach-znakow-ascii\">Implementacja algorytmu Szyfr Cezara w j\u0119zykach C, C++ i Python z uwzgl\u0119dnieniem operacji na kodach znak\u00f3w ASCII<\/a><ol><li><a href=\"#c\">C<\/a><\/li><li><a href=\"#c-1\">C++<\/a><\/li><li><a href=\"#python\">Python<\/a><\/li><\/ol><\/li><li><a href=\"#analiza-bezpieczenstwa-szyfr-cezara-z-perspektywy-kryptografii-klasycznej-i-praktycznych-metod-lamania\">Analiza bezpiecze\u0144stwa Szyfr Cezara z perspektywy kryptografii klasycznej i praktycznych metod \u0142amania<\/a><ol><li><a href=\"#atak-brute-force\">Atak brute-force<\/a><\/li><li><a href=\"#analiza-czestotliwosci\">Analiza cz\u0119stotliwo\u015bci<\/a><\/li><\/ol><\/li><li><a href=\"#rozszerzenia-i-warianty-szyfr-cezara-stosowane-w-praktyce-dydaktycznej-oraz-ich-ograniczenia\">Rozszerzenia i warianty Szyfr Cezara stosowane w praktyce dydaktycznej oraz ich ograniczenia<\/a><ol><li><a href=\"#rot-13\">ROT13<\/a><\/li><li><a href=\"#alfabet-rozszerzony\">Alfabet rozszerzony<\/a><\/li><li><a href=\"#szyfr-z-kluczem-tekstowym\">Szyfr z kluczem tekstowym<\/a><\/li><\/ol><\/li><li><a href=\"#uwagi-praktyczne-wynikajace-z-implementacji-i-typowych-bledow-poczatkujacych\">Uwagi praktyczne wynikaj\u0105ce z implementacji i typowych b\u0142\u0119d\u00f3w pocz\u0105tkuj\u0105cych<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"szyfr-cezara-jako-przyklad-szyfru-podstawieniowego-z-przesunieciem-cyklicznym-i-ograniczeniami-wynikajacymi-z-malej-przestrzeni-kluczy\">Szyfr Cezara jako przyk\u0142ad szyfru podstawieniowego z przesuni\u0119ciem cyklicznym i ograniczeniami wynikaj\u0105cymi z ma\u0142ej przestrzeni kluczy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Szyfr polega na przesuni\u0119ciu ka\u017cdej litery alfabetu o sta\u0142\u0105 liczb\u0119 pozycji. Je\u015bli alfabet ma rozmiar <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>N<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">N<\/annotation><\/semantics><\/math>N, to operacja odbywa si\u0119 modulo <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>N<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">N<\/annotation><\/semantics><\/math>N. Dla alfabetu \u0142aci\u0144skiego bez znak\u00f3w diakrytycznych <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>N<\/mi><mo>=<\/mo><mn>26<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">N = 26<\/annotation><\/semantics><\/math>N=26. Klucz to liczba ca\u0142kowita <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>k<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">k<\/annotation><\/semantics><\/math>k, gdzie <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mn>0<\/mn><mo>\u2264<\/mo><mi>k<\/mi><mo>&lt;<\/mo><mi>N<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">0 \\le k &lt; N<\/annotation><\/semantics><\/math>0\u2264k&lt;N.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ka\u017cdej literze przypisuje si\u0119 indeks (A=0, B=1, &#8230;, Z=25)<\/li>\n\n\n\n<li>szyfrowanie: <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>c<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mi>p<\/mi><mo>+<\/mo><mi>k<\/mi><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mi>N<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">c = (p + k) \\mod N<\/annotation><\/semantics><\/math>c=(p+k)modN<\/li>\n\n\n\n<li>deszyfrowanie: <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>p<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mi>c<\/mi><mo>\u2212<\/mo><mi>k<\/mi><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mi>N<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">p = (c &#8211; k) \\mod N<\/annotation><\/semantics><\/math>p=(c\u2212k)modN<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To przesuni\u0119cie jest cykliczne, wi\u0119c po Z wracamy do A. W praktyce oznacza to, \u017ce tekst \u201eABC\u201d przy kluczu <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>k<\/mi><mo>=<\/mo><mn>3<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">k=3<\/annotation><\/semantics><\/math>k=3 daje \u201eDEF\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wzor-matematyczny-i-przyklad-obliczeniowy\">Wz\u00f3r matematyczny i przyk\u0142ad obliczeniowy<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Zapis<\/th><\/tr><\/thead><tbody><tr><td>Szyfrowanie<\/td><td><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>c<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mi>p<\/mi><mo>+<\/mo><mi>k<\/mi><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mn>26<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">c = (p + k) \\mod 26<\/annotation><\/semantics><\/math>c=(p+k)mod26<\/td><\/tr><tr><td>Deszyfrowanie<\/td><td><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>p<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mi>c<\/mi><mo>\u2212<\/mo><mi>k<\/mi><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mn>26<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">p = (c &#8211; k) \\mod 26<\/annotation><\/semantics><\/math>p=(c\u2212k)mod26<\/td><\/tr><tr><td>Przyk\u0142ad<\/td><td><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>p<\/mi><mo>=<\/mo><mn>2<\/mn><mo stretchy=\"false\">(<\/mo><mi>C<\/mi><mo stretchy=\"false\">)<\/mo><mo separator=\"true\">,<\/mo><mi>k<\/mi><mo>=<\/mo><mn>3<\/mn><mo>\u21d2<\/mo><mi>c<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mn>2<\/mn><mo>+<\/mo><mn>3<\/mn><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mn>26<\/mn><mo>=<\/mo><mn>5<\/mn><mo stretchy=\"false\">(<\/mo><mi>F<\/mi><mo stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">p = 2 (C), k = 3 \\Rightarrow c = (2+3) \\mod 26 = 5 (F)<\/annotation><\/semantics><\/math>p=2(C),k=3\u21d2c=(2+3)mod26=5(F)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Istotna w\u0142a\u015bciwo\u015b\u0107: przestrze\u0144 kluczy ma tylko 26 mo\u017cliwych warto\u015bci. To oznacza, \u017ce atak brute-force jest trywialny &#8211; mo\u017cna sprawdzi\u0107 wszystkie mo\u017cliwo\u015bci w czasie sta\u0142ym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"implementacja-algorytmu-szyfr-cezara-w-jezykach-c-c-i-python-z-uwzglednieniem-operacji-na-kodach-znakow-ascii\">Implementacja algorytmu Szyfr Cezara w j\u0119zykach C, C++ i Python z uwzgl\u0119dnieniem operacji na kodach znak\u00f3w ASCII<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Implementacja opiera si\u0119 na pracy na kodach ASCII. Litery 'A&#8217;\u2013&#8217;Z&#8217; i 'a&#8217;\u2013&#8217;z&#8217; maj\u0105 r\u00f3\u017cne zakresy, wi\u0119c trzeba je traktowa\u0107 osobno.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c\">C<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>&#8222;`c<\/td><\/tr><tr><td>#include &lt;stdio.h&gt;<\/td><\/tr><tr><td><\/td><\/tr><tr><td>char encrypt(char c, int k) {<\/td><\/tr><tr><td>if (c &gt;= 'A&#8217; &amp;&amp; c &lt;= 'Z&#8217;)<\/td><\/tr><tr><td>return (c &#8211; 'A&#8217; + k) % 26 + 'A&#8217;;<\/td><\/tr><tr><td>if (c &gt;= 'a&#8217; &amp;&amp; c &lt;= 'z&#8217;)<\/td><\/tr><tr><td>return (c &#8211; 'a&#8217; + k) % 26 + 'a&#8217;;<\/td><\/tr><tr><td>return c;<\/td><\/tr><tr><td>}<\/td><\/tr><tr><td><\/td><\/tr><tr><td>int main() {<\/td><\/tr><tr><td>char text[] = &#8222;Hello&#8221;;<\/td><\/tr><tr><td>int k = 3;<\/td><\/tr><tr><td>for (int i = 0; text[i]; i++)<\/td><\/tr><tr><td>text[i] = encrypt(text[i], k);<\/td><\/tr><tr><td>printf(&#8222;%s\\n&#8221;, text);<\/td><\/tr><tr><td>return 0;<\/td><\/tr><tr><td>}<\/td><\/tr><tr><td>&#8222;`<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"c-1\">C++<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>&#8222;`cpp<\/td><\/tr><tr><td>#include &lt;iostream&gt;<\/td><\/tr><tr><td>using namespace std;<\/td><\/tr><tr><td><\/td><\/tr><tr><td>char encrypt(char c, int k) {<\/td><\/tr><tr><td>if (isupper(c))<\/td><\/tr><tr><td>return (c &#8211; 'A&#8217; + k) % 26 + 'A&#8217;;<\/td><\/tr><tr><td>if (islower(c))<\/td><\/tr><tr><td>return (c &#8211; 'a&#8217; + k) % 26 + 'a&#8217;;<\/td><\/tr><tr><td>return c;<\/td><\/tr><tr><td>}<\/td><\/tr><tr><td><\/td><\/tr><tr><td>int main() {<\/td><\/tr><tr><td>string text = &#8222;Hello&#8221;;<\/td><\/tr><tr><td>int k = 3;<\/td><\/tr><tr><td>for (char &amp;c : text)<\/td><\/tr><tr><td>c = encrypt(c, k);<\/td><\/tr><tr><td>cout &lt;&lt; text &lt;&lt; endl;<\/td><\/tr><tr><td>}<\/td><\/tr><tr><td>&#8222;`<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"python\">Python<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>&#8222;`python<\/td><\/tr><tr><td>def encrypt(text, k):<\/td><\/tr><tr><td>result = &#8222;&#8221;<\/td><\/tr><tr><td>for c in text:<\/td><\/tr><tr><td>if c.isupper():<\/td><\/tr><tr><td>result += chr((ord(c) &#8211; 65 + k) % 26 + 65)<\/td><\/tr><tr><td>elif c.islower():<\/td><\/tr><tr><td>result += chr((ord(c) &#8211; 97 + k) % 26 + 97)<\/td><\/tr><tr><td>else:<\/td><\/tr><tr><td>result += c<\/td><\/tr><tr><td>return result<\/td><\/tr><tr><td><\/td><\/tr><tr><td>print(encrypt(&#8222;Hello&#8221;, 3))<\/td><\/tr><tr><td>&#8222;`<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda implementacja robi dok\u0142adnie to samo: przelicza znak na indeks, dodaje przesuni\u0119cie i wraca do znaku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"analiza-bezpieczenstwa-szyfr-cezara-z-perspektywy-kryptografii-klasycznej-i-praktycznych-metod-lamania\">Analiza bezpiecze\u0144stwa Szyfr Cezara z perspektywy kryptografii klasycznej i praktycznych metod \u0142amania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Szyfr nie zapewnia realnego bezpiecze\u0144stwa. Powody:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ma\u0142a przestrze\u0144 kluczy (26 mo\u017cliwo\u015bci)<\/li>\n\n\n\n<li>Zachowanie struktury j\u0119zyka (cz\u0119stotliwo\u015b\u0107 liter nie znika)<\/li>\n\n\n\n<li>Brak dyfuzji i konfuzji (poj\u0119cia z teorii Shannona)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"atak-brute-force\">Atak brute-force<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sprawdzenie wszystkich mo\u017cliwych kluczy:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>&#8222;`python<\/td><\/tr><tr><td>def brute_force(text):<\/td><\/tr><tr><td>for k in range(26):<\/td><\/tr><tr><td>print(k, encrypt(text, -k))<\/td><\/tr><tr><td>&#8222;`<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik daje wszystkie mo\u017cliwe odszyfrowania &#8211; cz\u0142owiek rozpoznaje poprawny tekst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"analiza-czestotliwosci\">Analiza cz\u0119stotliwo\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stsze litery w j\u0119zyku polskim i angielskim:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>E, A, O, I<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli w szyfrogramie najcz\u0119\u015bciej wyst\u0119puje np. litera X, mo\u017cna przypuszcza\u0107, \u017ce odpowiada ona literze E.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Proces:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>policz cz\u0119sto\u015bci<\/li>\n\n\n\n<li>dopasuj przesuni\u0119cie<\/li>\n\n\n\n<li>zweryfikuj r\u0119cznie<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">To dzia\u0142a szczeg\u00f3lnie dobrze dla d\u0142ugich tekst\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rozszerzenia-i-warianty-szyfr-cezara-stosowane-w-praktyce-dydaktycznej-oraz-ich-ograniczenia\">Rozszerzenia i warianty Szyfr Cezara stosowane w praktyce dydaktycznej oraz ich ograniczenia<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"rot-13\">ROT13<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Specjalny przypadek, gdzie <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>k<\/mi><mo>=<\/mo><mn>13<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">k = 13<\/annotation><\/semantics><\/math>k=13<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>c<\/mi><mo>=<\/mo><mo stretchy=\"false\">(<\/mo><mi>p<\/mi><mo>+<\/mo><mn>13<\/mn><mo stretchy=\"false\">)<\/mo><mspace><\/mspace><mspace width=\"0.6667em\"><\/mspace><mrow><mi mathvariant=\"normal\">m<\/mi><mi mathvariant=\"normal\">o<\/mi><mi mathvariant=\"normal\">d<\/mi><\/mrow><mtext>\u2009<\/mtext><mtext>\u2009<\/mtext><mn>26<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">c = (p + 13) \\mod 26<\/annotation><\/semantics><\/math>c=(p+13)mod26<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cechy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>szyfrowanie = deszyfrowanie<\/li>\n\n\n\n<li>stosowany do maskowania tekstu (np. spoilery)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"alfabet-rozszerzony\">Alfabet rozszerzony<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cna u\u017cy\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>polskich znak\u00f3w (\u0105, \u0107, \u0119&#8230;)<\/li>\n\n\n\n<li>cyfr<\/li>\n\n\n\n<li>znak\u00f3w specjalnych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Problem: trzeba jawnie zdefiniowa\u0107 alfabet i jego kolejno\u015b\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"szyfr-z-kluczem-tekstowym\">Szyfr z kluczem tekstowym<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zamiast liczby:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>klucz = s\u0142owo<\/li>\n\n\n\n<li>ka\u017cda litera daje przesuni\u0119cie<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To prowadzi do szyfru Vigen\u00e8re\u2019a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"uwagi-praktyczne-wynikajace-z-implementacji-i-typowych-bledow-poczatkujacych\">Uwagi praktyczne wynikaj\u0105ce z implementacji i typowych b\u0142\u0119d\u00f3w pocz\u0105tkuj\u0105cych<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>b\u0142\u0105d z modulo dla liczb ujemnych (w C\/C++ trzeba uwa\u017ca\u0107)<\/li>\n\n\n\n<li>nieuwzgl\u0119dnienie ma\u0142ych\/du\u017cych liter<\/li>\n\n\n\n<li>ignorowanie znak\u00f3w spoza alfabetu<\/li>\n\n\n\n<li>mieszanie kodowania znak\u00f3w (UTF-8 vs ASCII)<\/li>\n\n\n\n<li>b\u0142\u0119dne za\u0142o\u017cenie, \u017ce to \u201ebezpieczne szyfrowanie\u201d<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sty problem: kto\u015b u\u017cywa tego szyfru do \u201eukrycia has\u0142a\u201d w aplikacji. To daje fa\u0142szywe poczucie bezpiecze\u0144stwa &#8211; odszyfrowanie zajmuje sekundy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy Szyfr Cezara jest bezpieczny?<\/strong><br>Nie. Mo\u017cna go z\u0142ama\u0107 natychmiast brute-force lub analiz\u0105 cz\u0119stotliwo\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ile jest mo\u017cliwych kluczy?<\/strong><br>Dla alfabetu 26-literowego dok\u0142adnie 26.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy mo\u017cna go u\u017cywa\u0107 w realnych systemach?<\/strong><br>Nie. Wy\u0142\u0105cznie do nauki lub jako ciekawostka.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dlaczego dzia\u0142a modulo 26?<\/strong><br>Bo alfabet ma 26 liter i operacja musi by\u0107 cykliczna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy dzia\u0142a dla j\u0119zyka polskiego?<\/strong><br>Tak, ale trzeba zdefiniowa\u0107 wi\u0119kszy alfabet (np. 32 znaki).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy ROT13 to to samo?<\/strong><br>To specjalny przypadek tego szyfru z przesuni\u0119ciem 13.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Jak szybko mo\u017cna go z\u0142ama\u0107?<\/strong><br>W praktyce natychmiast &#8211; poni\u017cej 1 sekundy nawet r\u0119cznie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Czy szyfr zmienia d\u0142ugo\u015b\u0107 tekstu?<\/strong><br>Nie. Ka\u017cdy znak zamieniany jest na jeden znak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Szyfrowanie podstawieniowe to najprostsza klasa technik kryptograficznych, w kt\u00f3rych ka\u017cda litera tekstu jawnego jest zast\u0119powana inn\u0105 liter\u0105 wed\u0142ug ustalonej regu\u0142y. Mechanizm jest deterministyczny, \u0142atwy do implementacji i zrozumienia, a jednocze\u015bnie dobrze pokazuje podstawowe poj\u0119cia kryptografii: klucz, przestrze\u0144 kluczy, operacje na alfabetach i podatno\u015b\u0107 na ataki analityczne. Historycznie wykorzystywano go do ochrony kr\u00f3tkich komunikat\u00f3w, dzi\u015b pe\u0142ni g\u0142\u00f3wnie rol\u0119 dydaktyczn\u0105 i wprowadza do my\u015blenia o szyfrach klasycznych, gdzie transformacja danych odbywa si\u0119 na poziomie symboli, a nie bit\u00f3w, czego przyk\u0142adem jest Szyfr Cezara. Szyfr Cezara jako przyk\u0142ad szyfru podstawieniowego z przesuni\u0119ciem cyklicznym i ograniczeniami wynikaj\u0105cymi z ma\u0142ej przestrzeni kluczy Szyfr polega na przesuni\u0119ciu ka\u017cdej litery alfabetu o sta\u0142\u0105 liczb\u0119 pozycji. Je\u015bli alfabet ma rozmiar NNN, to operacja odbywa si\u0119 modulo NNN. Dla alfabetu \u0142aci\u0144skiego bez znak\u00f3w diakrytycznych N=26N = 26N=26. Klucz to liczba ca\u0142kowita kkk, gdzie 0\u2264k&lt;N0 \\le k &lt; N0\u2264k&lt;N. Mechanizm: To przesuni\u0119cie jest cykliczne, wi\u0119c po Z wracamy do A. W praktyce oznacza to, \u017ce tekst \u201eABC\u201d przy kluczu k=3k=3k=3 daje \u201eDEF\u201d. Wz\u00f3r matematyczny i przyk\u0142ad obliczeniowy Element Zapis Szyfrowanie c=(p+k)mod\u2009\u200926c = (p + k) \\mod 26c=(p+k)mod26 Deszyfrowanie p=(c\u2212k)mod\u2009\u200926p = (c &#8211; k) \\mod 26p=(c\u2212k)mod26 Przyk\u0142ad p=2(C),k=3\u21d2c=(2+3)mod\u2009\u200926=5(F)p = 2 (C), k = 3 \\Rightarrow c = (2+3) \\mod 26 = 5 (F)p=2(C),k=3\u21d2c=(2+3)mod26=5(F) Istotna w\u0142a\u015bciwo\u015b\u0107: przestrze\u0144 kluczy ma tylko 26 mo\u017cliwych warto\u015bci. To oznacza, \u017ce atak brute-force jest trywialny &#8211; mo\u017cna sprawdzi\u0107 wszystkie mo\u017cliwo\u015bci w czasie sta\u0142ym. Implementacja algorytmu Szyfr Cezara w j\u0119zykach C, C++ i Python z uwzgl\u0119dnieniem operacji na kodach znak\u00f3w ASCII Implementacja opiera si\u0119 na pracy na kodach ASCII. Litery 'A&#8217;\u2013&#8217;Z&#8217; i 'a&#8217;\u2013&#8217;z&#8217; maj\u0105 r\u00f3\u017cne zakresy, wi\u0119c trzeba je traktowa\u0107 osobno. C Kod &#8222;`c #include &lt;stdio.h&gt; char encrypt(char c, int k) { if (c &gt;= 'A&#8217; &amp;&amp; c &lt;= 'Z&#8217;) return (c &#8211; 'A&#8217; + k) % 26 + 'A&#8217;; if (c &gt;= 'a&#8217; &amp;&amp; c &lt;= 'z&#8217;) return (c &#8211; 'a&#8217; + k) % 26 + 'a&#8217;; return c; } int main() { char text[] = &#8222;Hello&#8221;; int k = 3; for (int i = 0; text[i]; i++) text[i] = encrypt(text[i], k); printf(&#8222;%s\\n&#8221;, text); return 0; } &#8222;` C++ Kod &#8222;`cpp #include &lt;iostream&gt; using namespace std; char encrypt(char c, int k) { if (isupper(c)) return (c &#8211; 'A&#8217; + k) % 26 + 'A&#8217;; if (islower(c)) return (c &#8211; 'a&#8217; + k) % 26 + 'a&#8217;; return c; } int main() { string text = &#8222;Hello&#8221;; int k = 3; for (char &amp;c : text) c = encrypt(c, k); cout &lt;&lt; text &lt;&lt; endl; } &#8222;` Python Kod &#8222;`python def encrypt(text, k): result = &#8222;&#8221; for c in text: if c.isupper(): result += chr((ord(c) &#8211; 65 + k) % 26 + 65) elif c.islower(): result += chr((ord(c) &#8211; 97 + k) % 26 + 97) else: result += c return result print(encrypt(&#8222;Hello&#8221;, 3)) &#8222;` Ka\u017cda implementacja robi dok\u0142adnie to samo: przelicza znak na indeks, dodaje przesuni\u0119cie i wraca do znaku. Analiza bezpiecze\u0144stwa Szyfr Cezara z perspektywy kryptografii klasycznej i praktycznych metod \u0142amania Szyfr nie zapewnia realnego bezpiecze\u0144stwa. Powody: Atak brute-force Sprawdzenie wszystkich mo\u017cliwych kluczy: Kod &#8222;`python def brute_force(text): for k in range(26): print(k, encrypt(text, -k)) &#8222;` Wynik daje wszystkie mo\u017cliwe odszyfrowania &#8211; cz\u0142owiek rozpoznaje poprawny tekst. Analiza cz\u0119stotliwo\u015bci Najcz\u0119stsze litery w j\u0119zyku polskim i angielskim: Je\u015bli w szyfrogramie najcz\u0119\u015bciej wyst\u0119puje np. litera X, mo\u017cna przypuszcza\u0107, \u017ce odpowiada ona literze E. Proces: To dzia\u0142a szczeg\u00f3lnie dobrze dla d\u0142ugich tekst\u00f3w. Rozszerzenia i warianty Szyfr Cezara stosowane w praktyce dydaktycznej oraz ich ograniczenia ROT13 Specjalny przypadek, gdzie k=13k = 13k=13 Wz\u00f3r c=(p+13)mod\u2009\u200926c = (p + 13) \\mod 26c=(p+13)mod26 Cechy: Alfabet rozszerzony Mo\u017cna u\u017cy\u0107: Problem: trzeba jawnie zdefiniowa\u0107 alfabet i jego kolejno\u015b\u0107. Szyfr z kluczem tekstowym Zamiast liczby: To prowadzi do szyfru Vigen\u00e8re\u2019a. Uwagi praktyczne wynikaj\u0105ce z implementacji i typowych b\u0142\u0119d\u00f3w pocz\u0105tkuj\u0105cych Cz\u0119sty problem: kto\u015b u\u017cywa tego szyfru do \u201eukrycia has\u0142a\u201d w aplikacji. To daje fa\u0142szywe poczucie bezpiecze\u0144stwa &#8211; odszyfrowanie zajmuje sekundy. FAQ Czy Szyfr Cezara jest bezpieczny?Nie. Mo\u017cna go z\u0142ama\u0107 natychmiast brute-force lub analiz\u0105 cz\u0119stotliwo\u015bci. Ile jest mo\u017cliwych kluczy?Dla alfabetu 26-literowego dok\u0142adnie 26. Czy mo\u017cna go u\u017cywa\u0107 w realnych systemach?Nie. Wy\u0142\u0105cznie do nauki lub jako ciekawostka. Dlaczego dzia\u0142a modulo 26?Bo alfabet ma 26 liter i operacja musi by\u0107 cykliczna. Czy dzia\u0142a dla j\u0119zyka polskiego?Tak, ale trzeba zdefiniowa\u0107 wi\u0119kszy alfabet (np. 32 znaki). Czy ROT13 to to samo?To specjalny przypadek tego szyfru z przesuni\u0119ciem 13. Jak szybko mo\u017cna go z\u0142ama\u0107?W praktyce natychmiast &#8211; poni\u017cej 1 sekundy nawet r\u0119cznie. Czy szyfr zmienia d\u0142ugo\u015b\u0107 tekstu?Nie. Ka\u017cdy znak zamieniany jest na jeden znak. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1567,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1566","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1566"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1566\/revisions"}],"predecessor-version":[{"id":1568,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1566\/revisions\/1568"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1567"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}