X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=rapport%2Fmain.tex;h=7a603cef0336a96eb98a84ae219b9b4e8db58136;hb=0508ca9ddb817b14ca747f8736ea1960cb70d2e7;hp=508355dcc84c20d08af00c241e2c26fd08b99115;hpb=61a8b3492e89e883b23c158eb52ba2b070234df8;p=crypto_lab2.git diff --git a/rapport/main.tex b/rapport/main.tex index 508355d..7a603ce 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -10,6 +10,7 @@ \usepackage{url} \usepackage{upquote} \usepackage{color} +\usepackage[usenames,dvipsnames]{xcolor} %%% URLs %%% \urldef{\dotnetcrypto}\url{http://msdn.microsoft.com/en-us/library/System.Security.Cryptography%28v=vs.110%29.aspx} @@ -31,13 +32,13 @@ mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit xleftmargin=\parindent, aboveskip=\bigskipamount, tabsize=4, - morecomment=[l][\color{greencomments}]{///}, - morecomment=[l][\color{greencomments}]{//}, - morecomment=[s][\color{greencomments}]{{(*}{*)}}, + morecomment=[l][\color{OliveGreen}]{///}, + morecomment=[l][\color{OliveGreen}]{//}, + morecomment=[s][\color{OliveGreen}]{{(*}{*)}}, morestring=[b]", showstringspaces=false, literate={`}{\`}1, - stringstyle=\color{redstrings}, + stringstyle=\color{red}, } \begin{document} @@ -67,7 +68,7 @@ Le but de ce laboratoire est de définir les algorithmes cryptographique et leur \subsection{Comment s'assure-t-on que les données sont stockées de manière confidentielle ? En particulier ce qui concerne les méta-données} -Les méta-données ainsi que les données sont chiffrées ensemble. Voir le format du container décrit ci après. +Les méta-données ainsi que les données sont chiffrées ensemble. Voir le format du container décrit ci-après. \subsection{Comment s'assure-t-on que les données stockées sont authentiques ? Quels sont les risques à prendre en compte ?} @@ -123,18 +124,20 @@ container = header, ciphertext ; header = mac[256], signature[2048], keys[2048] ; ciphertext = AES(plaintext) ; plaintext = meta-data, file-content ; -meta-data = meta-data-size[int32], { key-value-pair } ; +meta-data = nb-meta-data[byte], { key-value-pair } ; key-value-pair = key[string], value[string] ; string = size[vint], content-utf8 ; \end{lstlisting} -\texttt{meta-data-size} permet de connaître la taille des méta-données afin de les déchiffrer au préalable du contenu du fichier. +\texttt{nb-meta-data} est le nombre de pair clef-valeur des méta-données. \texttt{keys} correspond aux clefs $k_c$ et $k_a$ ainsi qu'a l'\emph{IV} le tout chiffré avec \emph{RSA-2048}. La taille des données chiffrées est égale à $k_c + k_a + iv = 256 + 256 + 128 = 640\,bits$. Les méta-données (\texttt{meta-data}) peuvent contenir, par exemple, le nom du fichier, sa date de création, ses droits, ou tout autres données associées. -Le type \texttt{vint} correspond à un entier de taille variable, initialement occupant un octets. +Le type \texttt{vint} correspond à un entier de taille variable, initialement occupant un octet. + +Comme les clefs (\emph{AES} et \emph{HMAC-SHA256}) sont différentes à chaque chiffrement, que le \emph{MAC} dépend de sa clef et des données chiffrées et que la signature dépend du \emph{MAC} alors l'ensemble des octets des différentes parties du fichier résultat va être fortement différent d'un chiffrement à l'autre pour le même fichier en entrée. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -204,7 +207,7 @@ Deux \emph{assemblies} sont crées : \subsection{Utilisation} -Il est possible de compiler la solution à l'aide de \emph{MonoDevelop}\footnote{\monodevelop}. Le script \emph{Bash} \texttt{labo2-fsharp/run\_tests.sh} permet de compiler la solution puis d'exécuter un certain nombre de tests. +Il est possible de compiler la solution à l'aide de \emph{MonoDevelop}\footnote{\monodevelop} ou de \emph{Visual Studio 2012}. Le script \emph{Bash} \texttt{labo2-fsharp/run\_tests.sh} permet de compiler la solution puis d'exécuter un certain nombre de tests. À partir du dossier \texttt{labo2-fsharp} et après avoir compiler en \emph{release} la solution, voici ce qu'il est possible d'effectuer : @@ -219,19 +222,26 @@ Les clefs publiques et privées pour le chiffrement ainsi que pour la réalisati \subsection{Organisation du code} -La \emph{ĺibrary} \emph{CryptoFile} est composé de trois fichiers : +La \emph{ĺibrary} \emph{CryptoFile} est composée de trois fichiers : \begin{itemize} \item \emph{Types.fs} : Quelques types publics. - \item \emph{Crypto.fs} : Contient toutes les primitives cryptographique nécessaire. - \item \emph{UnitTests.fs} : Contient quelques tests unitaires du module \emph{Crypto}. - \item \emph{API.fs} : Contient l'interface publique de la \emph{library}. Elle est détaillée ci après. + \item \emph{Crypto.fs} : Toutes les primitives cryptographique nécessaire. + \item \emph{UnitTests.fs} : Quelques tests unitaires du module \emph{Crypto}. + \item \emph{API.fs} : L'interface publique de la \emph{library}. Elle est détaillée ci-après. \end{itemize} \subsubsection{API} +Voici la partie publique de la \emph{library} \emph{CryptoFile}. + +\begin{minipage}{\linewidth} % Pour éviter que le listing soit séparé sur deux pages. \begin{lstlisting}[language=FSharp, frame=single, basicstyle=\ttfamily\footnotesize] module API = + (* Generate a key pair (public * private) + for using in the next two functions. + You have the reponsability to keep + the private part secret *) let generatKeysPair : Key * Key let encryptFile (inputFilePath : string) @@ -244,23 +254,40 @@ module API = (signaturePubKey: Key) (decryptPrivKey : Key) \end{lstlisting} +\end{minipage} + +\subsection{Mesures de performance} +Quelques mesures sur un fichier de 871 MiB. Sous \emph{Linux} avec \emph{Mono} 3.10.0. Des résultats similaires ont été obtenus sous \emph{Windows 8} avec \emph{Visual Studio 2012}. -17 Mo de mémoire et 19 s pour chiffrer un fichier de 404 Mo +Chiffrement : +\begin{itemize} + \item Temps : 42 s. + \item Mémoire utilisée : 15 MiB. + \item Taux \emph{CPU} : un cœur à 100 \% +\end{itemize} + +Déchiffrement : + +\begin{itemize} + \item Temps : 55 s. + \item Mémoire utilisée : 20 MiB. + \item Taux \emph{CPU} : un cœur à 100 \% +\end{itemize} \section{Analyse de la sécurité de l'implémentation} \subsection{Quelles sont les parties critiques du code et comment s'assure-t-on que ces parties soit correctement implémentées ?} -La génération des clefs \emph{AES} doit être faite avec un générateur cryptographique. Dans notre cas nous utilisons \emph{System.Security.Cryptography.RSACryptoServiceProvider}\footnote{\rsacryptoserviceprovider}. +La génération des clefs \emph{AES} doit être faite avec un générateur cryptographique. Dans notre cas nous utilisons \emph{RSACryptoServiceProvider}\footnote{\rsacryptoserviceprovider}. La mémoire correspondant aux clefs générées devrait être effacé, dans notre cas si un attaquant a accès à la mémoire de notre programme alors il a accès au contenu des fichiers à chiffrer, il n'y a donc pas de précautions prise en particulier à ce sujet. -\subsection{Quels sont les points-faibles restants et quelles sont les possibilités de les corriger ?} +\subsection{Quels sont les points faibles restants et quelles sont les possibilités de les corriger ?} Les deux clefs privées \emph{RSA} doivent absolument rester secrètes, pour ce faire il faudrait chiffrer les fichiers contenant ces clefs à l'aide d'une \emph{passphrase} robuste et garder celle-ci en sécurité. @@ -268,10 +295,9 @@ Les deux clefs privées \emph{RSA} doivent absolument rester secrètes, pour ce %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Conclusion} -% http://stephenhaunts.com/2013/03/04/cryptography-in-net-advanced-encryption-standard-aes/ -% http://stephenhaunts.com/2013/03/26/cryptography-in-net-rsa/ -% http://en.wikipedia.org/wiki/Digital_signature -%\bibliographystyle{plain} -%\bibliography{main} + + +\bibliographystyle{plain} +\bibliography{main} \end{document}