\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}
\urldef{\monodevelop}\url{http://www.monodevelop.com/}
+\urldef{\rsacryptoserviceprovider}\url{http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider%28v=vs.110%29.aspx}
\title{ICR - Labo \#2 : \textit{Conception et implémentation d'un container sécurisé pour des données médicales}}
\author{G.Burri}
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}
\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 ?}
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.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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.
+ \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}. Le script \emph{Bash} \texttt{labo2-fsharp/run\_tests.sh} montre un exemple de compilation à la ligne de commande, puis de chiffrement d'un fichier suivit du déchiffrement du container ainsi créé.
+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 un série de tests.
+ \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>} ver 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}
\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{Tests.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)
(signaturePubKey: Key)
(decryptPrivKey : Key)
\end{lstlisting}
+\end{minipage}
+\subsection{Mesures de performance}
-17 Mo de mémoire et 19 s pour chiffrer un fichier de 404 Mo
+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}.
+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 ?}
+\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{RSACryptoServiceProvider}\footnote{\rsacryptoserviceprovider}.
-\subsection{Comment s'est-on assuré que ces parties soient correctement implémentées ?}
+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 ?}
-\subsection{Quels sont les possibilités pour corriger ces points faibles ?}
+\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é.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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}