+
+\subsection{Déchiffrement}
+
+Entrée :
+
+\begin{itemize}
+ \item $c$ : container chiffrés
+ \item $k_{priv}$ : clef privée RSA
+ \item $k_{signpub}$ : la clef publique de signature RSA
+\end{itemize}
+
+Sortie :
+
+\begin{itemize}
+ \item $f$ : fichier original
+\end{itemize}
+
+
+Processus :
+
+\begin{enumerate}
+ \item Lecture de $mac$, calcul de $mac'$ sur $c$, comparaison des deux valeurs afin de vérifier l'intégrité.
+ \item Vérification de la signature avec $k_{signpub}$.
+ \item Déchiffrement de $k_c + k_a + iv$ avec $k_{priv}$.
+ \item Déchiffrement du reste des données ($ciphertext$) $\rightarrow f$.
+\end{enumerate}
+
+Ce processus nécessite deux cycles de lecture des données, le premier pour le calcul de $mac'$ et le deuxième pour le déchiffrement. Le deuxième cycle n'est effectué que si l'intégrité et l'authenticité ont été validées.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Implémentation}
+
+Nous utilisons ici la plate-forme \emph{.NET} ainsi que le langage \emph{F\#}, un dialecte de \emph{ML}\footnote{\wikiml}. L'ensemble des éléments cryptographiques requis sont fournis par \emph{.NET} \footnote{\dotnetcrypto}.
+
+Deux \emph{assemblies} sont créées :
+
+\begin{itemize}
+ \item \emph{CryptoFile} : \emph{Library} mettant à disposition l'\emph{API} de chiffrement de fichier et de déchiffrement de container.
+ \item \emph{CryptoFileTests} : Exécutable utilisant la \emph{library} \emph{CryptoFile} et permettant d'utiliser l'\emph{API} à l'aide d'arguments fournis par la ligne de commande.
+\end{itemize}
+
+\subsection{Utilisation}
+
+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 :
+
+\begin{itemize}
+ \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe tests} : Réalise une série de tests.
+ \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe encrypt <file> <container>} : Chiffre le fichier \texttt{<file>} vers le container \texttt{<container>}.
+ \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe decrypt <container> <output directory>} : Déchiffre le container \texttt{<container>} dans le dossier \texttt{<output directory>}.
+\end{itemize}
+
+Les clefs publiques et privées pour le chiffrement ainsi que pour la réalisation de la signature se trouvent dans les fichiers \texttt{keys-crypt.priv}, \texttt{keys-crypt.pub}, \texttt{keys-sign.priv} et \texttt{keys-sign.pub}. Ceux-ci sont automatiquement générés dans le cas où ils sont introuvables.
+
+
+\subsection{Organisation du code}
+
+La \emph{ĺibrary} \emph{CryptoFile} est composée de trois fichiers :
+
+\begin{itemize}
+ \item \emph{Types.fs} : Quelques types publics.
+ \item \emph{Crypto.fs} : Toutes les primitives cryptographiques nécessaires.
+ \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 à la section~\ref{sec:api}.
+\end{itemize}
+
+\subsubsection{API}
+\label{sec: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 =
+ (* Generates a pair of keys (public * private)
+ to be used in the following two functions.
+ You have the reponsability of keeping
+ the private part secret. *)
+ let generatKeysPair : Key * Key
+
+ let encryptFile (inputFilePath : string)
+ (outputFilePath : string)
+ (signaturePrivKey: Key)
+ (cryptPubKey : Key)
+
+ let decryptFile (sourceFilePath : string)
+ (targetDirPath : string)
+ (signaturePubKey: Key)
+ (decryptPrivKey : Key)
+\end{lstlisting}
+\end{minipage}
+
+
+\subsection{Mesures de performance}
+
+Quelques mesures sur un fichier de 871 MiB ont été effectuées sous \emph{Linux} avec \emph{Mono} 3.10.0 ainsi que sous \emph{Windows 8.1} avec \emph{Visual Studio 2012}. Il est a noter que l'implémentation \emph{AES} de \emph{Mono} est en \emph{C\#} et n'utilise évidemment pas l’accélération matérielle d'\emph{Intel} présente sur la machine : \emph{AES-NI}.
+
+Les tests sous \emph{Windows 8} ont été fait sur une machine ne possédant pas \emph{AES-NI}. Cet ensemble d'instructions est normalement supporté par l’implémentation du \emph{runtime} \emph{.NET} de \emph{Microsoft}.
+
+\begin{tabular}{ l | r | r | r | r }
+ & \multicolumn{2}{c|}{Chiffrement} & \multicolumn{2}{|c}{Déchiffrement} \\
+ \cline{2-5}
+ & \multicolumn{1}{c}{\emph{Mono}} & \multicolumn{1}{|c|}{\emph{MS .NET}} & \multicolumn{1}{|c|}{\emph{Mono}} & \multicolumn{1}{c}{\emph{MS .NET}} \\
+ \cline{2-5}
+ Temps & 39 s & 20 s & 48 s & 20 s \\
+ Mémoire utilisée & 7.0 MiB & 14 MiB & 15.2 MiB & 13.9 MiB \\
+ Taux \emph{CPU} & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% \\
+\end{tabular}
+
+
+\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 soient correctement implémentées ?}
+
+Le choix des algorithmes, de leurs paramètres et de leur implémentation est une partie critique. Il est possible de se référer aux recommandations de certains organismes comme par exemple le \emph{NIST}\footnote{\emph{ National Institute of Standards and Technology}}.
+
+La génération des clefs \emph{AES} doit être faite avec un générateur cryptographique. Dans notre cas nous utilisons \emph{RNGCryptoServiceProvider}\footnote{\rngcryptoserviceprovider}.
+
+
+\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é.