% !TEX root = ../thesis.tex
\chapter{Bezpečnostný problém pri RNG v prostredí VM}
Virtuálny stroj (ďalej \acrshort{vm}) je softvér, pomocou ktorého dokážeme vytvoriť abstraktné, respektíve virtuálne prostredie medzi našim počítačom a inou platformou. Celý tento proces je nezávislý od aktuálne použitého operačného systému. Používateľ dokáže takto spustiť aj aplikačné sady, ktoré nie su určené práve pre~jeho OS. \acrshort{vm} umožní inštaláciu virtuálneho OS na aktuálnom systéme pomocou zdieľania hardvérového vybavenia počítača. V dnešnej dobe je virtuálizácia vysoko populárna. Svoje uplatnenie našli v~rôznych sférach. Príkladom použitia sú spoločnosti zamerané na virtuálizáciu sieti. Prostredníctvom jednoduchej náhrady alebo rozšírenia softvéru dokážu poskytnúť väčšiu spoľahlivosť a flexibilitu svojich služieb, bez nutnosti nákupu viacerých zariadení. Obdobne zasahuje virtuálizácia aj do procesu vývoja a testovania aplikácií. 

Problematika VM je natoľko rozsiahla, že by mohla byť predmetom osobitnej práce. Avšak vzhľadom k aktuálnej problematike je opis základných princípov a metód týchto nástrojov vynechaný. Čitateľ má možnosť získať informácie prostredníctvom odkazu na video \cite{odkaz}. Autor v priebehu úvodných minút opisuje základné princípy virtuálizácie. Následne aj demonštruje spustenie konkrétneho linuxového operačného systému. 

V publikácií \cite{vm1}, autori zrealizovali úspešný útok vo virtuálnom prostredí s~OS Windows. Dokument opisuje útok na implementáciu TLS protokolu pri štandardne zabezpečenej komunikácii medzi serverom a klientom. TLS\footnote{Z~ang. \textit{Transport Secure Layer}.} sa používa na zabezpečenie komunikácie s využitím certifikátov pri distribúcií verejného kľúča. Absolútnym základom útoku je vedomosť tzv. bezpečnostnej zraniteľnosti pri obnovení snímky obrazu\footnote{Z ang. \textit{VM reset vulnerabilities}.}. Následne autori dokázali pri opakovanom obnovení snímky extrahovať tajný kľúč servera. Ten vznikne deterministickým procesom pričom sa použijú náhodné dáta z \acrshort{rng}. Vlastník kľúča sa môže vydávať za~server a klient nedokáže rozoznať rozdiel.


Táto kapitola demonštruje aktuálny bezpečnostný problém v prostredí OS Windows na platforme VM, avšak so zameraním na proces generovania náhodných dát po obnovení snímky obrazu s uvedeným OS. Vzhľadom na využitie výstupov z RNG je teda teoreticky možné použiť uvedenú chybu aj pri pokuse o sieťový útok. Overenie aktuálnosti problému realizujeme experimentom. Použijú sa \acrshort{rng} rozhrania systému Windows\footnote{Funkcia \textit{BCryptGenRandom}.} a knižnice OpenSSL\footnote{\textit{Rand} príkaz v prostredí príkazového riadku.}, na generovanie kryptograficky bezpečných pseudo-náhodných čísel.

\section{Opis bezpečnostného problému pri generovaní náhodných čísel po obnovení snímky obrazu VM s OS Windows}
Pred opisom problému je nutné vysvetliť pojem snímka obrazu \acrshort{vm}. Virtuálne stroje poskytujú možnosť spustiť ľubovoľný OS na počítači, bez nutnosti zmeny aktuálneho systému. Ďalšou z~vymožeností tohto prostredia je možnosť vytvorenia kópie aktuálneho stavu pomocou tzv. snímky obrazu\footnote{Z~ang. \textit{Snapshots}.}. Pri tomto úkone dochádza k~úplnému uloženiu stavu daného systému. Výsledkom je súbor, vďaka ktorému je možné kedykoľvek obnoviť systém do stavu, aký bol počas vytvorenia snímky. Vrátane všetkých údajov v operačnej pamäti. Využitie je výhodné najmä pri spúštaní alebo inštalácií programov z neznámych zdrojov. Tie môžu poškodiť OS. Ďalším príkladom je aktualizácia systému. Po znehodnotení OS je takto možné obnoviť systém do bodu kedy bolo všetko v poriadku. Po načítaní snímky je možné ďalej pokračovať v práci avšak iba s dátami z obdobia vzniku snímky.

\textit{VM reset vulnerabilities} pomenúva pôvodný anglický názov pre bezpečnostné riziko. Doslovný preklad do slovenčiny nie je celkom výstižný. Preto zavedieme pomenovanie problému ako -- Zraniteľnosť pri obnovení snímky obrazu VM. Po~reštarte uvedeným spôsobom, je možné zreprodukovať aj výstupy systémových CSPRNG. Táto skutočnosť rapídne znižuje bezpečnosť algoritmov ako AES \cite[kap. 5]{levicky}, ktorý sa používa pri symetrickom šifrovaní, resp. dešifrovaní dát práve pomocou tajného kľúča. Ďalším príkladom je DSA\footnote{Z ang. \textit{Digital Signature Algorithm}.}\cite[kap. 11]{levicky}, používaný pri digitálnych podpisoch. Ak má útočník k dispozícií kľúče, s ktorými uvedené nástroje pracujú, ich použitie za účelom zabezpečenia komunikácie je bezvýznamné. \\Pri častom používaní rovnakej snímky obrazu si teda útočník môže všimnúť podobnosti kľúčov. 

\section{Experimentálne overenie zraniteľnosti}
Realizáciu experimentu zabezpečí prenosný počítať A. Jeho konfigurácia je obsahom tabuľky \ref{pc}. Pri tomto experimente je použitá iná metodika práce ako v~\cite{vm1}. Vykonanie jedného z pokusov zabezpečí CSPRNG API operačného systému Windows 10. Tento proces je vykonaný pomocou funkcia BCryptGenRandom \cite{bcrypt}. Výstupy následne potvrdia bezpečnostné riziko. 

Prvé kroky sú spojené s voľbou hypervízora. Voľne dostupný nástroj je VirtualBox \cite{vbox}\footnote{Dostupný na: \url{https://www.virtualbox.org/wiki/Downloads}.}. V čase experimentu je dostupná 64-bitová verziu 6.0.24 (14. 07. 2020). Nasleduje voľba OS. Použili sa 64-bitový systém. Konkrétne Windows 10 Pro vo~verzii 1909 (zostava 18363.592). Konfigurácia systému prebieha podľa video návodu \cite{vmkonfig}. V tomto návode autor priradil OS v prostredí VM 2 procesory (ďalej \acrshort{cpu}\footnote{Z ang. \textit{Central Processing Unit}.}) My sme navýšili počet CPU na 4. Dôvodom je samotný OS, ktorý sa v prípade použitia konfigurácie so 4 CPU zdal rýchlejší. Následne sme ešte vykonali úpravu možnosti zdieľania súborov na obojsmernú. Tieto zmeny však neovplyvnia výsledok experimentu.

\subsection*{Prostredie Guest VM}
Po úspešnej inštalácii obrazu a sprístupnení OS je nutná príprava prostredia.

\subsubsection*{Vykonané inštalácie:} 
\begin{itemize}
	\item GCC prekladač -- Winlibs\footnote{Dostupný na: \url{ https://winlibs.com/}.} GCC, 10.2.0, 64-bitová verzia, pre potreby prekladu programov do strojového kódu. 
	\item VirtualBox Extension Pack -- 6.0.24, zabezpečí ovládače pre VM.
	\item Visual Studio Code \cite{vsc} -- voľne dostupné prostredie na úpravu, kompiláciu, a aj spustenie programov pomocou príkazového riadka.	
\end{itemize} 
\subsection{Postup pri realizácií experimentu }
Pokus je síce realizovaný prostredníctvom odporúčaného rozhrania na generovanie náhodných čísel -- \verb|BCryptGenRandom| \cite{bcrypt}. Avšak akékoľvek systémové RNG API (\verb|CryptGenRandom| i \verb|RtlGenRandom|) dosahuje rovnaké výsledky. Toto tvrdenie sme aj úspešne overili.

Podstata nášho experimentu spočíva v presnom zopakovaní tých istých krokov od načítania snímky obrazu v približne rovnakom čase. Grafický postup znázorňuje schéma \ref{vm}. V nasledujúcej časti je slovný opis.
\begin{figure}[!ht]
	\centering
	\includegraphics[width=\textwidth]{figures/vm}
	\caption{Grafické znázornenie krokov postupu\label{vm}}
\end{figure}

\textbf{Postup:}
\begin{enumerate}
	\item Príprava a preklad jednoduchého programu \verb|bcgr.exe| (\verb|BCryptGenRandom|). Jeho úlohou je generovanie náhodných čísel pomocou systémového rozhrania Windows. Viď. ukážku zdrojového kódu tohto programu \ref{vmbc}. Veľkosť výstupu vygenerovaných dát je v kóde stanovená na 1 920 B. Táto hodnota bola vykonaná pri poslednom experimente. Získaná je postupným násobením dvomi od veľkosti buffer-a 15 bajtov. Teda 15-30-60-120-...-1920. Pri hodnote 1920 B sme s navyšovaním skončili.
	
	 \noindent
	\begin{minipage}{\linewidth} 	
		%\section{Výpis kódu jazyka C}
		\begin{lstlisting}[frame=single,
			numbers=left,
			caption={Ukážka zdrojového kódu bcrypt.c},label=vmbc,
			basicstyle=\ttfamily\small, keywordstyle=\color{black}\bfseries,]	
#include<stdio.h>
#include<windows.h>
#include<ntstatus.h>
//gcc bcrypt.c -o bcrypt -lbcrypt  
int main(){
	int size= 1920;//size of data to generate in bytes
	BYTE   pbData[size];
	BCryptGenRandom(NULL,pbData,size,
									BCRYPT_USE_SYSTEM_PREFERRED_RNG);
	for( int i = 0; i < size;i++ )
		printf("%02X",pbData[i]); //02X for same printing
	printf("\n");
	return 0;
}	
		\end{lstlisting}
	\end{minipage}\\
	
	
	\item Po príprave algoritmu je nutné aby sa používateľ presunul do bodu, tesne pred spustením programu \verb|bcgr|, v príkazovom riadku. Pri experimente je použitý Windows PowerShell, prostredníctvom editora Visual Studio Code \cite{vsc}, v~ktorom sme vykonali prípravu aj preklad programu.
	\item V uvedenom bode je nutné vytvoriť snímku obrazu. Operačný systém bežiaci vo virtuálnom prostredí je možné následne vypnúť.
	\item V tomto bode používateľ potrebuje pre dosiahnutie úspešnosti použivať merací nastroj, napríklad stopky. Meranie je potrebné začať v ľahko identifikovateľnom mieste. Pri pokuse je aktivácia stopiek vykonaná v okamihu spustenia obnovenej snímky OS. Po sprístupnení systému sme spustili program \verb|bcgr.exe|. V čase spustenie sme zastavili meranie času. Dôležité pre~úspešný experiment je dosiahnuť spustenie \verb|bcgr.exe| vždy v rovnakom čase. Tento krok nie je celkom jednoduchý a vyžaduje zručnosť používateľa. 
	
	Pri pokuse sme program spúšťali približne 2 sekundy po sprístupnení systému. V čase od začiatku načítavania obrazu až po zapnutie programu nebolo počas experimentu vykonané nič. Žiaden pohyb myši ani stlačenia klávesnice. Toto je aj dôvod, prečo je snímka obrazu zaznamenaná pred zapnutím programu \verb|bcgr.exe|. 
	\item Takto vzniknuté dáta je nutné uložiť mimo VM. Dôvodom je, že pri obnovení pomocou snímky dôjde k zahodeniu všetkých dát, ktoré nie sú jej obsahom. Vrátane dát vzniknutých v kroku 4.
	\item V prípade neúspešnej realizácií experimentu je potrebné opakovať tento proces od kroku 4. Opakovanie je ukončené v prípade, že daná postupnosť už bola vygenerovaná. Stačí, ak sa používateľ zameria na prvé znaky výstupu. Dôvodom je, že ak by došlo k zmene len jedného bitu pred generovaním, tak výsledná postupnosť bude úplne iná. Tato vlastnosť je charakteristická pre generátor \acrshort{aes}, ktorý OS Windows používa.   
	\item Hneď po zaznamenaní zhody v počiatočných hodnotách podrobíme dáta testovaniu zhody. Za účelom tohto procesu je vytvorený program \\\verb|compare.exe|. Jeho úlohou je kontrola zhody v~dvoch rovnako dlhých reťazcoch. Zdrojový kód je znázornený v ukážke \ref{vmcmp}. Program \verb|compare.exe| je nutné pri každej zmene kompilovať pomocou \acrshort{gcc} prekladača. Za zhodu je považovaná rovnosť hodnoty a polohy vo vygenerovanej postupnosti. Výstup poskytuje hodnotu nájdenej zhody v~percentách. V~prípade úplnej zhody je používateľ upozornený slovným výstupom.       
\end{enumerate}

	
\noindent
\begin{minipage}{\linewidth} 	
	%\section{Výpis kódu jazyka C}
	\begin{lstlisting}[frame=single,
		numbers=left,
		caption={Ukážka zdrojového kódu compare.c},label=vmcmp,
		basicstyle=\ttfamily\small, keywordstyle=\color{black}\bfseries,]	
#include <stdio.h>
#include <string.h>
//gcc compare.c -o compare 
/*
place for generated data
*/
int main(){
	char string1[]={"1.dataToCompare"};
	char string2[]={"2.dataToCompare"};
	int size=sizeof(string1)/sizeof(string1[0]);
	if(strcmp(string1, string2)==0){
		printf("ABSOLUTE MATCH\n");
	}else {
		int i=0,counter=0;
		while(i<size){
			if(string1[i]==string2[i])
			counter++;
			i++;
		}
		printf("MATCH in %.2f percent\n", 
		(double)(counter*100)/size);
	}
	return 0;
}	
	\end{lstlisting}
\end{minipage}\\

\subsection*{Experiment s knižnicou OpenSSL v.1.1.1k}
Po úspešnom prvom experimente so systémovými rozhraniami je overená i~knižnica OpenSSL. Pri generovaní náhodných dát je použitý ako \textbf{zdroj náhodnosti} výstup z CSPRNG API systému, na ktorom je naimplementová zvolená funkcionalita. Teda ak je niektorá z funkcií na RNG implementovaná v OS Windows, tak vstupom OpenSSL generátora \textbf{je výstup funkcie BCryptGenRandom}. Periodicky dochádza k reseed procesu, pričom prvotná inicializácia OpenSSL generátora prebehne pri spustení. 

Pri experimente boli aplikované rovnaké metódy ako pri softvérových rozhraniach.
Generovanie sme vykonali v rozhraní OpenSSL, konkrétne cez prostredie \verb|Command Prompt| (ďalej \verb|cmd|). Knižnicu OpenSSL sme spustili prikazom \verb|openssl| v prostredí \verb|cmd|. V~spustenej aplikácii sme použili príkaz:

\verb|rand -out result.txt -base64 100|.\\
Pred vykonaním sme vytvorili snímku obrazu. Úlohou príkazu je vygenerovať náhodné dáta s veľkosťou 100 bajtov a~uložiť ich do textového súboru \verb|result.txt| vo~formáte \textit{Base64} \cite{base}. 
Pokus sme zopakovali 30-krát avšak ani raz sa nám pri experimente nepodarilo zreprodukovať výstup z generovania.
\section{Vyhodnotenie výsledkov testovania}
Vzhľadom k dobe, ktorá ubehla od uverejnenia článku \cite{vm1}, bolo očakávané úplné vyriešenie tohto bezpečnostného rizika. Počas experimentu sa podarilo vyvrátiť túto hypotézu. Dôkazom je videozáznam, ktorý demonštruje postup od 4. do 7 kroku experimentu. Záznam je obsahom prenosného média prílohy A, spoločne so zdrojovými kódmi použítými pri experimente. Videozáznam je možné vyhľadať aj na webovej platforme Youtube pomocou odkazu \cite{yt1}.  Vďaka videu je zrejmé, že pri používaní systémových \acrshort{rng} rozhraní isté bezpečnostný problém pretrváva.

Je však nutné poukázať na skutočnosť, že zopakovať výstup generovania pomocou systémových RNG API s rovnakým výsledkom, vyžaduje splnenie podmienok, ktoré užívateľ pri bežnej práci nevykonáva. Viď vyššie uvedený postup. Obdobne bolo potrebné počas testovania vykonať veľké množstvo pokusov. Niekedy bolo nutné počas generovaní konkrétnej postupnosti absolvovať reštart obrazu aj 20-krát.
 
Uvedený bezpečnostný problém však neplatí v~prípade použitia kryptografickej knižnice OpenSSL. Pri testovaní bezpečnostného problému pri obnovení snímky obrazu v prostredí VM s OS Windows 10 sa ani raz nepodarilo zreprodukovať výstup z~\acrshort{rng} rozhrania v~tejto knižnici. Tento fakt potvrdzuje kvalitu spracovania kryptografickej knižnice OpenSSL, ktorá je aj pravidelne udržiavaná a aktualizovaná. V prípade zistenia nejakej chyby dochádza často k jej rýchlemu odstráneniu.

V porovnaní s \cite{vm1}, je situácia v dnešnej dobe pravdepodobne nenapodobiteľná. Je nutné uvedomiť si, že istý potenciál na útočenie existuje. Ak Windows 10 beží prostredníctvom hypervízora, tzv. Hyper-V, tak po obnovení následne dochádza k reseed-u stavov koreňového generátora systému. Týmto sa značne redukuje čas, kedy je možné uvedený bezpečnostný problém využiť. Jeho implementácia je dnes štandardná.  Okrem toho väčšina softvérových hypervízorov pracuje aj v kooperácií s hardvérovými ako Intel VM-x a AMD-V. Jedinou podmienkou je ich povolenie v BIOS-e. Na dnešných počítačoch je však možnosť virtuálizácie hardvéru štandardne zapnutá. Používateľ teda nie je nútený zasahovať do týchto nastavení. 

Tento problém je dlhodobo známy fakt. Vzhľadom k~veľkej popularite a rozvoju VM očakávame v blízkej dobe úplne odstránenie uvedeného bezpečnostného rizika

\subsection*{Aktualizácia softvérového vybavenia}
V čase tvorby práce došlo k aktualizáciám softvérov použitých v tejto kapitole. 
Zmeny sa týkajú: 
\begin{enumerate}
	\item aktualizácia OS Windows -- 10, Pro, 64-bitová verzia, v20H2,   19042.985, 
	\item GCC prekladač -- Winlibs, 64-bitový, v11.1.0, 
	\item VirtualBox -- 6.1.22 (vrátane doplnkov). 
\end{enumerate}
Testovanie bolo vykonané aj pomocou aktualizovaných nástrojov. Bezpečnostné riziko aj napriek uvedeným zmenám stále pretrváva. Aktualizovaný videozáznam (\cite{yt2}) spoločne s údajmi o nástrojoch je taktiež obsahom prílohy A. 

Je nutné informovať čitateľa o možnom probléme pri realizácii vyššie uvedených experimentov. Ak je na natívnom OS Windows použitý Windows Subsystem pre Linux vo verzii 2 (WSL2), tak je vysoko pravdepodobné, že nedosiahnete výsledky uvedené v tejto publikácií. Pred aplikovaním metód je potrebné deaktivovať túto funkciu. Dôvodom je interferencia medzi Hyper-V a týmto systémom. Občasne môže spôsobovať aj pády, respektíve nespoľahlivý výkon systému.

\chapter{Vyhodnotenie dosiahnutých výsledkov}
\label{evaluation}
Obsahom tejto kapitoly je vyhodnotenie dosiahnutých výsledkov, ktoré sme získali počas experimentálnych meraní a štatistického testovania náhodných dát. Následne pomocou týchto dát vytvoríme odporúčanie pre použitie funkcií v prostredí OS Windows.  

\subsection*{Vyhodnotenie štatistického testovania dát}
V tabuľke \ref{vysledok2} sú znázornené výsledky štatistického testovania náhodných dát pomocou sady NIST STS. Dáta z meraní jednotlivých funkcií sú obsahom prílohy A. Pomocou vyhodnotenia sady sme vypočítali celkovú úspešnosť na základe pomeru počtu úspešných a všetkých testov. 

Pri spustení štatistickej sady na každý výstup náhodných dát testovanej funkcie sme použili rovnaké inicializačné parametre. Konkrétne, vstupná postupnosť $m = 1 000 000 $bitov, počet prúdov $n = 4600$ a preddefinované hodnoty testov sme ponechali nezmenené. Pri uvedenej konfigurácii sady trvalo jedno testovanie okolo 10 hodín. Testy boli vykonané na počítači A. Špecifikácia tohto zariadenia je obsahom tabuľky \ref{pc}.      
\begin{table}[h!]
	\centering
	\resizebox{\textwidth}{!}{%
		\begin{tabular}{c|c|c|c|c}
			\multirow{2}{*}{\bfseries Funkcia} &
			\multicolumn{4}{|c}{\bfseries Hodnoty} 
			\\
			& API
			& Testy celkovo
			& Úspešné testy
			& Úspešnosť [\%]
			\\\hline\hline
			RDSEED
			& AMD
			& 188
			& 188
			& 100
			\\
			RDRAND
			& AMD
			& 188
			& 186
			& 98,94
			\\
			RtlGenRandom
			& Windows
			& 188
			& 188
			& 100
			\\
			CryptGenRandom
			& Windows
			& 188
			& 186
			& 98,94
			\\
			BCryptGenRandom
			& Windows
			& 188
			& 187
			& 99,47
			\\
			rand\_s
			& jazyk C
			& 188
			& 187
			& 99,47
			\\
			RAND\_bytes
			& OpenSSL
			& 188
			& 188
			& 100
			\\
			RAND\_priv\_bytes
			& OpenSSL		
			& 188
			& 188
			& 100
		\end{tabular}%
	}
	\caption{Vyhodnotenie kvality výstupov funkcií pomocou NIST STS}
	\label{vysledok2}
\end{table}

Vzhľadom k výsledkom je potrebné informovať čitateľa, že aj napriek nižšej úspešnosti niektorých funkcií, boli dáta vygenerované z~\acrshort{csprng} a môžeme ich~považovať za kvalitné. Dôvodom neúspešnosti je citlivosť testov a snaha generátorov o rovnomerné rozloženie vygenerovaných dát (\textbf{uniformita dát}). Citlivosť sady je priamo úmerná veľkosti testovaných dát. Výsledná úspešnosť väčšiny testov musí byť približne 99 percent z celkového počtu vykonaných testov. Napríklad pri vykonaní 1000 testov je testovanie považované za úspešne, ak bolo úspešných aspoň 990 testov. Zároveň však platí, že pri veľkom počte testovaných dát sa dokonca očakáva, že dôjde k~istým odchýlkam z~množiny hodnôt, ktoré sú typické pre náhodné dáta. Tento jav súvisí s rovnomerným rozložením výstupov \acrshort{rng}. Uvedené fakty platia aj pre $P\text{-VALUE}$. Opis tejto hodnoty je obsahom kapitoly \ref{nist}. 
\subsection*{Vyhodnotenie experimentálnych meraní}
Na základe označenia prvkov \ref{merania}. a priebežných experimentálnych meraní v 5. kapitole, je vytvorená tabuľka \ref{vysledok1}. 

Poradie rozhraní v uvedenej tabuľke vzniklo nasledujúcim spôsobom. Vypočítali sme súčet \acrshort{anc} všetkých počítačov pri maximálnej možnej veľkosti $BS$. Takto vzniknuté číslo sme následne vydelili počtom meracích zariadení. Hodnoty jednotlivých rozhraní sme usporiadali vzostupne. 
\begin{table}[ht!]
	\centering
	\resizebox{\textwidth}{!}{%
		\begin{tabular}{c|c|c|c|c|c|c}
			\multirow{2}{*}{\bfseries Funkcia} &
			\multicolumn{6}{|c}{\bfseries Hodnoty} 
			\\
			& Poradie
			& API
			& $NI$
			& $BS$
			& $V_D$
			& $\approx$ Priemer cyklov
			\\\hline\hline
			RAND\_bytes
			& 1
			& OpenSSL
			& 16
			& UINT\_MAX
			& 32 GB
			& 1,752 $*$ $10^9$
			\\
			RAND\_priv\_bytes
			& 2
			& OpenSSL
			& 16
			& UINT\_MAX
			& 32 GB
			& 1,753 $*$ $10^9$
			\\
			RtlGenRandom
			& 3
			& Windows
			& 8
			& ULONG\_MAX
			& 32 GB
			& 3,925 $*$ $10^9$
			\\
			BCryptGenRandom
			& 4
			& Windows
			& 8
			& ULONG\_MAX
			& 32 GB
			& 3,945 $*$ $10^9$
			\\
			CryptGenRandom
			& 5
			& Windows
			& 8
			& ULONG\_MAX
			& 32 GB
			& 4,593 $*$ $10^9$
			\\
			RDRAND
			& 6
			& AMD
			& 8
			& ULONG\_MAX
			& 32 GB
			& 1,445 $*$ $10^{12}$
			\\
			RDSEED
			& 7
			& AMD
			& 8
			& ULONG\_MAX
			& 32 GB
			& 3,098 $*$ $10^{12}$
			\\
			rand\_s
			& 8
			& jazyk C
			& 8 589 934 592
			& uint32\_t
			& 32 GB
			& 2,302 $*$ $10^{15}$
			\\
		\end{tabular}%
	}
	\caption{Vyhodnotenie funkcií podľa výsledkov meraní}
	\label{vysledok1}
\end{table}

\subsection*{Celkové vyhodnotenie získaných výsledkov}
Vzhľadom k faktu, že každá testovaná funkcia poskytuje kvalitné a kryptograficky bezpečné náhodné dáta, tak odporúčanie vykonáme na základe poradia tabuľky \ref{vysledok1}.

Knižnica OpenSSL ponúka kvalitne spracované rozhranie na generovanie kryptograficky bezpečných náhodných čísel. Úspešne zvládla experimenty, ktoré sú obsahom tejto práce. Vrátane bezpečnostného problému v prostredí \acrshort{vm} s OS Windows. Generovanie náhodných čísel vykonáva s najmenším počtom potrebných inštrukcií. Ďalšími plusmi sú pravidelné aktualizácie, ľahká implementácia, možnosť použitia na rôznych typoch OS a voľná dostupnosť pre používateľa. Na základe uvedených faktov odporúčame používateľovi pri tvorbe kryptografických aplikácií na platforme Windows, použiť práve \acrshort{rng} rozhrania tejto knižnice. Výsledky oboch funkcií sú takmer rovnaké. \verb|RAND_priv_bytes| by sme však mali implementovať v prípade, že nedochádza k ukladaniu vygenerovaných dát. Napríklad pri generovaní seed hodnoty a podobne.    

V prípade systémových rozhraní dosiahla najlepšie výsledky pri meraní cyklov funkcia \verb|RtlGenRandom|. Výhodou je jednoduchá implementácia. Problémom však ostáva jej podpora systému v budúcnosti. Prí tvorbe kryptografickej aplikácie je nevyhnutne nutné ošetriť kompatibilitu systému pomocou funkcie \\\verb|BCryptGenRandom| alebo pomalšej \verb|CryptGenRandom|. Ak dochádza k~častému obnovovaniu snímok obrazu v prostredí virtuálnych strojov s OS Windows, tak použitie systémových RNG rozhraní neodporúčame vzhľadom k~existujúcemu bezpečnostnému problému. 
        
Používateľ má k dispozícií ešte procesorové inštrukcie \verb|RDSEED| a \verb|RDRAND|. Obidve poskytujú dostatočne kvalitné dáta. Najmä prvá z uvedených. Ich najväčšou nevýhodou je dĺžka potrebného času pri generovaní náhodných dát. Ak pri implementácií nie je proces náchylný na rýchlosť vykonávania tak odporúčame použitie funkcie \verb|RDSEED|. V prostredí VM je nutná dodatočná konfigurácia hypervízora na~povolenie prístupu k~uvedeným inštrukciám.

Funkciu \verb|rand_s| \textbf{neodporúčame} na použitie v kryptografických aplikáciach. Dôvodom sú dosiahnuté výsledkom meraní, ktoré naznačujú, že použitie hardvérových generátorov pomocou inštrukčných sád, je v tomto prípade lepšia alternatíva. Dôvodom je obmedzená veľkosť buffer-a na hodnotu 32 bitov. Táto funkcia je vhodná ako príklad na generovania náhodných dát.