Czytałem, że
Typowy strumień szyfr szyfruje zwykły tekst po jednym bajcie na raz, chociaż szyfr strumieniowy może być zaprojektowany tak, aby działał na jednym bicie na raz lub na jednostkach większych niż jeden bajt na raz.
(Źródło: Kryptografia i bezpieczeństwo sieci , William Stallings.)
Szyfrowanie blokowe szyfruje jeden blok na raz. Blok może mieć rozmiar co najmniej jednego bajtu. Oznacza to, że możemy również zaszyfrować blok jednobajtowy za pomocą szyfru strumieniowego jako strumienia.
Jaka jest więc dokładnie różnica między szyfrem strumieniowym a szyfrem blokowym?
Komentarze
- IMHO wiele pojęć / definicji nie jest do końca jasnych, ale ma granice w pewnym sensie raczej płynne. Używa się ich jako takich, ponieważ są wygodne w dyskursie, w którym zwykle istnieją odpowiednie konteksty, które pomagają w dokładniejszym zrozumieniu. Stąd istnieją zwolnienia. Przypuszczam, że dobrą analogią do tego problemu jest ” bogacz ” kontra ” biedak „.
- Pierwszy akapit pytania wydaje się być skopiowany słowo w słowo z Kryptografii i bezpieczeństwa sieci (William Stallings, rozdział 6.3). Zawsze musisz podać źródło wszelkich materiałów, które kopiujesz ze źródeł zewnętrznych; zobacz crypto.stackexchange.com/help/referencing .
- Szyfr strumieniowy może używać lub ' zawiń ' szyfr blokowy. Np. AES SIC może służyć do generowania strumienia klucza. Fakt, że strumień kluczy ma długość N razy większą niż rozmiar bloku, nie ma żadnego wpływu na długość szyfrowanych / zwykłych tekstów
Odpowiedź
A szyfrowanie blokowe jest deterministyczną i obliczalną funkcją $ k $ -bitowych kluczy i $ n $ -bit (zwykły tekst) bloków na bloki $ n $ -bit (tekst zaszyfrowany). (Bardziej ogólnie, bloki nie muszą mieć rozmiaru bitowego, $ n $ -character-blocks też tu pasują). Oznacza to, że kiedy szyfrujesz ten sam blok tekstu jawnego z tym samym kluczem, uzyskasz ten sam wynik. (Zwykle chcemy również, aby funkcja była odwracalna, tj. Mając klucz i blok tekstu zaszyfrowanego, możemy obliczyć zwykły tekst.)
Aby faktycznie zaszyfrować lub odszyfrować wiadomość (dowolnego rozmiaru), nie musisz ” t użyj szyfru blokowego bezpośrednio, ale umieść go w trybie działania . Najprostszym takim trybem byłby tryb elektronicznej książki kodów (ECB) , który po prostu tnie wiadomość na bloki, stosuje szyfr do każdego bloku i wyprowadza powstałe bloki (nie jest to jednak ogólnie tryb bezpieczny).
Niektóre wczesne schematy szyfrowania, takie jak ten używany przez Cezara, można sklasyfikować jako „szyfr blokowy z blokami 1-znakowymi w ECB -mode „. Lub ogólnie wszystko, co ma książkę kodów .
Zwykle używamy innych trybów działania, które obejmują wektor inicjujący i jakiś rodzaj informacji zwrotnej, tak aby każdy blok każdej wiadomości jest szyfrowana w inny sposób.
szyfrowanie strumieniowe to funkcja, która bezpośrednio odwzorowuje $ k $ -bitowe klucze i teksty jawne o dowolnej długości na szyfrogram (tej samej długości), w takim sposób, w jaki przedrostki tekstu jawnego odwzorowują przedrostki tekstu zaszyfrowanego, tj. możemy obliczyć początkową część tekstu zaszyfrowanego, zanim znana jest końcowa część tekstu jawnego. (Często rozmiary wiadomości mogą być również ograniczone do wielokrotności pewnego „rozmiaru bloku”, ale zwykle z mniejszymi blokami, takimi jak całe bajty itp.)
Jeśli część tekstu jawnego się powtarza, odpowiedni zaszyfrowany tekst zwykle to nie to samo – różne części wiadomości zostaną zaszyfrowane na różne sposoby.
Często takie szyfry strumieniowe działają poprzez tworzenie strumienia klucza z rzeczywistego klucza (i być może wektora inicjalizacyjnego ), a następnie po prostu XORowanie go z wiadomością – nazywane są one synchroniczne szyfry strumieniowe . Inne szyfry strumieniowe mogą zmieniać szyfrowanie przyszłych części wiadomości w zależności od poprzednich części.
Niektóre tryby szyfrowania blokowego w rzeczywistości tworzą synchroniczny szyfr strumieniowy, na przykład CTR i tryb OFB .
Nigdy nie powinieneś ponownie używać klucza (i IV, jeśli ma to zastosowanie) synchronicznego szyfru strumieniowego (który obejmuje szyfry blokowe w trybach przesyłania strumieniowego) dla różnych wiadomości, ponieważ może to prowadzić do kompromisów. (I nawet dla tej samej wiadomości pokaże, że powtórzyłeś wiadomość.)
Zauważ, że w rzeczywistym użyciu będziesz również potrzebował MAC, np. ochrona integralności wiadomości. (Na przykład niektóre schematy są zepsute w przypadku ataku z wybranym szyfrogramem, a taki adres MAC zapobiegnie temu (jeśli przekażesz wiadomość do deszyfratora po sprawdzeniu adresu MAC).)
Komentarze
- Kiedy wybierałbyś między strumieniem a blokiem? Czy jest różnica w bezpieczeństwie? Czy szybkość szyfrowania?
- @anoopelias Szyfry blokowe są generalnie wolne w porównaniu z szyframi Stream. Nie jestem też pewien, ale myślę, że szyfry strumieniowe są dobre w zapewnianiu bezpieczeństwa informacji, podczas gdy szyfry blokowe są dobre w zapewnianiu bezpieczeństwa komputerowego.
- W odniesieniu do ostatniego akapitu – czy mógłbyś podać link do przykładu, w którym dodanie adresu MAC chroni przed atakiem na wybrany zaszyfrowany tekst?
Odpowiedź
Matematycznie, szyfr blokowy to po prostu z kluczem pseudolosowa permutacja na zestawie bloków $ \ {0,1 \} ^ n $ z $ n $ -bitów. (W praktyce zwykle wymagamy również wydajnego sposobu obliczenia odwrotnej permutacji). Szyfr blokowy sam nie jest zbyt przydatny w praktycznej kryptografii, przynajmniej chyba, że po prostu trzeba zaszyfrować małe wiadomości, które pasują do jednego bloku.
Okazuje się jednak, że szyfry blokowe są niezwykle elementami konstrukcyjnymi do konstruowania innych narzędzi kryptograficznych: gdy masz dobry szyfr blokowy, możesz łatwo zbudować wszystko, od szyfrów strumieniowych po funkcje haszujące, kody uwierzytelniania wiadomości, funkcje wyprowadzania kluczy, generatory liczb pseudolosowych, pule entropii itp. w oparciu o jeden szyfr blokowy.
Nie wszystkie z tych aplikacji muszą być potrzebujesz szyfrowania blokowego; na przykład wiele z nich może być opartych na dowolnej funkcji pseudolosowej , która nie musi być permutacją (ale, dogodnie, istnieje „sa lemat , który mówi, że pseudolosowa permutacja mimo wszystko zadziała). Ponadto wiele konstrukcji jest pośrednich; na przykład możesz skonstruować funkcję wyprowadzania klucza z kodu uwierzytelniającego wiadomość, którą możesz skonstruuj z funkcji skrótu, którą możesz —, ale nie „t mieć do — konstruować z bloku szyfr. Mimo to, jeśli masz szyfr blokowy, możesz zbudować z niego całą resztę.
Co więcej, te konstrukcje zazwyczaj zawierają (warunkowe) dowody bezpieczeństwa, które zmniejszają bezpieczeństwo skonstruowanych funkcji do funkcji bazowego szyfru blokowego. W związku z tym nie musisz wykonywać żmudnego i zawodnego zadania kryptoanalizy każdej z tych funkcji oddzielnie —, zamiast tego możesz „swobodnie skoncentrować się na szyfrze blokowym, wiedząc, że jakakolwiek pewność, jaką będziesz mieć co do bezpieczeństwa szyfru blokowego, bezpośrednio przekłada się na zaufanie do wszystkich opartych na nim funkcji.
Oczywiście wszystko to jest bardzo wygodne, jeśli pracujesz, powiedzmy, nad mała wbudowana platforma, na której włączenie wydajnego i bezpiecznego kodu dla wielu oddzielnych prymitywów kryptograficznych może być trudne i kosztowne. Ale nawet jeśli „nie korzystasz z tak ograniczonej platformy, pisanie i analizowanie niskopoziomowego kodu kryptograficznego może być pracochłonne ze względu na konieczność zwracania uwagi na takie rzeczy jak ataki typu side-channel . Łatwiej jest ograniczyć się do ograniczonej liczby bloków konstrukcyjnych niskiego poziomu i zbudować z nich wszystko, czego potrzebujesz.
Ponadto nawet na szybkich platformach z dużą ilością pamięci podobnie jak w komputerach stacjonarnych, implementacja niskopoziomowych operacji kryptograficznych bezpośrednio na sprzęcie może być znacznie szybsza niż wykonywanie ich w oprogramowaniu —, ale nie jest to praktyczne w przypadku więcej niż kilku z nich . Ze względu na swoją wszechstronność, szyfry blokowe są doskonałymi kandydatami do implementacji sprzętowej (jak w zestawie instrukcji AES dla nowoczesnych procesorów x86).
A co z szyframi strumieniowymi?
Matematycznie szyfr strumieniowy — w najbardziej ogólnym znaczeniu terminu — jest również rodziną funkcji pseudolosowych odwracalnych z kluczem, ale w zestawie $ \ {0,1 \} ^ * $ ciągów bitowych o dowolnej długości zamiast bloków o ograniczonej długości.
(Jest tu kilka subtelności; na przykład większość konstrukcji szyfrowania strumieniowego wymaga, aby dane wejściowe zawierały unikalną wartość nonce i nie gwarantuje bezpieczeństwo — w sensie nieodróżnialności od prawdziwie losowej funkcji —, jeśli ta sama wartość jednorazowa jest używana dla dwóch różnych danych wejściowych. nie ma jednolitej dystrybucji na funkcjach odwracalnych od $ \ {0,1 \} ^ * $ do siebie, aby wybrać losowe funkcje, musimy dokładnie zdefiniować, co to znaczy, że szyfr strumieniowy wygląda na „nieodróżnialny od losowego”, i ta definicja ma praktyczne konsekwencje dla bezpieczeństwa —. Na przykład większość szyfrów strumieniowych przecieka długość wiadomości. W praktyce zwykle wymagamy również, aby szyfry strumieniowe w w rzeczywistości „przesyłaj strumieniowo” w tym sensie, że dowolnie długie wejściowe strumienie bitów mogą być szyfrowane — i odszyfrowane — za pomocą o tylko stała pamięć i czas są liniowe w długości wiadomości.)
Oczywiście szyfry strumieniowe są znacznie bardziej przydatne od razu niż szyfry blokowe: można ich używać bezpośrednio do szyfrowania wiadomości o dowolnej długości. Okazuje się jednak, że są one również znacznie mniej przydatne jako elementy składowe innych narzędzi kryptograficznych: jeśli masz szyfr blokowy, możesz z łatwością przekształcić go w szyfr strumieniowy , podczas gdy przekształcenie dowolnego szyfru strumieniowego w szyfr blokowy jest trudne, jeśli nie niemożliwe .
Dlaczego więc ludzie w ogóle zawracają sobie głowę projektowaniem dedykowanych szyfrów strumieniowych, to skoro szyfry blokowe mogą równie dobrze wykonać to zadanie? Główną przyczyną jest szybkość: czasami do zaszyfrowania dużej ilości danych potrzebny jest szybki szyfr, a jest kilka naprawdę szybkie dedykowane projekty szyfrowania strumieniowego. Niektóre z tych projektów są również zaprojektowane tak, aby były bardzo kompaktowe w implementacji, zarówno w oprogramowaniu, jak i sprzęcie lub obu, więc jeśli naprawdę potrzebujesz tylko szyfru strumieniowego, możesz zaoszczędź na kodzie / rozmiarze obwodu, używając jednego z tych szyfrów zamiast ogólnego szyfru blokowego.
Jednak to, co zyskujesz na szybkości i zwartości, tracisz na wszechstronności. na przykład, wydaje się, że nie ma prostego sposobu na utworzenie funkcji skrótu z szyfru strumieniowego , więc jeśli potrzebujesz jednego z nich (a często zrobić, ponieważ funkcje skrótu, oprócz tego, że są użyteczne same w sobie, są również typowymi elementami budulcowymi dla innych narzędzi kryptograficznych), będziesz musiał zaimplementować je oddzielnie. I zgadnij co, większość funkcji skrótu opiera się na szyfrach blokowych, więc jeśli je posiadasz, równie dobrze możesz użyć tego samego szyfru blokowego do szyfrowania (chyba że naprawdę potrzebujesz surowej szybkości dedykowanego szyfru strumieniowego).
Komentarze
- Zastanawiałem się, czy potrzebne są dwa różne terminy. Zgodnie z tym, co wyjaśniłeś, szyfr strumieniowy jest po prostu specjalnym przypadkiem szyfru blokowego, tj. Przypadkiem ograniczającym, w którym n ze zbioru {0,1} ^ n wynosi 1. Więc argumentowałbym za nie utrzymywaniem bieżącego rozróżnienie terminologii.
- @ Mok-KongShen W rzeczywistości szyfr strumieniowy nie jest po prostu szyfrem blokowym o rozmiarze bloku 1 (innym niż klasyczne szyfry monoalfabetyczne, które można założyć, że są jednymi i drugimi). Szyfr strumieniowy zwykle tłumaczy bity / bajty / … strumienia w różny sposób, w zależności od bieżącego stanu wewnętrznego szyfru, podczas gdy szyfr blokowy dla tego samego wejścia ma to samo wyjście (i dlatego jest zwykle używany w ” tryb działania ” w celu utworzenia szyfru strumieniowego).
- @PauloEbermann. IMHO odpowiedziałeś za mnie na pytanie CodesinChaos dotyczące ” dynamiki i zmienności „.
- @ Mok-KongShen Nie nie ' t. Jedyną przewagą dedykowanego szyfru strumieniowego nad szyfrem blokowym w odpowiednim trybie jest wydajność. Nie możesz ' zignorować trybów tworzenia łańcuchów, ponieważ nikt rozsądny nie używa szyfrów blokowych bez odpowiedniego łączenia.
- @CodesInChaos. Różne aplikacje mają różne wymagania dotyczące wydajności. Aby zaszyfrować np. e-mail, nie ' nie wymaga wydajności, która byłaby pożądana do zaszyfrowania, powiedzmy, pliku wideo.
Odpowiedź
Szyfr blokowy sam w sobie mapuje n
bity na n
bity za pomocą klucza. tzn. jest to „pseudolosowa permutacja z kluczem. Nie może akceptować dłuższych ani krótszych tekstów.
Aby faktycznie zaszyfrować wiadomość, zawsze potrzebujesz trybu łączenia. ECB jest jednym z takich trybów łączenia. (i to naprawdę zły) i nie jest to czysty szyfr blokowy. Nawet EBC składa się z „dodatkowych operacji przetwarzania”. Te tryby łańcuchowe mogą mieć całkiem różne właściwości.
Jeden z najpopularniejszych trybów łączenia, tryb Counter (CTR), tworzy synchroniczny szyfr strumieniowy z szyfru blokowego.Inny tryb, CFB konstruuje samosynchronizujący się szyfr strumieniowy, którego właściwości znajdują się gdzieś pomiędzy właściwościami CBC i synchronicznym szyfrowaniem strumieniowym.
Twoje założenie, że nie ma szyfrów między strumieniem a blokadami, nie jest tak naprawdę prawdziwe. po prostu wolę budować je z dobrze zrozumiałego prymitywu szyfru blokowego, zamiast tworzyć zupełnie nowy system.
Nazwałbym Vigenère szyfrem strumieniowym, choćby taki o zbyt krótkim okresie. Używa kodowania 26 symboli zamiast kodowania 2 symboli, ale to nie znaczy, że nie jest to szyfr strumieniowy. Spójrz na Solitaire / Pontifex , aby zapoznać się z nowoczesną konstrukcją szyfru strumieniowego z 26 symbolami.
Komentarze
- Jeśli nie ' t err, ” łączę ” w szyfrowanie bloków jest zwykle stosowane w kontekście ” tworzenia łańcuchów bloków „, tj. renderowania kolejnych bloków zależnych od siebie, tak aby analiza trudniejsza. Więc IMHO ECB z definicji nie miałoby żadnego efektu łańcuchowego.
- Popełniasz błąd. dobry tryb łączenia w łańcuch będzie miał te właściwości, ale złe tryby nadal istnieją!
Odpowiedź
Istnieją dwa podstawowe typy szyfrowania
- Symetryczne. Używa tego samego klucza do szyfrowania i deszyfrowania.
- Asymetryczne. Używa dwóch różnych kluczy (publicznego i prywatnego) do szyfrowania i odszyfrowywania.
Szyfrowanie blokowe i szyfrowanie strumieniowe stanowią część szyfrowania symetrycznego. Stream Cipher generuje rozszerzony strumień klucza z klucza podanego przez użytkownika, a następnie XoR z tekstem jawnym (do szyfrowania) / szyfrogramem (do odszyfrowania).
Podczas gdy Block Cipher pobiera blok danych jako dane wejściowe, wykonaj wiele rund na nim wraz z mieszaniem kluczy i tworzeniem tekstu zaszyfrowanego. Szyfry blokowe mają różne tryby działania, z których tryb licznika (CTR) działa podobnie do szyfru strumieniowego. Numer kolejny jest wprowadzany do szyfru blokowego, a jego wyjście jest Xoredowane z tekstem jawnym, aby utworzyć zaszyfrowany tekst. W tym trybie pracy wymagany jest tylko kod szyfrujący dla szyfru blokowego. Nie ma potrzeby odszyfrowywania kodu, w celu odszyfrowania po prostu wprowadzamy ten sam numer sekwencyjny do szyfru blokowego i Xorujemy jego dane wyjściowe za pomocą Ciphertext, aby uzyskać zwykły tekst. Czasami rzeczownik jest używany wraz z licznikiem, więc wprowadzany szyfr blokowy jest dzielony na dwie części, tj. Stała rzeczownik i licznik przyrostowy.
Inny tryb działania są: –
- EBC (zapewnia Poufność)
- CBC i CTR (zapewnia Poufność i Sementycznie zabezpieczone przed atakiem z użyciem wybranego tekstu jawnego)
- EAX, CCM i GCM (zapewnia uwierzytelnione szyfrowanie)
Więcej szczegółów można znaleźć TUTAJ