Opis

Szyfrowanie do niedawna było wiązane z bezpieczeństwem publicznym. Najbezpieczniejsze implementacje podlegały takim samym rządowym regulacjom jak przemysł zbrojeniowy. Do dzisiaj rządy i różnego rodzaju służby dążą do uzyskania możliwości odczytywania zaszyfrowanych danych. Tymczasem silna kryptografia jest podstawą globalnej ekonomii, zapewnia codzienną ochronę milionom użytkowników i większości organizacji. A to nie wszystko. Algorytmy szyfrujące, ich implementacja czy programowe łamanie szyfrów to równocześnie fascynująca dziedzina wiedzy i pole do zabawy, ćwiczeń oraz eksperymentowania z programowaniem.Ta książka jest przeznaczona dla osób, które nie umieją programować, ale chciałyby zapoznać się z kryptografią. Omówiono tu podstawowe koncepcje programowania w Pythonie, który dziś jest uważany za najlepszy język dla początkujących koderów. Pokazano, jak tworzyć, testować i łamać programy implementujące szyfry klasyczne, takie jak przestawieniowy i Vigenerea, by stopniowo przejść do znacznie bardziej zaawansowanych zagadnień, w tym kryptografii klucza publicznego. Każdy program przedstawiono w postaci pełnego kodu źródłowego, wyjaśniono także wiersz po wierszu jego działanie. Dzięki tej książce można się zarówno nauczyć zasad kryptografii, jak i zdobyć umiejętności pisania kodu szyfrującego i deszyfrującego w Pythonie.Znajdziesz tutaj między innymi:wprowadzenie do programowania w Pythonie: pętle, zmienne, kontrola przepływu działania programuomówienie technik szyfrowania stosowanych przed wynalezieniem komputerówróżne algorytmy szyfrowania z wykorzystaniem Pythonatestowanie programów szyfrujących i deszyfrującychszyfrowanie i deszyfrowanie plikówłamanie szyfrów techniką brute force czy analiza częstotliwościA teraz stwórz algorytm szyfru idealnego!Spis treści:O autorze 4O korektorach merytorycznych 4Podziękowania 17Wprowadzenie 19Kto powinien przeczytać tę książkę? 20Co znajdziesz w tej książce? 21Jak używać tej książki? 23Wpisywanie kodu źródłowego 23Sprawdzanie pod kątem błędów 23Konwencje zastosowane w książce 24Zasoby w internecie 24Pobieranie i instalowanie Pythona 24Instalacja Pythona w systemie Windows 24Instalacja Pythona w systemie macOS 25Instalacja Pythona w systemie Ubuntu 25Pobieranie pliku pyperclip.py 25Uruchamianie środowiska IDLE 26Podsumowanie 271. Papier jako narzędzie kryptograficzne 29Co to jest kryptografia? 30Kod a szyfr 30Szyfr Cezara 32Krążek szyfrowania 32Szyfrowanie wiadomości za pomocą krążka szyfrowania 33Deszyfrowanie za pomocą krążka szyfrowania 34Szyfrowanie i deszyfrowanie z użyciem arytmetyki 35Dlaczego podwójne szyfrowanie nie działa? 36Podsumowanie 362. Programowanie w powłoce interaktywnej 39Kilka prostych wyrażeń matematycznych 40Wartości całkowite i wartości zmiennoprzecinkowe 41Wyrażenia 41Kolejność wykonywania działań 42Obliczanie wartości wyrażeń 42Przechowywanie wartości w zmiennych 43Nadpisywanie zmiennej 45Nazwy zmiennych 46Podsumowanie 473. Ciągi tekstowe i tworzenie programów 49Praca z tekstem przy użyciu wartości w postaci ciągu tekstowego 50Konkatenacja ciągu tekstowego za pomocą operatora + 51Replikacja ciągu tekstowego przy użyciu operatora * 52Pobieranie znaków z ciągu tekstowego przy użyciu indeksów 53Wyświetlanie wartości za pomocą funkcji print() 56Wyświetlanie znaków sterujących 57Apostrof i cudzysłów 58Tworzenie programów w edytorze pliku IDLE 59Kod źródłowy programu typu Witaj, świecie! 59Sprawdzanie kodu źródłowego za pomocą narzędzia Online Diff Tool 61Użycie środowiska IDLE w celu późniejszego uzyskania dostępu do programu 62Zapisywanie programu 62Uruchamianie programu 63Otwieranie wcześniej zapisanych programów 64W jaki sposób działa program Witaj, świecie!? 64Komentarze 64Wyświetlanie wskazówek dla użytkownika 65Pobieranie danych wejściowych od użytkownika 65Zakończenie programu 66Podsumowanie 664. Szyfr odwrotny 69Kod źródłowy programu wykorzystującego szyfr odwrotny 70Przykładowe uruchomienie programu 70Definiowanie komentarzy i zmiennych 71Określanie długości ciągu tekstowego 72Wprowadzenie do pętli while 73Boolowski typ danych 73Operatory porównania 74Blok kodu 76Konstrukcja pętli while 77″Rośnięcie” ciągu tekstowego 78Usprawnianie programu za pomocą funkcji input() 81Podsumowanie 825. Szyfr Cezara 85Kod źródłowy programu wykorzystującego szyfr Cezara 86Przykładowe uruchomienie programu 87Importowanie modułu i przypisywanie zmiennych 88Stałe i zmienne 89Pętla for 90Przykład pętli for 90Pętla while będąca odpowiednikiem pętli for 91Konstrukcja if 92Przykład użycia polecenia if 92Polecenie else 92Polecenie elif 93Operatory in i not in 94Metoda find() 95Szyfrowanie i deszyfrowanie symboli 96Obsługa zawinięcia 97Obsługa symboli spoza zbioru symboli 98Wyświetlanie i kopiowanie skonwertowanego ciągu tekstowego 98Szyfrowanie innych symboli 99Podsumowanie 1006. Łamanie szyfru Cezara za pomocą ataku brute force 103Kod źródłowy programu wykorzystującego szyfr odwrotny 104Przykładowe uruchomienie programu 105Definiowanie zmiennych 106Iteracja z użyciem funkcji range() 106Deszyfrowanie wiadomości 108Stosowanie formatowania ciągu tekstowego do wyświetlenia klucza i deszyfrowanej wiadomości 109Podsumowanie 1107. Szyfrowanie za pomocą szyfru przestawieniowego 113Sposób działania szyfru przestawieniowego 113Ręczne szyfrowanie wiadomości 114Tworzenie programu szyfrującego 116Kod źródłowy programu wykorzystującego szyfr kolumnowy 117Przykładowe uruchomienie programu 118Samodzielne definiowanie funkcji za pomocą polecenia def 118Definiowanie funkcji pobierającej argumenty 119Zmiana parametru istniejącego tylko wewnątrz funkcji 120Definiowanie funkcji main() 121Przekazywanie klucza i wiadomości jako argumentów 122Typ danych listy 123Ponowne przypisywanie elementów na liście 124Lista list 125Stosowanie funkcji len() i operatora in z listą 126Konkatenacja listy i replikacja za pomocą operatorów + i * 127Algorytm szyfrowania przestawieniowego 127Rozszerzone operatory przypisania 128Iteracja currentIndex przez wiadomość 129Metoda join() 131Wartość zwrotna i polecenie return 132Przykład polecenia return 132Zwrot szyfrogramu 133Zmienna __name__ 133Podsumowanie 1348. Deszyfrowanie wiadomości chronionej szyfrem przestawieniowym 137Łamanie szyfru przestawieniowego za pomocą kartki i ołówka 138Kod źródłowy programu deszyfrującego wiadomość chronioną szyfrem przestawieniowym 139Przykładowe uruchomienie programu 141Importowanie modułów i definiowanie funkcji main() 141Deszyfrowanie wiadomości za pomocą klucza 142Funkcje round(), math.ceil() i math.floor() 142Funkcja decryptMessage() 143Operatory boolowskie 145Dostosowywanie wartości zmiennych column i row 148Wywoływanie funkcji main() 150Podsumowanie 1509. Tworzenie programu do testowania innych programów 153Kod źródłowy programu do testowania innych programów 154Przykładowe uruchomienie programu 155Importowanie modułów 156Generowanie liczb pseudolosowych 156Tworzenie losowo wybranego ciągu tekstowego 158Powielanie ciągu tekstowego losowo wybraną liczbę razy 158Zmienna listy używa odwołania 159Przekazywanie odwołania 162Stosowanie funkcji copy.deepcopy() do powielenia listy 162Funkcja random.shuffle() 163Losowe mieszanie ciągu tekstowego 163Testowanie poszczególnych wiadomości 164Sprawdzanie poprawności szyfrowania i zakończenie programu 165Wywoływanie funkcji main() 166Testowanie programu 166Podsumowanie 16710. Szyfrowanie i deszyfrowanie plików 169Pliki zwykłego tekstu 170Kod źródłowy programu wykorzystującego szyfr przestawieniowy do szyfrowania pliku 170Przykładowe uruchomienie programu 171Praca z plikami 172Otwieranie pliku 172Zapisywanie i zamykanie pliku 173Odczyt danych z pliku 174Funkcja main() programu 175Sprawdzanie istnienia pliku 175Funkcja os.path.exists() 176Sprawdzanie za pomocą funkcji os.path.exists() istnienia pliku danych wejściowych 176Stosowanie metod ciągu tekstowego do zapewnienia większej elastyczności danych wejściowych 177Metody ciągu tekstowego upper(), lower() i title() 177Metody ciągu tekstowego startswith() i endswith() 177Stosowanie metod ciągu tekstowego w programie 178Odczyt pliku danych wejściowych 179Pomiar czasu operacji szyfrowania i deszyfrowania 179Moduł time i funkcja time.time() 179Stosowanie funkcji time.time() w programie 180Zapis danych wyjściowych do pliku 181Wywoływanie funkcji main() 181Podsumowanie 18211. Programowe wykrywanie języka angielskiego 183Jak komputer może zrozumieć język angielski? 184Kod źródłowy modułu do wykrywania języka angielskiego 186Przykładowe uruchomienie programu 187Polecenia i definiowanie stałych 187Typ danych w postaci słownika 188Różnice między słownikiem i listą 189Dodawanie lub modyfikowanie elementów słownika 190Stosowanie funkcji len() ze słownikiem 191Stosowanie operatora in ze słownikiem 191Wyszukiwanie elementów w słowniku odbywa się szybciej niż na liście 192Stosowanie pętli for w słowniku 192Implementacja pliku słownika 193Metoda split() 193Podział słownika na poszczególne słowa 194Zwrot danych słownika 194Zliczanie liczby słów angielskich w wiadomości 195Błąd dzielenia przez zero 196Zliczanie dopasowań słów w języku angielskim 196Funkcje float(), int() i str() oraz dzielenie całkowite 197Określanie proporcji angielskich słów w wiadomości 198Usuwanie znaków innych niż litery 198Metoda append() typu listy 199Tworzenie ciągu tekstowego liter 200Wykrywanie słów angielskich 200Stosowanie argumentów domyślnych 200Obliczanie wartości procentowych 201Podsumowanie 20312. Łamanie szyfru przestawieniowego 205Kod źródłowy programu umożliwiającego złamanie szyfru przestawieniowego 206Przykładowe uruchomienie programu 207Importowanie modułów 208Wielowierszowy ciąg tekstowy ujęty w potrójny cudzysłów 208Wyświetlanie wyniku deszyfrowania wiadomości 209Pobranie deszyfrowanej wiadomości 210Metoda strip() ciągu tekstowego 212Stosowanie metody strip() ciągu tekstowego 213Nieudana próba deszyfrowania wiadomości 213Wywoływanie funkcji main() 214Podsumowanie 21413. Moduł arytmetyki modularnej dla szyfru afinicznego 215Arytmetyka modularna 216Operator reszty z dzielenia 217Wyszukiwanie dzielników do obliczenia największego wspólnego dzielnika 218Przypisanie wielokrotne 220Algorytm Euklidesa do wyszukiwania największego wspólnego dzielnika 221Sposób działania szyfrów multiplikatywnego i afinicznego 222Wybór poprawnego klucza multiplikatywnego 223Szyfrowanie z użyciem szyfru afinicznego 224Deszyfrowanie szyfru afinicznego 225Określanie odwrotności modularnej 226Operator dzielenia całkowitego 226Kod źródłowy modułu cryptomath 227Podsumowanie 22814. Programowanie szyfru afinicznego 231Kod źródłowy programu wykorzystującego szyfr afiniczny 232Przykładowe uruchomienie programu 233Importowanie modułów i stałych oraz definiowanie funkcji main() 234Generowanie i weryfikowanie kluczy 236Typ danych w postaci krotki 236Sprawdzanie pod kątem słabych kluczy 237Ile kluczy może mieć szyfr afiniczny? 238Tworzenie funkcji szyfrującej 240Tworzenie funkcji deszyfrującej 241Generowanie losowych kluczy 242Wywoływanie funkcji main() 243Podsumowanie 24415. Łamanie szyfru afinicznego 245Kod źródłowy programu umożliwiającego złamanie szyfru afinicznego 245Przykładowe uruchomienie programu 247Importowanie modułów i stałych oraz definiowanie funkcji main() 248Funkcja odpowiedzialna za złamanie szyfru afinicznego 249Operator wykładniczy 249Obliczanie całkowitej liczby kluczy, których można użyć 250Polecenie continue 251Stosowanie polecenia continue do pominięcia kodu 252Wywoływanie funkcji main() 253Podsumowanie 25416. Programowanie prostego szyfru podstawieniowego 255Jak działa prosty szyfr podstawieniowy? 256Kod źródłowy programu wykorzystującego szyfr podstawieniowy 257Przykładowe uruchomienie programu 259Importowanie modułów i stałych oraz definiowanie funkcji main() 259Metoda sort() listy 261Funkcje opakowujące 262Funkcja translateMessage() 263Metody isupper() i islower() ciągu tekstowego 265Zachowywanie wielkości liter dzięki metodzie isupper() 266Generowanie losowego klucza 267Wywoływanie funkcji main() 268Podsumowanie 26817. Łamanie prostego szyfru podstawieniowego 271Stosowanie wzorca słowa do deszyfrowania 272Znajdowanie wzorca słowa 272Wyszukiwanie potencjalnych liter odszyfrowujących 273Omówienie procesu łamania szyfru 275Moduł wzorca słowa 275Kod źródłowy programu wykorzystującego szyfr podstawieniowy 276Przykładowe uruchomienie programu 280Importowanie modułów i stałych 280Wyszukiwanie znaków za pomocą wyrażeń regularnych 281Konfigurowanie funkcji main() 281Wyświetlanie użytkownikowi wyniku operacji łamania szyfru 282Tworzenie mapowania szyfrogramu 283Tworzenie pustego mapowania 283Dodawanie liter do mapowania 283Łączenie dwóch mapowań 285W jaki sposób działają funkcje pomocnicze mapowania liter? 286Wyszukiwanie zdeszyfrowanych liter w mapowaniu 290Testowanie funkcji removeSolvedLettersFromMapping() 292Funkcja hackSimpleSub() 292Metoda replace() ciągu tekstowego 294Deszyfrowanie wiadomości 295Deszyfrowanie w powłoce interaktywnej 296Wywoływanie funkcji main() 297Podsumowanie 29818. Programowanie szyfru Vigenerea 299Stosowanie wielu liter kluczy w szyfrze Vigenerea 300Dłuższe klucze szyfru Vigenerea są znacznie bezpieczniejsze 302Wybór klucza uniemożliwiającego atak słownikowy 303Kod źródłowy programu wykorzystującego szyfr Vigenerea 303Przykładowe uruchomienie programu 305Importowanie modułów i stałych oraz definiowanie funkcji main() 305Tworzenie ciągu tekstowego za pomocą procesu dołączania do listy 306Szyfrowanie i deszyfrowanie wiadomości 307Wywoływanie funkcji main() 310Podsumowanie 31019. Analiza częstotliwości 313Analiza częstotliwości występowania liter w tekście 314Dopasowywanie częstotliwości występowania liter 316Obliczanie wyniku dopasowania częstotliwości dla prostego szyfru podstawieniowego 316Obliczanie wyniku dopasowania częstotliwości dla prostego szyfru przestawieniowego 317Stosowanie analizy częstotliwości do złamania szyfru Vigenerea 318Kod źródłowy programu obliczającego wynik dopasowania częstotliwości 319Przechowywanie liter w kolejności ETAOIN 321Zliczanie liter w wiadomości 321Pobieranie pierwszego elementu składowego krotki 323Układanie liter według częstotliwości ich występowania w wiadomości 323Zliczanie liter za pomocą funkcji getLetterCount() 324Tworzenie słownika częstotliwości wystąpień i listy liter 324Sortowanie liter w odwrotnej kolejności ETAOIN 325Sortowanie list słownika według częstotliwości występowania 330Tworzenie listy sortowanych liter 332Obliczanie wyniku dopasowania częstotliwości dla wiadomości 332Podsumowanie 33420. Łamanie szyfru Vigenerea 335Atak słownikowy w celu złamania szyfru Vigenerea metodą brute force 336Kod źródłowy programu umożliwiającego złamanie szyfru Vigenerea za pomocą ataku słownikowego 336Przykładowe uruchomienie programu 337Informacje o programie do łamania szyfru Vigenerea za pomocą ataku słownikowego 337Stosowanie metody Kasiskiego do ustalenia długości klucza 338Odszukanie powtarzających się sekwencji 338Pobieranie dzielników liczb określających odstępy 339Pobieranie każdej n-tej litery ciągu tekstowego 341Stosowanie analizy częstotliwości do złamania poszczególnych podkluczy 342Przeprowadzanie ataku brute force na możliwe klucze 344Kod źródłowy programu umożliwiającego złamanie szyfru Vigenerea 344Przykładowe uruchomienie programu 349Importowanie modułów i definiowanie funkcji main() 350Wyszukiwanie powtarzających się sekwencji 351Obliczanie dzielników odstępów 354Usuwanie duplikatów za pomocą funkcji set() 355Usuwanie powtarzających się dzielników i sortowanie listy 355Wyszukiwanie najczęściej występujących dzielników 356Określanie prawdopodobnej długości klucza 358Metoda listy extend() 358Rozszerzanie słownika repeatedSeqSpacings 359Pobieranie dzielników z factorsByCount 360Pobieranie liter szyfrowanych za pomocą tego samego podklucza 360Próba deszyfrowania z użyciem potencjalnych długości klucza 362Argument w postaci słowa kluczowego key funkcji print() 364Uruchamianie programu w trybie cichym lub wyświetlania informacji użytkownikowi 365Wyszukiwanie możliwych kombinacji podkluczy 365Wyświetlanie deszyfrowanego tekstu z użyciem właściwej wielkości liter 369Zwrot deszyfrowanej wiadomości 370Opuszczanie pętli po znalezieniu potencjalnego klucza 371Atak brute force na wszystkie długości klucza 371Wywoływanie funkcji main() 372Modyfikowanie stałych programu 373Podsumowanie 37321. Szyfr z kluczem jednorazowym 375Niemożliwy do złamania szy
r z kluczem jednorazowym 376Tworzenie klucza o długości odpowiadającej długości wiadomości 376Zapewnianie prawdziwej losowości klucza 378Dlaczego klucza jednorazowego można użyć tylko raz? 379Dlaczego dwukrotnie użyty klucz jednorazowy to szyfr Vigenerea? 379Podsumowanie 38022. Wyszukiwanie i generowanie liczb pierwszych 381Co to jest liczba pierwsza? 382Kod źródłowy modułu liczb pierwszych 384Przykładowe uruchomienie modułu 386Sposób działania algorytmu próbnego dzielenia 386Implementacja algorytmu próbnego dzielenia 388Sito Eratostenesa 389Generowanie liczb pierwszych za pomocą sita Eratostenesa 391Algorytm pierwszości Rabina-Millera 392Wyszukiwanie ogromnych liczb pierwszych 393Generowanie ogromnych liczb pierwszych 395Podsumowanie 39523. Generowanie kluczy dla szyfru klucza publicznego 397Kryptografia klucza publicznego 398Problem z uwierzytelnieniem 400Podpis cyfrowy 400Uważaj na atak MITM 401Etapy generowania kluczy publicznego i prywatnego 402Kod źródłowy programu generującego klucze kryptografii klucza publicznego 403Przykładowe uruchomienie programu 404Tworzenie funkcji main() 406Generowanie kluczy za pomocą funkcji generateKey() 406Obliczanie wartości e 407Obliczanie wartości d 407Zwracanie kluczy 408Tworzenie plików kluczy za pomocą funkcji makeKeyFiles() 408Wywoływanie funkcji main() 410Hybrydowe systemy kryptograficzne 411Podsumowanie 41124. Programowanie szyfru klucza publicznego 413Jak działa kryptografia klucza publicznego? 414Tworzenie bloku 414Konwersja ciągu tekstowego na blok 415Matematyka szyfrowania i deszyfrowania za pomocą kryptografii klucza publicznego 416Konwersja bloku na ciąg tekstowy 418Dlaczego nie można złamać szyfru wykorzystującego kryptografię klucza publicznego? 420Kod źródłowy programu wykorzystującego kryptografię klucza publicznego 421Przykładowe uruchomienie programu 425Konfiguracja programu 426Wybór trybu pracy programu 426Konwersja ciągu tekstowego na bloki za pomocą funkcji getBlocksFromText() 428Funkcje min() i max() 428Przechowywanie bloków w blockInt 429Stosowanie funkcji getTextFromBlocks() do deszyfrowania wiadomości 431Stosowanie metody insert() listy 432Łączenie listy message i tworzenie na jej podstawie jednego ciągu tekstowego 432Tworzenie funkcji encryptMessage() 433Tworzenie funkcji decryptMessage() 433Odczytywanie kluczy publicznego i prywatnego z ich plików 434Zapisywanie szyfrogramu do pliku 435Deszyfrowanie danych z pliku 437Wywoływanie funkcji main() 439Podsumowanie 439A. Debugowanie kodu Pythona 441Na czym polega działanie debugera? 441Usuwanie błędów z programu wykorzystującego szyfr odwrotny 443Definiowanie punktu przerwania 445Podsumowanie 447B. Odpowiedzi do ćwiczeń 449Rozdział 1. 449Rozdział 2. 450Rozdział 3. 451Rozdział 4. 452Rozdział 5. 453Rozdział 6. 454Rozdział 7. 455Rozdział 8. 457Rozdział 9. 459Rozdział 10. 459Rozdział 11. 460Rozdział 12. 461Rozdział 13. 462Rozdział 14. 462Rozdział 15. 463Rozdział 16. 463Rozdział 17. 464Rozdział 18. 464Rozdział 19. 465Rozdział 20. 465Rozdział 21. 466Rozdział 22. 466Rozdział 23. 466O autorze: Albert Sweigart — programista, projektant oprogramowania i nauczyciel kodowania. Autor licznych książek o Pythonie dla początkujących. Sweigart urodził się w Houston, w stanie Teksas, a obecnie mieszka w San Francisco. Prowadzi blog dostępny pod adresem: http://coffeeghost.net.

translator google com, warszawa angielski, ciekawe pomysly do realizacji w szkole, kiedy zaczynają się studia, ile trzeba pracować żeby dostać emeryture, s chemia, plusy i minusy po angielsku, zielna suwałki, od jakiej średniej jest 2, studia dietetyczne ile trwają, keska, wsp wro, za darmo w warszawie, www wsb poznan, studia inzynierskie, польська мова за 4 тижні, podanie o praktyki studenckie w urzędzie, jak obliczyć swoją emeryturę

yyyyy