Kryptografie se symetrickým klíčem
V této lekci se podíváme na kryptografii se symetrickým klíčem, která díky své efektivitě zabezpečuje velkou část dat v klidu i při přenosu.
Na konci lekce budeme mít probráno:
- Co je kryptografie se symetrickým klíčem
- Ukázky kódu v Pythonu demonstrující použití kryptografie se symetrickým klíčem
- Pohled na aplikace kryptografie se symetrickým klíčem
- Aplikace kryptografie se symetrickým klíčem
- Bezpečnost kryptografie se symetrickým klíčem
- Hrozby pro tyto algoritmy ze strany klasických i kvantových počítačů
Úvod do kryptografie se symetrickým klíčem
Kryptografie se symetrickým klíčem (SKC) je nejstarší a nejintuitivnější forma kryptografie. Pomocí SKC jsou důvěrné informace chráněny prostřednictvím šifrování symetrickým klíčem (SKE), to znamená použitím jediného tajného klíče jak k šifrování, tak k dešifrování.
SKC zahrnuje:
- Šifrovací funkci, která převádí danou instanci otevřeného textu na šifrovaný text s využitím tajného klíče
- Dešifrovací funkci, která tuto operaci invertuje převodem šifrovaného textu zpět na otevřený text pomocí stejného tajného klíče
Otevřený text může znamenat jakýkoli druh nezašifrovaných dat, jako je přirozený jazykový text nebo binární kód, jehož informační obsah je v principu přímo přístupný, zatímco šifrovaný text označuje zašifrovaná data, jejichž informační obsah má být před dešifrováním nepřístupný.
Algoritmus, který popisuje operace šifrování a dešifrování pomocí sdíleného tajného klíče, se také nazývá symetrická šifra.

Obrázek 1. Šifrování symetrickým klíčem daného otevřeného textu na šifrovaný text a dešifrování zpět na otevřený text pomocí stejného klíče.
Vlastnosti kryptosystémů se symetrickým klíčem
Kryptosystém se symetrickým klíčem by měl zajistit následující vlastnosti pro zabezpečení zpráv – jak staticky uložených dat, tak komunikace přes nějaký přenosový kanál:
- Důvěrnost: Odkazuje na vlastnost, že informační obsah šifrovaných zpráv je chráněn před neoprávněným přístupem.
- Integrita: Odkazuje na vlastnost, že jakékoli pozměnění šifrovaných zpráv během uložení nebo přenosu lze detekovat.
- Autenticita: Odkazuje na vlastnost, že příjemce zprávy může ověřit identitu odesílatele a detekovat vydávání se za někoho jiného neoprávněnou stranou.
Navíc by tyto vlastnosti měly být realizovány v prostředí, kde algoritmy nebo šifry používané k šifrování a dešifrování mohou být veřejné a kde je přístup k informačnímu obsahu šifrovaných zpráv řízen výhradně prostřednictvím přístupu k tajnému klíči.
Implementace bezpečného kryptosystému se symetrickým klíčem tedy zahrnuje dva hlavní úkoly:
- Použití robustního šifrovacího algoritmu se symetrickým klíčem odolného vůči kryptografickým útokům.
- Zajištění důvěrnosti při distribuci a správě tajných klíčů.
V této lekci budeme diskutovat aspekty související s prvním úkolem, který tvoří primární zájem technologie SKC. Druhý úkol však vyžaduje řešení, která spadají mimo samotnou SKC, a budou představena později.
Ukázka šifrování symetrickým klíčem pomocí Pythonu
Ukážeme si jednoduchý příklad operací šifrování a dešifrování pomocí klasické Caesarovy posuvné šifry a moderního Advanced Encryption System (AES), který je od roku 2001 standardem pro šifrování symetrickým klíčem. Nejprve si nastavíme některé pythonové knihovny, které poskytují potřebné šifry symetrického klíče, a poté definujeme otevřený text, který chceme zašifrovat.
# 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}")
Uvidíme, jak ji zašifrovat a dešifrovat pomocí dvou různých metod šifrování symetrickým klíčem:
- Klasická Caesarova posuvná šifra
- Moderní Advanced Encryption Standard protokol AES-256
Caesarova posuvná šifra:
Caesarovo posuvné šifrování zahrnuje definování
- Abecedy možných znaků k zakódování
- Hodnoty posunu, která může být mezi 0 (nezašifrováno) a délkou abecedy. Tu považujeme za klíč.
Je známá jako monoalfabetická substituční šifra, protože každé písmeno otevřeného textu je v šifrovaném textu nahrazeno jiným.
V tomto příkladu budeme používat malá písmena abecedy.
Začněme tím, že si vše nastavíme.
# 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}")
Zašifrujme otevřený text, abychom získali šifrovaný text pro Caesarovu šifru.
caeser_ciphertext = caesar_cipher.encrypt(plaintext, caesar_key, alphabet)
print(f"Encrypted caeser shift ciphertext: {caeser_ciphertext}")
Dešifrujme šifrovaný text zpět na původní otevřený text pomocí stejného klíče, který byl použit k šifrování.
caeser_plaintext = caesar_cipher.decrypt(caeser_ciphertext, caesar_key, alphabet)
print(f"Decrypted caeser shift plaintext: {caeser_plaintext}\n")
Šifra Advanced encryption standard (AES)
Nyní zašifrujeme prostý text pomocí AES, populárního algoritmu symetrického šifrování.
Začneme vytvořením klíče, v tomto případě náhodného 16písmenného řetězce.
# 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 podporuje více režimů provozu a vyžaduje, abychom určili, který použijeme.
Zvolíme režim Cipher Block Chaining (CBC) poskytovaný třídou modes.CBC z knihovny cryptography. Režim CBC u AES používá náhodnost pro dodatečnou bezpečnost. To vyžaduje specifikaci náhodného inicializačního vektoru (IV), nazývaného také nonce. I pro tento účel použijeme náhodný řetězec, stejně jako jsme to udělali u klíče.
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}")
Nyní můžeme vytvořit instanci AES šifry jménem odesílatele tajné zprávy. Všimni si, že inicializační vektor je předán třídě modes.CBC, aby se nastavil režim CBC.
Následně zašifrujeme prostý text, který chceme odeslat.
# 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}")
Abychom ji dešifrovali, vytvořme instanci AES šifry jménem příjemce. Všimni si, že zamýšlený příjemce má přístup jak k tajnému klíči, tak k inicializačnímu vektoru, ale ten druhý nemusí být tajný.
# 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}")
Aplikace symetrické kryptografie
Zatímco klasické šifry jako Caesarova šifra se přestaly používat už dávno, moderní symetrické kryptosystémy jako AES jsou nasazeny v široké škále aplikací, mezi které patří:
-
Šifrování a dešifrování dat: SKC se široce používá k ochraně citlivých dat, ať už staticky uložených na zařízení, nebo přenášených po síti. Příklady zahrnují ochranu přihlašovacích údajů uživatelů, šifrování e-mailových zpráv a zabezpečení finančních transakcí a další.
-
Zabezpečená komunikace: Běžné komunikační protokoly jako SSL/TLS používají kombinaci symetrického a asymetrického šifrování k zajištění důvěrnosti a integrity dat vyměňovaných mezi dvěma stranami. Tyto zprávy se šifrují a dešifrují pomocí symetrického šifrování, které využívá sdílený klíč. Klíč použitý při symetrickém šifrování je bezpečně vyměněn pomocí asymetrického šifrování, které používá dvojici veřejného a soukromého klíče. Symetrické šifrování je mnohem rychlejší, a proto se dá použít pro šifrování zpráv velkého rozsahu.
-
Ověření pravosti: V některých situacích se SKC využívá prostřednictvím technik jako autentizační kódy zpráv (MAC) a klíčované hashovací MAC (HMAC) k ověření pravosti a integrity zpráv, čímž zajišťuje komunikaci odolnou vůči manipulaci.
-
Šifrování souborů a disků: Software pro šifrování celých disků a nástroje pro šifrování souborů využívají SKC k ochraně citlivých dat uložených na pevných discích nebo přenosných úložných zařízeních.
-
Virtuální privátní sítě: Technologie VPN, které se snaží poskytovat důvěrné komunikační kanály bez odposlechu, mohou k propojení vzdálených uživatelů i firemních sítí používat symetrické nebo asymetrické šifrování.
Rozmanité spektrum aplikací, ve kterých je SKC nasazena, zase vyžaduje, aby symetrické kryptosystémy splňovaly určitou sadu kritérií.
Principy symetrického šifrování
V této části probereme některé základní principy, na kterých stojí bezpečnost algoritmů symetrického šifrování.
Odolnost vůči útoku hrubou silou: Nejzákladnějším požadavkem na bezpečnost šifrovací šifry je, aby velikost klíčového prostoru — jinými slovy počet možných různých klíčů, ze kterých si mohl někdo používající algoritmus vybrat — byla velmi velká.
Odolnost vůči kryptoanalytickému útoku: Druhým základním požadavkem na šifru, symetrickou i jinou, je, aby dokázala generovat šifrové texty, které jsou informačně neprostupné. K tomu je z pohledu teorie informace nutnou, ale ne postačující podmínkou, aby se šifrové texty vyznačovaly vysokou entropií, takže je nelze odlišit od náhodného textu bez rozpoznatelných vzorů nebo korelací. Díky tomu útočník nemůže získat žádné informace o otevřeném textu ani tajném klíči pokusem o analýzu šifrového textu pomocí frekvenční analýzy nebo jiných statistických technik.
Odolnost vůči obecným formám kryptoanalytických útoků dostatečná k zajištění sémantické bezpečnosti je formalizována prostřednictvím pojmu nerozlišitelnost. I když existuje několik variant nerozlišitelnosti s různými požadavky, symetrický kryptosystém se považuje za sémanticky bezpečný, pokud splňuje kritérium nerozlišitelnosti při útoku zvoleným otevřeným textem (IND-CPA). To znamená, že útočník nedokáže rozlišit šifrování dvou různých zpráv, ani když mu je povoleno posílat algoritmu více otevřených textů podle vlastního výběru a sledovat odpovídající šifrové texty.
Jak si ukážeme později, IND-CPA obvykle vyžaduje použití náhodnosti, aby bylo zajištěno, že pokaždé, když je daný otevřený text zašifrován daným tajným klíčem, výsledný šifrový text je pro každé šifrování nepředvídatelně odlišný.
Způsoby selhání klasických šifer: Před nástupem moderní kryptografie v 70. letech 20. století většina klasických šifer v praktickém použití nesplňovala jeden nebo oba výše uvedené požadavky. Například rané substituční šifry jako monoalfabetická Caesarova posuvná šifra se vyznačovaly jak malou velikostí klíčového prostoru (viz Tabulka 1), tak šifrovým textem s nízkou entropií, což je činilo nezabezpečenými vůči různým kryptoanalytickým útokům, jako jsou útoky hrubou silou, frekvenční analýza a útoky se známým otevřeným textem (KPT).
Následné polyalfabetické substituční šifry jako Vigenèrova šifra a šifra stroje Enigma měly v praxi velké klíčové prostory, což je činilo odolnými vůči útokům hrubou silou, ale byly zranitelné vůči frekvenční analýze, respektive útokům KPT. Podobně jako substituční šifry jsou i klasické transpoziční šifry, které písmena ve zprávě místo nahrazení přeskupují, kompromitovány řadou útoků, jako jsou anagramování, statistická analýza, hrubá síla a útoky KPT, a další.
Teoreticky je známo, že polyalfabetická substituční šifra známá jako jednorázová tabulka (OTP) je kryptograficky bezpečná. OTP se vyznačuje tajným klíčem, který by měl být (1) složen z náhodně vybraných písmen nebo bitů, (2) alespoň tak dlouhý jako původní otevřený text a (3) použit pouze jednou. OTP je pro skutečné aplikace nepraktická, protože pokud by bylo možné bezpečně sdílet tajný klíč — který musí být stejně dlouhý jako otevřený text a lze jej použít pouze jednou — pak by bylo možné bezpečně sdílet i původní otevřený text. OTP místo toho ilustruje užitečnost náhodnosti při generování bezpečných šifrových textů.
Útočník, který se pokouší implementovat vyhledávání hrubou silou v klíčovém prostoru s cílem najít klíč, jenž zprávu dešifruje, musí provést počet operací úměrný velikosti klíčového prostoru.
Velká velikost klíčového prostoru proto poskytuje odolnost vůči útokům hrubou silou tím, že je činí výpočetně neproveditelnými. Tabulka 1 uvádí velikosti klíčových prostorů některých známých šifer.