
%\documentclass[xcolor=dvipsnames]{beamer}
\documentclass[handout]{beamer}
\usepackage[czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
\usecolortheme{sidebartab}
%\input{makra-utf8}
\usepackage{listings}
\usetheme{Warsaw}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\newtheorem{veta}{Věta}
%\newtheorem{hyp}{Hypot\'eza}
\newtheorem{reseni}{Řešení}
%\newtheorem{problemx}{Problem}
%\newtheorem{definition}{Definition}
%\newtheorem{lemma}{Lemma}
\theoremstyle{example}
\newtheorem{definice}{Definice}
\newtheorem{priklad}{P\v r\'iklad}
\newtheorem*{pozn}{Poznámka}
\newtheorem*{dusl}{Důsledek}
\def\cervena #1{{\color{red} #1}}
\def\cervene #1{{\color{red} #1}}
\def\modra #1{{\color{blue}  #1}}
\def\modre #1{{\color{blue}  #1}}
\xdefinecolor{tmavezelena}{cmyk}{0.7,0,1,0.5}
\def\zelena #1{{\color{tmavezelena}  #1}}
\def\zelene #1{{\color{tmavezelena}  #1}}
\def\c #1{\mathcal {#1}}
\def\s #1{\mathsf {#1}}
%\def\poznamka #1{{\footnotesize Pozn.: #1}\\}
\def\poznamka #1{{\scriptsize Pozn.: #1}\\}
\def\otazka #1{{\scriptsize Kontrolní otázka: #1}\\}
\def\zavorka #1{{\scriptsize [ #1 ]}\\}
\def\sami {{\scriptsize Vyřešte samostatně.}}
\def\ec {{\vec{e_1}}}
\def\ecc {{\vec{e_2}}}
\def\efc {{\vec{f_1}}}
\def\efcc {{\vec{f_2}}}

\def\rovina {{\mathbb R^2}}
\def\vect #1{{\overrightarrow{#1}}}
\def\skalar #1#2{{\langle #1, #2\rangle}}
\def\velikost #1{{\| #1\|}}
\def\sgn #1{{\operatorname{sgn}(#1)}}
\def\norm #1{\|#1\|}

\def\R{\mathbb R}
\def\Q{\mathbb Q}
\def\K{\mathbb K}
\def\Z{\mathbb Z}
\def\N{\mathbb N}
\def\C{\mathbb C}

\let\isom\cong
\let\divides\mid
\let\ndivides\nmid
\newcommand{\smalland}{\ \land\ }
\newcommand{\Sage}{\texttt{SAGE}\ }
\let\congr\equiv
\newcommand{\I}{\mathbb{I}}
\def\noqed{\renewcommand{\qedsymbol}{}}
\newcommand{\kron}[2]{(#1/#2)}
\newcommand{\kro}[2]{\genfrac{(}{)}{}{}{#1}{#2}}
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

%\input definice-slovak.tex

\def\tuzka{\hfill ${\color{orange}\blacktriangleright \blacktriangleright}$}
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\title[Aplikace teorie čísel\hspace{15mm} \insertframenumber/\inserttotalframenumber]
{MB141 -- 12. přednáška \\Aplikace teorie čísel}
%\subtitle{}
\author[12. přednáška]{Martin Čadek\\ s využitím přednášek  pro předmět MB104}
\date{Jarní semestr 2022}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{document}
\begin{frame}
\titlepage
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}{Osnova 12. přednášky}
\begin{itemize}
\item Výpočetní aspekty teorie čísel
\bigskip
\item Kryptografie s veřejným klíčem

\end{itemize}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


\begin{frame}{Základní úlohy výpočetní teorie čísel}

V~mnoha praktických úlohách využívajících výsledky teorie čísel je zapotřebí umět rychle  provést jeden či více z~následujících výpočtů:
\begin{enumerate}[<+->]
\item běžné aritmetické operace (součet, součin, dělení se zbytkem) na celých číslech,
\item zbytek mocniny celého čísla $a$ na přirozené číslo $n$ po dělení daným $m$.
\item inverzi celého čísla $a$ modulo $m\in \N$,
\item největší společný dělitel dvou celých čísel (a případně koeficienty do Bezoutovy rovnosti), 
\item rozhodnout o~daném čísle, je-li prvočíslo nebo složené,
\item v~případě složenosti rozložit dané číslo na součin prvočísel.
\end{enumerate}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}{Základní aritmetické operace}
  
Základní aritmetické operace se i na velkých číslech obvykle provádějí obdobně jako jsme se to učili na základní a střední škole, kdy umíme \cervene{sčítat} v~\textit{lineárním} čase, \cervene {násobit a dělit se zbytkem} v~\textit{kvadratickém} čase. % \pause 
Pro násobení, které je základem mnoha dalších operací, existují asymptoticky rychlejší algoritmy (typu \textit{rozděl a panuj}) - např. první takový Karatsubův (1960) časové náročnosti $\Theta(n^{\log_23})$ %\pause 
nebo algoritmus Schönhage-Strassenův (1971) časové náročnosti $\Theta(n \log n \log\log n)$. Číslo $n$ zde udává celkový počet cifer vstupujících do výpočtu.
\medskip
%\pause 
Pěkný přehled najdete např. na \url{http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations}
\end{frame}

\begin{frame}{Největší společný dělitel a modulární inverze}

  Jak už jsme ukazovali dříve, výpočet výpočet \cervene{inverze modulo $m$}, tj. řešení kongruence $a\cdot
x\equiv1\pmod m$ s~neznámou $x$ lze snadno (díky Bezoutově větě) převést na
výpočet největšího společného dělitele čísel $a$ a $m$ a na hledání
koeficientů $k,l$ do Bezoutovy rovnosti $k\cdot a+l\cdot m=1$ (nalezené $k$
je pak onou hledanou inverzí $a$ modulo $m$).

%\pause

%\centerline{\resizebox{7cm}{!}{\includegraphics{xgcd}}
%}


%\bigskip
%\begin{lstlisting}[frame=single]
%function extended_gcd(a, m)
%    if m == 0
%        return (1, 0)
%    else
%        (q, r) := divide (a, m)
%        (k, l) := extended_gcd(m, r)
%        return (l, k - q * l)
%\end{lstlisting}
%
\medskip
Podrobná analýza %(viz např. \texttt{[Knuth] nebo [Wiki]}) 
ukazuje, že tento algoritmus je \cervene{kvadratické} časové složitosti.
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}[fragile]{Modulární umocňování}  

V kryptografii s veřejným klíčem budeme budeme potřebovat  \cervene{umocňování modulo $m$}. To se také využívá při ověřování, zda je dané číslo prvočíslo nebo číslo složené.
Jedním z~efektivních algoritmů je tzv. \cervene{modulární umocňování zprava doleva}:

%\pause

\bigskip
\begin{lstlisting}[frame=single]
function modular_pow(base, exponent, modul)
    result := 1
    while exponent > 0
      if (exponent mod 2 == 1):
        result := (result * base) mod modul
      exponent := exponent >> 1
      base = (base * base) mod modul
    return result
\end{lstlisting}

Symbol $>>$ ve třetím řádku zdola znamená, že od exponentu zapsaného v dvojkové soustavě odebereme poslední cifru $1$.
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}{Idea algoritmu}
Algoritmus modulárního umocňování je založen na myšlence, že např. při počítání $2^{64}\pmod{1000}$
\begin{itemize}[<+->]
\item není třeba nejprve počítat $2^{64}$ a poté jej vydělit se zbytkem číslem 1000, ale lépe je postupně násobit \uv{dvojky} a kdykoliv je výsledek větší než 1000, provést redukci modulo 1000,
\item ale zejména, že není třeba provádět takové množství násobení (v~tomto případě 63 naivních násobení je možné nahradit pouze šesti umocněními na druhou, neboť $$2^{64}=(((((2^2)^2)^2)^2)^2)^2.$$
\end{itemize}
\end{frame}


%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\begin{frame} {Ukázka průběhu algoritmu}
    Vypočtěme $2^{560} \pmod{561}$. Protože $560=(1000110000)_2$, dostaneme uvedeným algoritmem 
    \begin{center}
    \begin{tabular}{|c|c|c|c|}
      \hline
      exponent&base&result&exp's last digit\\
\hline
560&2&1&0\\
280&4&1&0\\
140&16&1&0\\
70&256&1&0\\
35&460&1&1\\
17&103&460&1\\
8&511&256&0\\
4&256&256&0\\
2&460&256&0\\
1&103&256&1\\
0&511&1&0\\
\hline    \end{tabular}
  \end{center}

%\pause
A~tedy $2^{560}\equiv1\pmod{561}.$
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}
  \frametitle{Efektivita modulárního umocňování}

V~průběhu algoritmu se pro každou binární číslici exponentu provede umocnění základu na druhou modulo $m$ 
(což je operace proveditelná v~nejhůře kvadratickém čase), a pro každou \uv{jedničku} v~binárním zápisu navíc provede jedno násobení.  Celkově jsme
tedy schopni provést  modulární umocňování nejhůře v~\textbf{kubickém} čase.

\bigskip
Další úlohy výpočetní teorie čísel jsou \cervene{testování prvočíselnosti} a \cervene{rozklad složených čísel na prvočísla}. Tato témata jsou  na samostatnou přednášku, nebudeme se jimi zde~zabývat. Více lze najít v učebnici Drsná matematika v~odstavcích 10.38-47.
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}
  \frametitle{Kryptografie s veřejným klíčem}
  
Dva hlavní úkoly pro \uv{public-key cryptography} jsou zajistit
\begin{itemize}
\item šifrování, kdy zprávu \cervene{zašifrovanou veřejným klíčem} není schopen rozšifrovat nikdo kromě držitele soukromého klíče,
\item podepisování, kdy integrita zprávy \cervene{podepsané soukromým klíčem} odesílatele může být ověřena kýmkoliv s přístupem k veřejnému klíči odesílatele.
\end{itemize}

%\pause
Nejčastěji používané systémy:
\begin{itemize}[<+->]
\item RSA (šifrování) a odvozený systém pro podepisování zpráv
\item Digital signature algorithm (DSA) a varianta založená na eliptických křivkách (ECDSA)
\item Rabinův kryptosystém (a podepisování)
\item Diffie-Hellmanův protokol na výměnu klíčů (DH)
\item ElGamal kryptosystém (a podepisování)
\item Kryptografie eliptických křivek (ECC)

\end{itemize}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}
  \frametitle{RSA}
  \textit{Rivest, Shamir, Adleman} (1977); \textit {Cocks}(1973)

\begin{itemize}[<+->]
\item Jsou dva typy  klíčů -- veřejný a soukromý. 
\item Generování klíčů: zvolí se dvě velká prvočísla $p,q$, vypočte se $n=pq$, $\varphi(n)=(p-1)(q-1)$. Přitom pouze $n$ je veřejné, $\varphi(n)$ nelze snadno spočítat.
\item \cervene{Veřejný klíč} je číslo $e$ s vlastností $(e,\varphi(n))=1$
\item  \cervene{Soukromý klíč} je číslo $d$ s vlastností $e\cdot d\equiv1\pmod {\varphi(n)}$. Ze znalosti $\varphi(n)$ ho spočítáme např. pomocí Eukleidova algoritmu.
\item Zpráva je číslo $M \pmod n$.  Zašifrujeme ji jako  

$C\equiv M^e\pmod n$.
\item Dešifrování šifry $C$ spočívá ve výpočtu: $C^d\pmod n$.
\item Na základě Eulerovy věty totiž $\pmod n$ dostaneme $C^d\equiv (M^e)^d\equiv M^{ed}
\equiv M^{k\varphi(n)+1}\equiv {\left(M^{\varphi(n)}\right)}^{k}\cdot M\equiv M$.
\end{itemize}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}
  \frametitle{Rabinův kryptosystém}
  
Dalším veřejným kryptosystémem je \textbf{Rabinův kryptosystém}, který si uvedeme ve zjednodušené verzi:
\begin{itemize}[<+->]
\item Každý účastník $A$ potřebuje dvojici klíčů -- veřejný $V_A$ a soukromý $S_A$.
\item Generování klíčů: $A$ zvolí dvě podobně velká prvočísla \\ $p,q\equiv3\pmod4$, vypočte $n=pq$.

\item $V_A=n$, $S_A=(p,q)$ - dvojice prvočísel, nikoliv jejich největší společný dělitel, který je 1. 
\item Zašifrování numerického \textit{kódu} zprávy $M$: \\  $C\equiv M^2\pmod n$.
\item Dešifrování šifry $C$: vypočtou se (čtyři) odmocniny z~$C$ modulo $n$ a snadno se otestuje, která z~nich byla původní zprávou.  
\end{itemize}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}{Výpočet druhé odmocniny}
 Výpočet druhé odmocniny z~$C$ modulo $n=pq$, \\ kde $p\equiv q\equiv3\pmod4$
 probíhá takto:
    \begin{itemize}[<+->]
    \item vypočti $r=C^{(p+1)/4}\pmod p$ a $s=C^{(q+1)/4}\pmod q$
    \item vypočti $a,b$ tak, že $ap+bq=1$
    \item polož $x=(aps+bqr) \pmod n$,  $y=(aps-bqr) \pmod n$
    \item druhými odmocninami z~$C$ modulo $n$  jsou $\pm x$, $\pm y$.   
    \end{itemize}
    \medskip
  \zelene{Zdůvodnění:} Z Čínské zbytkové věty vyplývá, že $z^2\equiv C\pmod{pq}$, právě když   
  současně platí  $z^2\equiv C\pmod{p}$ a  $z^2\equiv C\pmod{q}$. Lze ukázat, že pro každé liché prvočíslo platí, že kvadratická kongruence  $z^2\equiv C\pmod{p}$ má řešení právě když
$C^{\frac{p-1}{2}}\equiv 1\pmod p$. Tedy při počítání $\pmod p$ dostáváme
$x^2\equiv y^2\equiv (bq)^2r^2\equiv 1^2\cdot C^{\frac{p+1}{2}}\equiv C^{\frac{p-1}{2}}\cdot C\equiv 1\cdot C\equiv C\pmod p$.

Analogický výpočet lze provést $\pmod q$.
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}{Příklad}
  \begin{priklad}
    V~Rabinově kryptosystému Alice zvolila za svůj soukromý klíč $p=23, q=31$, veřejným klíčem je pak $n=pq=713$. Zašifrujte zprávu $M=327$ pro Alici a ukažte, jak bude Alice tuto zprávu dešifrovat.   
  \end{priklad}

%\pause
  $C\equiv 327^2\equiv 692$. Při dešifrování spočítáme
  
  $C^6\equiv (2)^6\equiv 18\pmod {23}$ a $C^8\equiv 10^8\equiv 14\pmod {31}$. 
  Dále $-4\cdot23+3\cdot31=1$. Proto máme 4 kandidáty na zprávu, a to
   $\pm 4\cdot 23\cdot 14\pm 3\cdot 31\cdot 18\pmod{713}$. To jsou  čísla $\pm 38$
   a $\pm 327\pmod {731}$.
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}	{Princip digitálního podpisu}

%Proces podepisování a ověření podpisu zprávy $M$ probíhá obvykle v následujících krocích.
%
%\pause
Podepisování
  \begin{enumerate}
  \item Vygeneruje se otisk (hash) $H_M$ zprávy pevně stanovené délky (např. 160 nebo 256 bitů).
  \item Podpis zprávy $S_A(H_M)$ je vytvořen (pomocí dešifrování) z tohoto hashe s nutností znalosti soukromého klíče $S_A$ podepisujícího.
  \item Zpráva $M$ (případně zašifrovaná veřejným klíčem příjemce) je spolu  s podpisem odeslána.
  \end{enumerate}

\medskip
%\pause
Ověření podpisu
  \begin{enumerate}
  \item K přijaté zprávě $M$ se (po jejím případném dešifrování) vygeneruje otisk $H'_M$
  \item S pomocí veřejného klíče $V_A$ (deklarovaného) odesílatele zprávy se rekonstruuje původní otisk zprávy $V_A(S_A(H_M))=H_M$.
  \item Oba otisky se porovnají $H_M=H'_M$?.
  \end{enumerate}
\end{frame}
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

\begin{frame}
  \frametitle{Výměna klíčů podle Diffie-Hellmana}

\textit{Diffie, Hellman} (1976), \textit{ Williamson} (1974)

Výměna klíčů pro symetrickou kryptografii bez předchozího kontaktu
(tj. náhrada jednorázových klíčů, kurýrů s kufříky, \dots).

%\pause

\begin{itemize}[<+->]
\item Dohoda stran na \cervene{prvočísle} $p$ a \cervene{primitivním kořenu} $g$ modulo $p$ (veřejné). (Zopakujme, že $g$ je primitivní kořen modulo prvočíslo $p$, jestliže $g^n\equiv 1 \pmod p$ pouze pro násobky $p-1$.)
\item Alice vybere náhodné číslo $a$ a pošle Bobovi $g^a \pmod p$  
\item Bob vybere náhodné $b$ a pošle Alici $g^b \pmod p$
\item Společným klíčem pro komunikaci je $g^{ab} \pmod p$. 
\end{itemize}
\end{frame}

%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
\begin{frame}
\frametitle{Kryptosystém ElGamal}
    Z protokolu Diffie--Hellman  na výměnu klíčů je odvozen šifrovací algoritmus ElGamal:
    \begin{itemize}
    \item Alice zvolí prvočíslo $p$ spolu s primitivním kořenem $g$. 
    \item Alice zvolí \textbf{tajný klíč} $a$, spočítá $h=g^a \pmod p$  a  zveřejní \textbf{veřejný klíč} $(p,g,h)$.
    \item Šifrování zprávy $M$: Bob zvolí náhodné $b$ a vypočte $C_1=g^b \pmod p$ a $C_2=M\cdot h^b \pmod p$
     a pošle Alici $(C_1,C_2)$.
    \item Dešifrování zprávy provede Alice tak, že spočítá inverzi $I$ k~$C_1^a=(g^{b})^a=g^{ab}\pmod p$ a vynásobí 
    $C_2\cdot I\equiv M\cdot g^{ab}\cdot I\equiv M\pmod p$.
    \end{itemize}

Příklad najdete ve cvičení. Analogicky jako pro RSA lze odvodit podepisování.
\end{frame}




\end{document}

