Przejdź do głównej treści

Kryptografia symetryczna

W tej lekcji przyjrzymy się kryptografii symetrycznej, która zabezpiecza znaczną część danych przechowywanych i przesyłanych dzięki swojej wydajności.

Na końcu lekcji omówimy:

  • Czym jest kryptografia symetryczna
  • Przykłady kodu w Python demonstrujące zastosowanie kryptografii symetrycznej
  • Zastosowania kryptografii symetrycznej
  • Zastosowania kryptografii symetrycznej
  • Bezpieczeństwo kryptografii symetrycznej
  • Zagrożenia dla tych algorytmów ze strony zarówno klasycznych, jak i kwantowych komputerów

Introduction to symmetric key cryptography

Kryptografia symetryczna (SKC) to najstarsza i najbardziej intuicyjna forma kryptografii. W SKC poufne informacje są zabezpieczane przez szyfrowanie z kluczem symetrycznym (SKE), czyli przez użycie jednego tajnego klucza zarówno do szyfrowania, jak i deszyfrowania.

SKC obejmuje:

  • Funkcję szyfrowania, która przekształca dany egzemplarz plaintext w ciphertext, wykorzystując tajny key
  • Funkcję deszyfrowania, która odwraca tę operację, zamieniając ciphertext z powrotem w plaintext przy użyciu tego samego tajnego key

Plaintext może oznaczać dowolny rodzaj niezaszyfrowanych danych, takich jak tekst w języku naturalnym lub kod binarny, którego treść informacyjna jest w zasadzie bezpośrednio dostępna, natomiast ciphertext odnosi się do zaszyfrowanych danych, których treść informacyjna ma być niedostępna przed odszyfrowaniem.

Algorytm opisujący operacje szyfrowania i deszyfrowania z użyciem wspólnego tajnego key jest również nazywany symmetric cipher.

Fig 1: Symmetric key encryption of a given plaintext to ciphertext and decryption back to plaintext using the same key.

Rysunek 1. Szyfrowanie symetryczne danego plaintext do ciphertext i deszyfrowanie z powrotem do plaintext przy użyciu tego samego key.

Properties of symmetric key cryptosystems

Symetryczny system kryptograficzny powinien zapewniać następujące właściwości w celu zabezpieczenia wiadomości — zarówno statycznie przechowywanych danych, jak i komunikacji przez kanał transmisji:

  • Poufność: Odnosi się do właściwości, że treść informacyjna zaszyfrowanych wiadomości jest chroniona przed nieautoryzowanym dostępem.
  • Integralność: Odnosi się do właściwości, że wszelkie naruszenie zaszyfrowanych wiadomości podczas przechowywania lub transmisji może zostać wykryte.
  • Autentyczność: Odnosi się do właściwości, że odbiorca wiadomości może zweryfikować tożsamość nadawcy i wykryć podszywanie się przez nieuprawnioną stronę.

Co więcej, właściwości te powinny być realizowane w środowisku, w którym algorytmy lub cipher używane do szyfrowania i deszyfrowania mogą być publiczne, a dostęp do treści informacyjnej zaszyfrowanych wiadomości jest kontrolowany wyłącznie przez dostęp do tajnego key.

Wdrożenie bezpiecznego symetrycznego systemu kryptograficznego wiąże się zatem z dwoma głównymi zadaniami:

  1. Zastosowaniem solidnego algorytmu szyfrowania symetrycznego odpornego na ataki kryptograficzne.
  2. Zapewnieniem poufności w dystrybucji i zarządzaniu tajnymi kluczami.

W tej lekcji omówimy aspekty związane z pierwszym zadaniem, które stanowi główny obszar zainteresowania technologii SKC. Drugie zadanie wymaga jednak rozwiązań wykraczających poza samą SKC i zostanie przedstawione później.

Illustration of symmetric key encryption using python

Pokażemy prosty przykład operacji szyfrowania i deszyfrowania z użyciem klasycznego szyfru przesunięcia Cezara oraz nowoczesnego Advanced Encryption System (AES), który jest standardem szyfrowania symetrycznego od 2001 roku. Najpierw skonfigurujemy kilka bibliotek Python dostarczających potrzebne cipher szyfrowania symetrycznego, a następnie zdefiniujemy plaintext, który chcemy zaszyfrować.

# Added by doQumentation — required packages for this notebook
!pip install -q cryptography numpy secretpy
# Install the library if needed
# %pip install secretpy

# import the required crypto functions which will be demonstrated later
from secretpy import Caesar
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from functools import reduce
import numpy as np

# Set the plaintext we want to encrypt
plaintext = "this is a strict top secret message for intended recipients only"
print(f"\nGiven plaintext: {plaintext}")

Zobaczymy, jak zaszyfrować i odszyfrować go przy użyciu dwóch różnych metod szyfrowania symetrycznego:

  1. Klasycznego szyfru przesunięcia Cezara
  2. Nowoczesnego protokołu Advanced Encryption Standard AES-256

Caesar shift cipher:

Szyfrowanie Caesar shift polega na zdefiniowaniu:

  • Alfabetu możliwych znaków do zakodowania
  • Wartości przesunięcia, która może wynosić od 0 (niezaszyfrowane) do długości alfabetu. Traktujemy ją jako key.

Jest znany jako monoalfabetyczny szyfr podstawieniowy (monoalphabetic substitution cipher), ponieważ każda litera plaintext jest zastępowana inną literą w ciphertext.

W tym przykładzie użyjemy małych liter alfabetu.

Zacznijmy od konfiguracji.

# initialize the required python object for doing Caesar shift encryption
caesar_cipher = Caesar()

# Define the shift, ie the key
caesar_key = 5
print(f"Caesar shift secret key: {caesar_key}")

# Define the alphabet
alphabet = (
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
" ",
)
print(f"alphabet: {alphabet}")

Zaszyfruj plaintext, aby uzyskać ciphertext dla Caesar cipher.

caeser_ciphertext = caesar_cipher.encrypt(plaintext, caesar_key, alphabet)
print(f"Encrypted caeser shift ciphertext: {caeser_ciphertext}")

Odszyfruj ciphertext z powrotem do oryginalnego plaintext, używając tego samego key, który był użyty do szyfrowania.

caeser_plaintext = caesar_cipher.decrypt(caeser_ciphertext, caesar_key, alphabet)
print(f"Decrypted caeser shift plaintext: {caeser_plaintext}\n")

Advanced encryption standard (AES) cipher

Teraz zaszyfrujemy plaintext przy użyciu AES — popularnego algorytmu symetrycznego szyfrowania.

Zaczynamy od wygenerowania key; w tym przypadku będzie to losowy 16-znakowy ciąg.

# lambda defines an inline function in this case that takes two values a,b with the resulting expression of a+b
# reduce uses a two-argument function(above), and applies this to all the entries in the list (random alphabet characters) cumulatively
aes_key = reduce(lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)])

print(f"AES secret key: {aes_key}")

AES obsługuje wiele trybów działania i wymaga podania, który z nich ma być użyty.

Wybieramy tryb Cipher Block Chaining (CBC) dostarczany przez klasę modes.CBC z biblioteki cryptography. Tryb CBC w AES wykorzystuje losowość dla zwiększenia bezpieczeństwa. Wymaga to podania losowego wektora inicjalizacji (Initialization Vector, IV), zwanego też nonce. Użyjemy do tego losowego ciągu — tak samo jak w przypadku key.

aes_initialization_vector = reduce(
lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)]
)
print(f"AES initialization vector: {aes_initialization_vector}")

Możemy teraz utworzyć instancję AES cipher po stronie nadawcy tajnej wiadomości. Zwróć uwagę, że wektor inicjalizacji jest przekazywany do klasy modes.CBC w celu skonfigurowania trybu CBC.

Następnie zaszyfrujemy plaintext do wysłania.

# The encryptor is setup using the key and CBC. In both cases we need to convert the string (utf-8) into bytes
sender_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_encryptor = sender_aes_cipher.encryptor()

# update can add text to encypt in chunks, and then finalize is needed to complete the encryption process
aes_ciphertext = (
aes_encryptor.update(bytes(plaintext, "utf-8")) + aes_encryptor.finalize()
)

# Note the output is a string of bytes
print(f"Encrypted AES ciphertext: {aes_ciphertext}")

Aby odszyfrować wiadomość, utwórzmy instancję AES cipher po stronie odbiorcy. Zwróć uwagę, że zamierzony odbiorca ma dostęp zarówno do tajnego key, jak i do wektora inicjalizacji, przy czym ten ostatni nie musi być tajny.

# Similar setup of AES to what we did for encryption, but this time, for decryption
receiver_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_decryptor = receiver_aes_cipher.decryptor()

# Do the decryption
aes_plaintext_bytes = aes_decryptor.update(aes_ciphertext) + aes_decryptor.finalize()

# convert back to a character string (we assume utf-8)
aes_plaintext = aes_plaintext_bytes.decode("utf-8")

print(f"Decrypted AES plaintext: {aes_plaintext}")

Zastosowania symetrycznej kryptografii klucza

Choć klasyczne ciphery, takie jak szyfr Cezara, dawno wyszły z użycia, nowoczesne symetryczne systemy kryptograficzne, takie jak AES, są stosowane w szerokim zakresie zastosowań, w tym m.in.:

  1. Szyfrowanie i deszyfrowanie danych: SKC jest powszechnie używane do ochrony wrażliwych danych — zarówno przechowywanych statycznie na urządzeniu, jak i przesyłanych przez sieć. Przykłady obejmują ochronę danych uwierzytelniających użytkowników, szyfrowanie wiadomości e-mail oraz zabezpieczanie transakcji finansowych.

  2. Bezpieczna komunikacja: Popularne protokoły komunikacyjne, takie jak SSL/TLS, używają kombinacji symetrycznego i asymetrycznego szyfrowania klucza, aby zapewnić poufność i integralność danych wymienianych między dwiema stronami. Wiadomości te są szyfrowane i deszyfrowane przy użyciu symetrycznego szyfrowania klucza, które korzysta ze wspólnego key. Key używany w symetrycznym szyfrowaniu jest bezpiecznie wymieniany za pomocą asymetrycznego szyfrowania klucza, które korzysta z pary klucz publiczny–klucz prywatny. Symetryczne szyfrowanie klucza jest znacznie szybsze, dzięki czemu może być używane do szyfrowania dużych wiadomości.

  3. Weryfikacja autentyczności: W niektórych przypadkach SKC jest stosowane za pomocą technik takich jak kody uwierzytelniania wiadomości (MAC) i kluczowane MAC z funkcją skrótu (HMAC), aby weryfikować autentyczność i integralność wiadomości, zapewniając komunikację odporną na manipulacje.

  4. Szyfrowanie plików i dysków: Oprogramowanie do szyfrowania całych dysków i narzędzia do szyfrowania plików używają SKC do ochrony wrażliwych danych przechowywanych na dyskach twardych lub przenośnych nośnikach danych.

  5. Wirtualne sieci prywatne: Technologie VPN, których celem jest zapewnienie poufnych kanałów komunikacji wolnych od podsłuchu, mogą używać symetrycznego lub asymetrycznego szyfrowania klucza do łączenia zdalnych użytkowników i sieci korporacyjnych.

Różnorodność zastosowań, w których używa się SKC, wymaga z kolei, by symetryczne systemy kryptograficzne spełniały określony zestaw kryteriów.

Zasady symetrycznego szyfrowania

W tej sekcji omówimy niektóre podstawowe zasady leżące u podstaw bezpieczeństwa algorytmów symetrycznego szyfrowania.

Odporność na atak brute force: Najbardziej podstawowym wymogiem bezpieczeństwa cipher jest odpowiednio duży rozmiar przestrzeni key — innymi słowy, liczba możliwych odrębnych keys, spośród których osoba korzystająca z algorytmu mogła dokonać wyboru — musi być bardzo duża.

Odporność na atak kryptoanalityczny: Drugi podstawowy wymóg wobec cipher — symetrycznego lub innego — polega na tym, że musi on generować szyfrogramy, które są informacyjnie nieczytelne. Warunek konieczny, choć niewystarczający z perspektywy teorii informacji, stanowi to, że szyfrogramy powinny charakteryzować się wysoką entropią, dzięki czemu są nieodróżnialne od losowego tekstu, bez żadnych dostrzegalnych wzorców ani korelacji. W ten sposób atakujący nie może uzyskać żadnych informacji o tekście jawnym ani tajnym key, próbując analizować szyfrogram za pomocą analizy częstotliwościowej lub innych technik statystycznych.

Odporność na ogólne formy ataków kryptoanalitycznych wystarczająca do zapewnienia bezpieczeństwa semantycznego jest sformalizowana za pomocą pojęcia nieodróżnialności. Choć istnieje kilka wariantów nieodróżnialności o różnych wymaganiach, symetryczny kryptosystem uznaje się za bezpieczny semantycznie, jeśli spełnia kryterium Nieodróżnialności przy Wybranym Ataku na Tekst Jawny (IND-CPA). Oznacza to, że atakujący nie może odróżnić szyfrowania dwóch różnych wiadomości, nawet jeśli może wysyłać do algorytmu wiele wybranych przez siebie tekstów jawnych i obserwować odpowiadające im szyfrogramy.

Jak omówimy później, IND-CPA zazwyczaj wymaga zastosowania losowości, aby zagwarantować, że za każdym razem, gdy dany tekst jawny jest szyfrowany z użyciem danego tajnego key, wynikowy szyfrogram jest w nieprzewidywalny sposób różny przy każdym szyfrowaniu.

Tryby awarii klasycznych cipher: Przed nadejściem nowoczesnej kryptografii w latach 70. XX wieku większość klasycznych cipher stosowanych w praktyce nie spełniała jednego lub obu powyższych wymagań. Na przykład wczesne szyfry podstawieniowe, takie jak monoalfabetyczny cipher przesunięcia Cezara, charakteryzowały się zarówno małym rozmiarem przestrzeni key (patrz Tabela 1), jak i niską entropią szyfrogramu, co czyniło je niepewne wobec różnych ataków kryptoanalitycznych, takich jak ataki brute force, analiza częstotliwościowa i ataki ze znajomością tekstu jawnego (KPT).

Późniejsze polialfabetyczne szyfry podstawieniowe, takie jak cipher Vigenère'a i cipher maszyny Enigma, miały efektywnie dużą przestrzeń key, dzięki czemu były odporne na ataki brute force, lecz były podatne odpowiednio na analizę częstotliwościową i ataki KPT. Podobnie do szyfrów podstawieniowych, klasyczne szyfry transpozycyjne, które przestawiają litery w wiadomości zamiast je zastępować, są również łamane przez różne ataki, takie jak anagramowanie, analiza statystyczna, brute force i ataki KPT, spośród innych.

Teoretycznie polialfabetyczny szyfr podstawieniowy znany jako jednorazowy bloczek (OTP) jest znany jako kryptograficznie bezpieczny. OTP dysponuje tajnym key, który powinien być (1) złożony z losowo wybranych liter lub bitów, (2) co najmniej tak długi jak oryginalny tekst jawny oraz (3) używany tylko jeden raz. OTP jest niepraktyczny w rzeczywistych zastosowaniach, ponieważ gdyby tajny key — który musi być tak długi jak tekst jawny i może być użyty tylko raz — mógł być bezpiecznie udostępniony, to tak samo mógłby być udostępniony oryginalny tekst jawny. OTP ilustruje natomiast użyteczność losowości w generowaniu bezpiecznych szyfrgramów.

Atakujący próbujący przeprowadzić przeszukiwanie brute force przez przestrzeń key w celu znalezienia key deszyfrującego wiadomość musi wykonać liczbę operacji proporcjonalną do rozmiaru przestrzeni key.

Dlatego duży rozmiar przestrzeni key zapewnia odporność na ataki brute force, czyniąc je obliczeniowo niewykonalnymi. Tabela 1 zawiera listę rozmiarów przestrzeni key niektórych dobrze znanych cipher.

Tabela 1: Rozmiary przestrzeni kluczy wybranych szyfrów symetrycznych

CipherDługość kluczaRozmiar przestrzeni kluczy
Caeser shift1alphabet-size
Vigenerenalphabet-sizen^\mathrm{n}
One-time-padplaintext-lengthalphabet-sizeplaintextlength^\mathrm{plaintext-length}
DES56256^\mathrm{56}
AES-1281282128^\mathrm{128}
AES-1921922192^\mathrm{192}
AES-2562562256^\mathrm{256}
ChaCha202562256^\mathrm{256}
Nowoczesne schematy szyfrowania symetrycznego w dużej mierze przezwyciężają ograniczenia klasycznych szyfrów. Generują szyfrogramy odporne na kryptoanalizę i charakteryzują się dużymi przestrzeniami kluczy, będąc przy tym znacznie bardziej praktycznie wydajnymi niż OTP.

Block ciphers: Jedna klasa nowoczesnych szyfrów — na przykład DES i AES — zapewnia bezpieczeństwo poprzez łączenie zasad konfuzji i dyfuzji pierwotnie wprowadzonych przez Claude'a Shannona. Omawiamy te pojęcia w kontekście, w którym schematy szyfrowania operują na binarnych reprezentacjach wiadomości:

  • Konfuzja: Konfuzja to właściwość, zgodnie z którą każdy bit szyfrogramu zależy od wielu bitów tajnego klucza. Zapewnia ona, że niewielka zmiana tajnego klucza modyfikuje niemal wszystkie bity szyfrogramu, zamazując związek między szyfrogramem a tajnym kluczem.

  • Dyfuzja: Dyfuzja to właściwość, zgodnie z którą odwrócenie pojedynczego bitu tekstu jawnego powinno modyfikować mniej więcej połowę bitów szyfrogramu i odwrotnie. Dyfuzja ukrywa statystyczne zależności między tekstem jawnym a szyfrogramem. Szyfry z odpowiednią dyfuzją spełniają tak zwane kryterium lawinowe kryptografii.

Block ciphers implementują konfuzję i dyfuzję przy użyciu struktur kryptograficznych znanych jako sieci podstawień i permutacji (SPN), działających na dyskretnych blokach danych. SPN przyjmuje blok tekstu jawnego oraz tajny klucz jako dane wejściowe i wykonuje określoną liczbę rund przekształceń, aby uzyskać blok szyfrogramu. Każda runda składa się z naprzemiennych struktur matematycznych zwanych skrzynkami podstawień (S-boxes) i skrzynkami permutacji (P-boxes) lub równoważnymi operacjami.

Implementują one odpowiednio złożone nieliniowe i liniowe przekształcenia na blokach wejściowych, prowadząc do efektów lawinowych w szyfrgramie.

Sieci SPN są zaprojektowane w taki sposób, że zwiększanie liczby rund zazwyczaj zwiększa bezpieczeństwo szyfru. Prowadzi to do pojęcia marginesu bezpieczeństwa. Margines bezpieczeństwa: Margines bezpieczeństwa danego szyfru kryptograficznego opartego na SPN to różnica między liczbą rund w pełnej implementacji szyfru a maksymalną liczbą rund, o których wiadomo, że można je złamać za pomocą najlepszego znane ataku w warunkach rzeczywistych.

Na przykład, obecnie najlepiej znane ataki szybsze od ataku siłowego na AES-256 mogą złamać do 9 rund spośród łącznych 14 rund pełnego szyfru stosowanego w standardowym trybie zwanym trybem Electronic Codebook (ECB). Dlatego obecnie margines bezpieczeństwa AES-256 wynosi 5 rund.

Stream ciphers: Jako alternatywa dla block ciphers, współcześni kryptolodzy zaprojektowali również praktycznie bezpieczne stream ciphers, takie jak Chacha20. Szyfry te wykorzystują losowość jako fundamentalny element swojego projektu i operują na pseudolosowych strumieniach kluczy bitów zamiast na dyskretnych blokach danych.

W związku z tym stream ciphers łączą tajny klucz z wektorem inicjalizującym (IV), by zainicjować pseudolosowy generator liczb losowych (PRNG) i wygenerować strumień kluczy losowych bitów, które następnie są łączone z danym tekstem jawnym w celu uzyskania szyfrogramu. W tym sensie stream ciphers są podobne do jednorazowego bloku (OTP), lecz charakteryzują się krótszymi długościami tajnego klucza i możliwością wielokrotnego użycia kluczy, co czyni je bardziej praktycznymi. Jednak z tego samego powodu nie gwarantują doskonałej tajności, w odróżnieniu od OTP.

Bezpieczeństwo semantyczne: Tę podsekcję kończymy, wracając do pojęcia bezpieczeństwa semantycznego lub bezpieczeństwa na poziomie IND-CPA wprowadzonego powyżej. Podstawowe operacje implementowane przez block ciphers, takie jak S-box i P-box, są deterministyczne. Oznacza to, że w standardowych trybach działania, takich jak ECB, dana para tekst jawny–klucz zawsze daje ten sam szyfrogram — stan rzeczy podatny na ataki z wybranym tekstem jawnym.

Aby osiągnąć bezpieczeństwo na poziomie IND-CPA, block ciphers muszą działać w trybie wykorzystującym losowość wprowadzaną za pośrednictwem pseudolosowego wektora inicjalizującego (IV), przy dodatkowym wymaganiu, że żadne dwie operacje szyfrowania nie używają tej samej pary klucz-IV. AES obsługuje kilka trybów działania, takich jak łączenie bloków szyfrogramu (CBC), które są bezpieczne na poziomie IND-CPA. Analogiczne wymaganie dotyczy stream ciphers, gdzie ta sama para klucz-IV nie powinna być użyta do inicjowania PRNG więcej niż raz, jeśli pożądane jest IND-CPA.

Po wprowadzeniu podstawowych zasad SKC, wymieniamy teraz kilka popularnych algorytmów symmetric key, aby zilustrować różnorodność podejść stosowanych we współczesnych kryptosystemach. We współczesnych zastosowaniach używa się zarówno block ciphers, jak i stream ciphers — każdy w innym kontekście, co zostało zilustrowane poniżej.

  1. Advanced Encryption Standard: AES, przedstawiony już powyżej, jest obecnie de facto standardem SKC ze względu na swoje właściwości w zakresie bezpieczeństwa, wydajności i osiągów. AES obsługuje stałe rozmiary key: 128, 192 i 256 bitów, oraz wykorzystuje wielorundową sieć podstawień i permutacji (SPN). AES jest znany z odporności na szeroką gamę ataków kryptoanalitycznych. W 2001 roku AES został ogłoszony jako Federal Information Processing Standard (FIPS) dla szyfrowania symmetric key w Stanach Zjednoczonych.`

  2. Data Encryption Standard (DES) i Triple Data Encryption Standard (3DES): DES był block cipher pierwotnie wynalezionym przez Horsta Feistela i jego współpracowników w IBM® w latach 70. XX wieku; wykorzystywał SPN ze stosunkowo krótkim key o długości 56 bitów. DES był przyjęty jako FIPS dla szyfrowania symmetric key w Stanach Zjednoczonych aż do późnych lat 90., gdy wykazano, że można go złamać metodą brute force przy użyciu specjalistycznego sprzętu, ze względu na małą przestrzeń key. Następnie wprowadzono 3DES jako zamiennik — stosuje on algorytm DES trzykrotnie z różnymi keys, zwiększając długość key do 168 bitów. Niemniej jednak 3DES jest w dużej mierze zastąpiony przez AES.

  3. Blowfish i Twofish: Blowfish i jego następca, Twofish, to block ciphers zaproponowane przez kryptografa Bruce'a Schneiera w latach 90. XX wieku. Blowfish i Twofish obsługują zmienną długość key — odpowiednio do 448 bitów i do 256 bitów — oferując pewną elastyczność w kompromisie między bezpieczeństwem a wydajnością. W odróżnieniu od AES, obie te szyfry wyróżniają się key-zależnymi S-boxami. Twofish był jednym z finalistów konkursu NIST mającego na celu wybór Advanced Encryption Standard, jednak ostatecznie nie został wybrany. Oba algorytmy są obecnie uznawane za bezpieczne.

  4. Rivest Ciphers (RC2, RC4, RC5 i RC6): Rodzina algorytmów symmetric key Rivest Cipher (RC) została zaprojektowana przez Rona Rivesta od lat 80. XX wieku. RC2 był wczesnym 64-bitowym block cipher, natomiast RC4 był stream cipher szeroko stosowanym w protokołach bezpieczeństwa związanych z ruchem sieciowym ze względu na swoją prostotę i szybkość. Żaden z nich nie jest obecnie uznawany za bezpieczny. RC5 i RC6 to oparte na SPN block ciphers zaprojektowane z możliwością dostosowania rozmiaru bloku, rozmiaru key oraz liczby rund. Podobnie jak Twofish, RC6 był finalistą konkursu NIST AES i jest uznawany za bezpieczny.

  5. Salsa20 i ChaCha20: Salsa20 i ChaCha20 to powiązana rodzina stream ciphers zaprojektowanych przez kryptografa Daniela Bernsteina w latach 2000. Salsa20 jest częścią portfolio profile-1 europejskiego projektu walidacji kryptograficznej eSTREAM. ChaCha20, będący modyfikacją Salsa20, został zaprojektowany w celu zwiększenia właściwości dyfuzji i wydajności. Obecnie ChaCha20 jest uznawany za bezpieczny i oferuje lepszą wydajność w przypadku braku dedykowanego sprzętowego akceleratora AES. Dlatego ChaCha20 znajduje zastosowanie w określonych środowiskach, takich jak protokoły sieciowe jak QUIC oraz urządzenia mobilne z procesorami opartymi na architekturze ARM.

Zalety symmetric key cryptography

Po omówieniu właściwości kryptosystemów symmetric key i niektórych zasad leżących u podstaw ich rozwoju, wymieniamy teraz główne zalety SKC w porównaniu z asymmetric key cryptography. Ta ostatnia zostanie omówiona w kolejnych lekcjach.

  1. Szybkość i wydajność: Algorytmy symmetric key są bardziej odpowiednie do szyfrowania dużych ilości danych lub do zastosowań w komunikacji w czasie rzeczywistym, ponieważ są generalnie szybsze i mniej zasobochłonne niż ich asymetryczne odpowiedniki. Algorytmy SKC, takie jak AES, skalują się liniowo względem rozmiaru tekstu jawnego i nie wymagają algebraicznie złożonych operacji matematycznych. Szczegółowy przegląd charakterystyk wydajnościowych AES można znaleźć w publikacji Tomoiaga et al..

  2. Skalowalność: Dzięki stosunkowo niskiemu narzutowi obliczeniowemu, algorytmy symmetric key dobrze skalują się wraz ze wzrostem liczby użytkowników i ilości szyfrowanych danych.

  3. Prostota: Protokoły szyfrowania symetrycznego są często łatwiejsze do implementacji i zrozumienia w porównaniu z podejściami asymmetric key, co czyni je atrakcyjnymi zarówno dla deweloperów, jak i użytkowników.

Wyzwania i ograniczenia symmetric key cryptography

Mimo swoich zalet, symmetric key cryptography wiąże się również z pewnymi wyzwaniami i ograniczeniami:

  1. Dystrybucja i zarządzanie key: W SKC zarówno nadawca, jak i odbiorca wiadomości muszą mieć dostęp do tego samego key, który musi być utrzymany w tajemnicy przed nieupoważnionymi stronami. Jeśli key zostanie w jakiś sposób przechwycony lub skompromitowany przez osobę trzecią, bezpieczeństwo zaszyfrowanych danych również zostaje utracone. Bezpieczna dystrybucja i zarządzanie secret key stanowi zatem poważne wyzwanie. Rozwiązanie tego problemu leży jednak poza samym SKC.

  2. Brak niezaprzeczalności: Niezaprzeczalność odnosi się do możliwości udowodnienia, że określona strona wysłała wiadomość. W SKC, ponieważ ten sam key jest używany zarówno do szyfrowania, jak i deszyfrowania, nie jest możliwe ustalenie, która strona wytworzyła dany ciphertext. Natomiast asymmetric key cryptography zapewnia niezaprzeczalność poprzez stosowanie podpisu cyfrowego.

Aby sprostać tym wyzwaniom, symmetric key cryptography jest często stosowana w połączeniu z asymmetric key cryptography. Na przykład powszechnie używa się szyfrowania asymmetric key do bezpiecznego przesyłania stosunkowo krótkiego shared secret key między nadawcą a odbiorcą. Umożliwia to następnie korzystanie z szyfrowania symmetric key do wydajnego przesyłania znacznie większych danych i wiadomości.

Obliczenia kwantowe a szyfrowanie symetryczne: Zagrożenia i sposoby ich ograniczania

Kryptografia kwantowa otwiera obiecującą ścieżkę ograniczania ryzyka w epoce cyfrowej — wdrażanie produktów odpornych na zagrożenia kwantowe ma zapewnić ochronę naszych informacji przed nadciągającymi postępami w dziedzinie obliczeń kwantowych.

W kolejnych sekcjach omawiamy zagrożenia, jakie komputery kwantowe stwarzają dla symetrycznych schematów szyfrowania wprowadzonych w poprzedniej części, oraz przedstawiamy potencjalne sposoby ograniczania tych ryzyk.

Kwantowe ataki kryptograficzne

Istnieją dwie odrębne klasy kwantowych zagrożeń dla tradycyjnych algorytmów kryptograficznych:

  1. Kwantowe ataki brute force: Są to sytuacje, w których atakujący używa komputera kwantowego do wykonania wyspecjalizowanego algorytmu kwantowego przeprowadzającego przeszukiwanie brute force przestrzeni key symetrycznego cipher. Najważniejszym kwantowym prymitywem umożliwiającym ten rodzaj ataku jest algorytm Grovera.

  2. Kwantowe ataki kryptoanalityczne: Są to sytuacje, w których komputery kwantowe są wykorzystywane do przeprowadzania ataków kryptoanalitycznych mających na celu odtworzenie tajnego key lub plaintext w sposób bardziej efektywny niż przeszukiwanie brute force. Możliwość przeprowadzenia skutecznych kwantowych ataków kryptoanalitycznych zależy od wielu czynników związanych ze strukturą matematyczną analizowanego cipher oraz od potencjalnych słabości w konkretnych implementacjach.

Strategie ograniczania ryzyka kwantowych ataków

Zanim omówimy strategie ograniczania ryzyka kwantowych ataków, wprowadźmy pojęcie poziomu bezpieczeństwa kryptograficznego cipher:

Poziom bezpieczeństwa to miara trudności złamania cipher wyrażona liczbą operacji obliczeniowych wymaganych do skutecznego złamania.

Poziom bezpieczeństwa jest zazwyczaj wyrażany w bitach — ogólnie rzecz biorąc, cipher oferuje N-bitowe bezpieczeństwo, jeśli do jego złamania potrzeba O(2N)\mathcal{O}(2^{N}) operacji. Na klasycznych komputerach, przy założeniu że symetryczny cipher jest pod innymi względami kryptograficznie bezpieczny, poziom bezpieczeństwa jest mniej więcej równoznaczny z długością key.

Na przykład poziom bezpieczeństwa AES-128, który używa 128-bitowego key, jest powszechnie uznawany za 128 bitów, ponieważ do sprawdzenia wszystkich możliwych 128-bitowych key w przestrzeni key przez atakującego korzystającego z klasycznego komputera potrzeba rzędu 2128^{128} operacji.

Ataki brute force i ich ograniczanie

Ryzyko kwantowego ataku brute force: Kwantowy atak brute force zmienia powyższą ocenę, ponieważ algorytm Grovera umożliwia atakującemu dysponującemu odpowiednim komputerem kwantowym przeszukiwanie przestrzeni key cipher w sposób kwadratowo szybszy niż jakikolwiek klasyczny komputer.

Na przykład ten sam atak brute force na AES-128 z użyciem algorytmu Grovera mógłby potencjalnie zostać zrealizowany przy zaledwie 264^{64} operacjach. Poziom bezpieczeństwa AES-128 spada więc ze 128 bitów do 64 bitów w obliczu kwantowego przeciwnika korzystającego z przeszukiwania Grovera. Ponieważ moc obliczeniowa tradycyjnie rośnie wykładniczo z czasem, poziom bezpieczeństwa 64 bitów jest obecnie uznawany za niewystarczający — oznacza to, że gdy powstaną wystarczająco wydajne komputery kwantowe, AES-128 będzie musiał zostać porzucony.

Ten sam rodzaj obliczenia dotyczy innych symetrycznych block lub stream cipherów, gdzie poziom bezpieczeństwa dla danej długości key jest w efekcie zmniejszany o połowę przez algorytm Grovera.

Ograniczanie ryzyka kwantowego ataku brute force: Powyższe rozważania sugerują, że oczywistym sposobem ochrony przed kwantowymi atakami brute force jest co najmniej podwojenie minimalnych długości key używanych do symetrycznego szyfrowania.

Aby zapewnić 128-bitowe bezpieczeństwo w obliczu kwantowych ataków brute force, wystarczy użyć cipherów takich jak AES-256 lub ChaCha20, które stosują 256-bitowe key. Uznaje się to za bezpieczne, ponieważ nawet z komputerami kwantowymi wykonanie 2128^{128} operacji w celu złamania cipher jest niewykonalne w przewidywalnej przyszłości.

Choć proste w teorii, to proponowane rozwiązanie polegające na podwojeniu długości key nie jest pozbawione kosztów — dłuższe key wiążą się z większym kosztem obliczeniowym rutynowych zadań szyfrowania i deszyfrowania, a także z wolniejszą wydajnością, większym zapotrzebowaniem na pamięć i zwiększonym zużyciem energii.

Ataki kryptoanalityczne i ich ograniczanie

Ryzyko kwantowych ataków kryptoanalitycznych: Zagrożenie dla symetrycznych kryptosystemów ze strony kwantowych ataków kryptoanalitycznych jest obecnie przedmiotem aktywnych badań kryptografów. Połączenie klasycznych i kwantowych obliczeń potencjalnie poszerza zestaw narzędzi dostępnych atakującym do badania słabości w strukturze matematycznej cipherów, a szeroka gama nowych kwantowych ataków kryptoanalitycznych jest obecnie proponowana. Obejmują one kwantyzacje znanych technik klasycznych, takich jak kryptoanaliza liniowa i różnicowa, a także nowe tryby ataków niemające klasycznych odpowiedników.

Niedawne kwantowe badanie kryptoanalityczne Advanced Encryption Standard (AES) wykazało, że cipher pozostaje odporny na różne znane kwantowe ataki kryptoanalityczne i nadal wykazuje odpowiedni post-quantum margines bezpieczeństwa. Niemniej jednak niektóre badania wykazały, że różne symetryczne cipher uznawane za klasycznie bezpieczne mogą zostać łatwo skompromitowane przez tzw. kwantowy atak z wybranym plaintext. W związku z tym zaproponowano również nowe prymitywy symetrycznego szyfrowania zaprojektowane specjalnie z myślą o erze post-quantum.

Ograniczanie ryzyka kwantowych ataków kryptoanalitycznych: Zważywszy, że kryptoanaliza kwantowa jako dziedzina jest w powijakach, może się okazać, że post-quantum kryptografia symetryczna będzie podlegać szybkiej ewolucji wraz z pojawianiem się nowych kwantowych ataków kryptoanalitycznych oraz propozycją i oceną nowych odpornych na nie cipherów. Dlatego najlepsza strategia ograniczania ryzyka kwantowych ataków kryptoanalitycznych w przewidywalnej przyszłości to zwinność kryptograficzna (ang. cryptographic agility lub crypto-agility). Crypto-agility odnosi się do zdolności systemu informatycznego do szybkiego i łatwego przyjmowania alternatywnych prymitywów kryptograficznych bez rewolucyjnych zmian w infrastrukturze systemu.

Crypto-agility wymaga możliwości zastąpienia przestarzałych algorytmów używanych do szyfrowania, deszyfrowania, podpisów cyfrowych i innych funkcji kryptograficznych przy minimalnym wysiłku i zakłóceniach. Systemy cechujące się crypto-agility będą dobrze przygotowane do zarządzania przejściem na post-quantum symetryczną kryptografię z key.

Podsumowanie

Kryptografia symetryczna zapewnia solidne i wydajne rozwiązania do zabezpieczania informacji cyfrowych. Prostota polegająca na używaniu tego samego key zarówno do szyfrowania, jak i deszyfrowania umożliwia wysoką wydajność i skalowalność, dzięki czemu SKC nadaje się do szerokiego zakresu zastosowań.

Bezpieczeństwo SKC opiera się na algorytmicznej odporności na ataki kryptograficzne oraz na właściwym zarządzaniu tajnym key. Nowoczesne symetryczne kryptosystemy łączą zasady konfuzji, dyfuzji i losowości w połączeniu z odpowiednimi rozmiarami key, aby osiągnąć bezpieczeństwo semantyczne. Zarządzanie tajnym key, choć kluczowe, nie może być osiągnięte wyłącznie przy użyciu SKC.

Zrozumienie właściwości i ograniczeń SKC pozwoli programistom na projektowanie, implementowanie i wdrażanie bezpiecznych rozwiązań informatycznych z wykorzystaniem takich podejść jak stosowanie dłuższych key w razie potrzeby oraz użycie nowych algorytmów.