From 48a93a731e67c99c153ceeb13ef5bb978bba3cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Wed, 7 Apr 2021 21:26:53 +0200 Subject: add new stuff about AES --- buch/chapters/90-crypto/aes.tex | 94 +++++++++++++++++++++++++++- buch/chapters/90-crypto/images/dh.pdf | Bin 27689 -> 27689 bytes buch/chapters/90-crypto/images/elliptic.pdf | Bin 21278 -> 21278 bytes buch/chapters/90-crypto/images/keys.pdf | Bin 11043 -> 22934 bytes buch/chapters/90-crypto/images/keys.tex | 59 ++++++++++++----- 5 files changed, 137 insertions(+), 16 deletions(-) diff --git a/buch/chapters/90-crypto/aes.tex b/buch/chapters/90-crypto/aes.tex index 968b2c6..acdda22 100644 --- a/buch/chapters/90-crypto/aes.tex +++ b/buch/chapters/90-crypto/aes.tex @@ -333,9 +333,99 @@ c(Z) = \texttt{03}_{16}Z^3 + Z^2+Z^1+\texttt{02}_{16}, \] die natürlich ebenfalls umkehrbar ist. -\subsection{Rundenschlüssel -\label{buch:subsection:rundenschlüssel}} +\subsection{Schlüssel +\label{buch:subsection:schlüssel}} +Die von den Byte- und Blockoperationen mischen die einzelnen Bits +der Daten zwar ganz schön durcheinander, aber es wird noch kein +Schlüsselmaterial eingearbeitet, welches den Prozess einzigartig +macht. +\subsubsection{Schlüsseladdition} +Nach jeder Spaltenmischoperation wird ein Rundenschlüssel +zum Blockhinzuaddiert. +Beim ersten Mal wird dazu einfach das Schlüsselmaterial verwendet. +Für die folgenden Runden muss aus diesem Schlüssel neues +Material, die sogenannten Rundenschlüssel, gewonnen werden. + +\subsubsection{Rundenschlüssel} +\begin{figure} +\centering +\includegraphics{chapters/90-crypto/images/keys.pdf} +\caption{Erzeugung der erweiterten Schlüsseldaten aus dem Schlüssel +$K_0,\dots,K_7$ für Schlüssellänge 256\,bit. +Die mit $S$ beschrifteten Blöcke wenden die $S$-Box auf jedes einzelne +Byte an. +$\pi$ ist die zyklische Vertauschung der Bytes eines Wortes. +Die Operation $r_i$ ist eine Addition einer Konstanten, die in jeder +Runde anders ist. +\label{buch:crypto:fig:keys}} +\end{figure} +Die Erzeugung der Rundenschlüssel ist in Abbildung +\ref{buch:crypto:fig:keys} +schematisch dargestellt. +Die Blöcke beschreiben wieder Spaltenvektoren im vierdimensionalen +Raum $\mathbb{F}_{2^8}^4$. +Die Blöcke $K_0$ bis $K_7$ stellen den ursprünglichen Schlüssel dar. +Die Erzeugung eines neuen Blocks Schlüsselmatrial beginnt damit, +dass der letzte Vektor des vorangegangenblocks drei Operationen +unterworfen werden. +\begin{itemize} +\item +Die Operation $\pi$ vertauscht die Bytes des Vektors zyklisch: +\begin{center} +\begin{tikzpicture}[>=latex,thick] +\def\s{0.6} +\begin{scope} +\draw (0,0) rectangle (\s,{4*\s}); +\foreach \y in {1,...,3}{ + \draw (0,{\y*\s}) (\s,{\y*\s}); +} +\node at ({0.5*\s},{0.5*\s}) {$b_3$}; +\node at ({0.5*\s},{1.5*\s}) {$b_2$}; +\node at ({0.5*\s},{2.5*\s}) {$b_1$}; +\node at ({0.5*\s},{3.5*\s}) {$b_0$}; +\end{scope} +\draw[->] ({1.1*\s},{2*\s}) -- ({4.9*\s},{2*\s}); +\node at ({3*\s},{2*\s}) [above] {$\pi$}; +\begin{scope}[xshift=3cm] +\draw (0,0) rectangle (\s,{4*\s}); +\foreach \y in {1,...,3}{ + \draw (0,{\y*\s}) (\s,{\y*\s}); +} +\node at ({0.5*\s},{0.5*\s}) {$b_0$}; +\node at ({0.5*\s},{1.5*\s}) {$b_3$}; +\node at ({0.5*\s},{2.5*\s}) {$b_2$}; +\node at ({0.5*\s},{3.5*\s}) {$b_1$}; +\end{scope} +\end{tikzpicture} +\end{center} +\item +Die $S$-Operation wendet die $S$-Box auf alle Bytes eines Vektors an. +\item +Die $r_i$ Operation addiert in Runde eine Konstante $r_i$ zur $0$-Komponente. +\end{itemize} +Die Konstante $r_i$ ist wieder ein einzelnes Byte und es ist daher +naheliegend, diese Bytes mit Hilfe der Arithmetik in $\mathbb{F}_{2^8}$ +zu erzeugen. +Man kann daher $r_i$ definieren als +$(\texttt{02}_{16})^{i-1}\in\mathbb{F}_{2^8}$. + +\subsection{Runden} +Der AES-Verschlüsselungsalgorithmus besteht jetzt darin, die bisher +definierten Operationen wiederholt anzuwenden. +Eine einzelne Runde besteht dabei aus folgenden Schritten: +\begin{enumerate} +\item Wende die $S$-Box auf alle Bytes des Blocks an. +\item Führe den Zeilenshift durch. +\item Mische die Spalten (wird in der letzten Runde) +\item Erzeuge den nächsten Rundenschlüssel +\item Addiere den Rundenschlüssel +\end{enumerate} +Der AES-Verschlüsselungsalgorithmus beginnt damit, dass der Schlüssel +zum Datenblock addiert wird. +Anschliessend werden je nach Blocklänge verschiedene Anzahlen von +Runden durchgeführt, 10 Runden für 128\,bit, 12 Runden für 192\,bit und +14 Runden für 256\,bit. diff --git a/buch/chapters/90-crypto/images/dh.pdf b/buch/chapters/90-crypto/images/dh.pdf index 67b95a5..eede4bd 100644 Binary files a/buch/chapters/90-crypto/images/dh.pdf and b/buch/chapters/90-crypto/images/dh.pdf differ diff --git a/buch/chapters/90-crypto/images/elliptic.pdf b/buch/chapters/90-crypto/images/elliptic.pdf index d408f1e..e58639f 100644 Binary files a/buch/chapters/90-crypto/images/elliptic.pdf and b/buch/chapters/90-crypto/images/elliptic.pdf differ diff --git a/buch/chapters/90-crypto/images/keys.pdf b/buch/chapters/90-crypto/images/keys.pdf index 99f991f..2c6b4b9 100644 Binary files a/buch/chapters/90-crypto/images/keys.pdf and b/buch/chapters/90-crypto/images/keys.pdf differ diff --git a/buch/chapters/90-crypto/images/keys.tex b/buch/chapters/90-crypto/images/keys.tex index 68920a5..d556b7c 100644 --- a/buch/chapters/90-crypto/images/keys.tex +++ b/buch/chapters/90-crypto/images/keys.tex @@ -34,55 +34,86 @@ \draw[->] \punkt{(\x+0.5)}{-2.9} -- \punkt{(\x+0.5)}{-4.9}; } \foreach \x in {0,3,...,18}{ - \draw[->] \punkt{(\x+1)}{-7} -- \punkt{(\x+2)}{-7} + \draw[->] \punkt{(\x+1.1)}{-7} -- \punkt{(\x+2)}{-7} -- \punkt{(\x+2)}{-2.5} -- \punkt{(\x+3.1)}{-2.5}; } \fill[color=white] - \punkt{(9+1.5)}{-5.25} + \punkt{(9+1.25)}{-5.5} rectangle - \punkt{(9+2.5)}{-4.25}; + \punkt{(9+2.75)}{-4.00}; \draw - \punkt{(9+1.5)}{-5.25} + \punkt{(9+1.25)}{-5.5} rectangle - \punkt{(9+2.5)}{-4.25}; + \punkt{(9+2.75)}{-4.00}; \node at \punkt{(9+2)}{-4.75} {$S$}; } + \def\blocks#1{ \foreach \x in {0,3,...,21}{ \wort{\x}{0}{#1} } } -\def\schlange{ +\def\schlange#1{ \draw[->] \punkt{22.1}{2} -- \punkt{23}{2} -- \punkt{23}{-1.0} -- \punkt{-3}{-1.0} -- \punkt{-3}{-8} -- \punkt{-1}{-8} -- \punkt{-1}{-2.5} -- \punkt{0.1}{-2.5}; ; - \fill[color=white] \punkt{-3.5}{-1.5} rectangle \punkt{-2.5}{-3.5}; - \draw \punkt{-3.5}{-1.5} rectangle \punkt{-2.5}{-3.5}; + \fill[color=white] \punkt{-3.75}{-1.75} rectangle \punkt{-2.25}{-3.25}; + \draw \punkt{-3.75}{-1.75} rectangle \punkt{-2.25}{-3.25}; \node at \punkt{-3}{-2.5} {$\pi$}; - \fill[color=white] \punkt{-3.5}{-3.5} rectangle \punkt{-2.5}{-5.5}; - \draw \punkt{-3.5}{-3.5} rectangle \punkt{-2.5}{-5.5}; + + \fill[color=white] \punkt{-3.75}{-3.75} rectangle \punkt{-2.25}{-5.25}; + \draw \punkt{-3.75}{-3.75} rectangle \punkt{-2.25}{-5.25}; \node at \punkt{-3}{-4.5} {$S$}; - \fill[color=white] \punkt{-3.5}{-5.5} rectangle \punkt{-2.5}{-7.5}; - \draw \punkt{-3.5}{-5.5} rectangle \punkt{-2.5}{-7.5}; - \node at \punkt{-3}{-6.5} {$r$}; + + \fill[color=white] \punkt{-3.75}{-5.75} rectangle \punkt{-2.25}{-7.25}; + \draw \punkt{-3.75}{-5.75} rectangle \punkt{-2.25}{-7.25}; + \node at \punkt{-3}{-6.5} {$r_{#1}$}; } \begin{scope} \blocks{blue!20} - \schlange + \foreach \x in {0,...,7}{ + \node at \punkt{(3*\x+0.5)}{2} {$K_\x$}; + } + \schlange{1} \summe \end{scope} \begin{scope}[yshift=-4.5cm] \blocks{darkgreen!20} + \foreach \x in {8,...,15}{ + \node at \punkt{(3*(\x-8)+0.5)}{2} {$K_{\x}$}; + } + \schlange{2} \summe \end{scope} \begin{scope}[yshift=-9cm] \blocks{darkgreen!20} + \foreach \x in {16,...,23}{ + \node at \punkt{(3*(\x-16)+0.5)}{2} {$K_{\x}$}; + } + \schlange{3} + \summe +\end{scope} + +\begin{scope}[yshift=-13.5cm] + \blocks{darkgreen!20} + \foreach \x in {24,...,31}{ + \node at \punkt{(3*(\x-24)+0.5)}{2} {$K_{\x}$}; + } + \foreach \x in {0,3,...,21}{ + \draw[->,color=gray] + \punkt{(\x+0.5)}{-0.1} -- \punkt{(\x+0.5)}{-2.1}; + \node[color=gray] at \punkt{(\x+0.5)}{-2.1} [below] {$\vdots$}; + } + \draw[color=gray] \punkt{22.1}{2} -- \punkt{23}{2} + -- \punkt{23}{-1.0} -- \punkt{-3}{-1.0} + -- \punkt{-3}{-2.1}; + \node[color=gray] at \punkt{-3}{-2.1} [below] {$\vdots$}; \end{scope} \end{tikzpicture} -- cgit v1.2.1