Report almost done.
[crypto_lab2.git] / rapport / main.tex
index 526fcc9..1c25220 100644 (file)
 \usepackage{upquote} 
 \usepackage{color}
 
+%%% 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/}
+
 \title{ICR - Labo \#2 : \textit{Conception et implémentation d'un container sécurisé pour des données médicales}}
 \author{G.Burri}
 
@@ -45,12 +49,66 @@ mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Introduction}
 
+Le but de ce laboratoire est de définir les algorithmes cryptographique et leurs paramètres afin de sécuriser des données médicales. Une donnée médicale est représentée par un fichier qui devra être sécurisé au sein d'un container dont le format sera définit par nos soins. Une implémentation sera ensuite proposée.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Niveaux de sécurité}
+
+\subsection{Quel est le niveau de sécurité que l'on souhaite atteindre ?}
+
+\begin{itemize}
+   \item Confidentialité : les données chiffrées ne doivent pas pouvoir être décryptées par un attaquant.
+   \item Authenticité : un attaquant ne doit pas pouvoir forger un container, une signature est réalisée à l'aide d'une paire de clef \emph{RSA} publique-privée.
+   \item Intégrité : il ne faut pas que les données chiffrées aient pu être altérées par un attaquant.
+\end{itemize}
+
+
+\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.
+
+
+\subsection{Comment s'assure-t-on que les données stockées sont authentiques ? Quels sont les risques à prendre en compte ?}
+
+L'empreinte des données est signée à l'aide d'une clef privée donnée en paramètre de l'\emph{API}, ceci représente la signature qui est placée dans le container. Lors du déchiffrement, la clef publique correspondante est fournie puis utilisée pour déchiffrer l'empreinte qui est comparée à l'empreinte des données.
+
+
+\subsection{Comment s'assure-t-on que les données stockées sont intègres ?}
+
+Cela est réalisé avec un \emph{MAC}, dans notre cas nous utilisons \emph{HMAC-SHA256} sur l'ensemble des données chiffrées (\emph{Encrypt-then-MAC}).
+
+
+\subsection{Quels sont les clefs cryptographiques requises qu'il est nécessaire de gérer ?}
+
+\subsubsection{Clefs externes}
+
+Concerne les clefs externes à l'\emph{API}.
+
+\begin{itemize}
+   \item Une paire de clefs \emph{RSA-2048} pour la signature.
+   \item Une paire de clefs \emph{RSA-2048} pour le chiffrement des clefs \emph{AES}.
+\end{itemize}
+
+
+\subsubsection{Clefs internes}
+
+Concerne les clefs gérées à l'intérieur du container.
+
+\begin{itemize}
+   \item Une clef de 256 bits pour \emph{AES}.
+   \item Une clef de 256 bits pour \emph{HMAC}.
+\end{itemize}
+
+Ces clefs sont générées aléatoirement à chaque création d'un container.
+
+
 \section{Choix des algorithmes et des paramètres}
 
 \begin{itemize}
-   \item \emph{RSA-2048} pour la signature ainsi que pour le chiffrage des clefs \emph{AES} et \emph{HMAC}. Le padding \emph{PKCS\#1 v1.5}  est utilisé ;
+   \item \emph{RSA-2048} pour la signature ainsi que pour le chiffrage des clefs \emph{AES} et \emph{HMAC}. Le bourrage \emph{PKCS\#1 v1.5} est utilisé ;
    \item \emph{HMAC-SHA256} pour la vérification de l'intégrité ;
-   \item \emph{AES-CBC256} pour le chiffrement symétrique du contenu du fichier et des méta-données associées. Le padding \emph{PKCS7} est utilisé.
+   \item \emph{AES-CBC256} pour le chiffrement symétrique du contenu du fichier et des méta-données associées. Le bourrage \emph{PKCS7} est utilisé.
 \end{itemize}
 
 
@@ -66,7 +124,7 @@ ciphertext = AES(plaintext) ;
 plaintext = meta-data, file-content ;
 meta-data = meta-data-size[int32], { key-value-pair } ;
 key-value-pair = key[string], value[string] ;
-string = size[8], content-utf8 ;
+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.
@@ -75,6 +133,8 @@ string = size[8], content-utf8 ;
 
 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.
+
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{processus}
@@ -84,10 +144,9 @@ Les méta-données (\texttt{meta-data}) peuvent contenir, par exemple, le nom du
 Entrées :
 
 \begin{itemize}
-   \item $f$ : contenu du fichier
-   \item $metas$ : métas données associées au fichier
+   \item $f$ : fichier
    \item $k_{pub}$ : clef publique RSA
-   \item $k_{signpriv}$ : clef privé de signature DSA
+   \item $k_{signpriv}$ : clef privé de signature RSA
 \end{itemize}
 
 
@@ -108,66 +167,98 @@ Processus :
 Où $+$ dénote la concaténation.
 
 
-
 \subsection{déchiffrement}
 
+Entrée :
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Implémentation}
+\begin{itemize}
+   \item $c$ : container chiffrées
+   \item $k_{priv}$ : clef privée RSA
+   \item $k_{signpub}$ : la clef publique de signature RSA
+\end{itemize}
 
-\subsection{Utilisation}
+Processus :
 
-\subsection{Organisation du code}
+\begin{enumerate}
+   \item Lecture de $mac$, calcul de $mac'$ sur $c$ comparaison des deux 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$).
+\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és.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Niveaux de sécurité}
+\section{Implémentation}
 
-\subsection{Quel est le niveau de sécurité que l'on souhaite atteindre ?}
+Nous utilisons ici la plate-forme \emph{.NET} ainsi que le langage \emph{F\#}. L'ensemble des éléments cryptographiques requis sont fournit par \emph{.NET}\footnote{\dotnetcrypto}.
+
+Deux \emph{assemblies} sont crées :
 
 \begin{itemize}
-   \item Confidentialité : les données chiffrées ne doivent pas pouvoir être décryptées par un attaquant.
-   \item Authentification : un attaquant ne doit pas pouvoir forger un container, une signature est réalisée à l'aide d'une paire de clef publique-privée.
-   \item Intégrité : il ne faut pas que les données chiffrées aient pu être altérées par un attaquant.
+   \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.
 \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éé.
 
-\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}
+À partir du dossier \texttt{labo2-fsharp} et après avoir compiler en \emph{release} la solution, voici ce qu'il est possible d'effectuer :
 
-Les méta-données ainsi que les données sont chiffrées ensemble. Voir le format du container décrit précédemment.
+\begin{itemize}
+   \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe tests} : Réalise un 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}
 
+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{Comment s'assure-t-on que les données stockées sont authentiques ? Quels sont les risques à prendre en compte ?}
 
-L'empreinte des données est signée à l'aide d'une clef privée donnée en paramètre de l'\emph{API}, ceci représente la signature qui est placée dans le container. Lors du déchiffrement, la clef publique correspondante est donnée puis utilisée pour déchiffrer l'empreinte qui est comparée à l'empreinte des données.
+\subsection{Organisation du code}
 
+La \emph{ĺibrary} \emph{CryptoFile} est composé de trois fichiers :
 
-\subsection{Comment s'assure-t-on que les données stockées sont intègres ?}
+\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.
+\end{itemize}
 
-Cela est réalisé avec un \emph{MAC}, dans notre nous utilisons \emph{HMAC-SHA256} sur les données chiffrées (\emph{Encrypt-then-MAC}).
+\subsubsection{API}
+
+\begin{lstlisting}[language=FSharp, frame=single, basicstyle=\ttfamily\footnotesize]
+module API =
+    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}
 
 
-\subsection{Quels sont les clefs cryptographiques requises qu'il est nécessaire de gérer ?}
 
-\subsubsection{Clefs externes}
+17 Mo de mémoire et 19 s pour chiffrer un fichier de 404 Mo
 
-Concerne les clefs externes à l'\emph{API}.
 
-\begin{itemize}
-   \item Une paire de clefs \emph{RSA-2048} pour la signature.
-   \item Une paire de clefs \emph{RSA-2048} pour le chiffrement des clefs \emph{AES}.
-\end{itemize}
 
+\section{Analyse de la sécurité de l'implémentation}
 
+\subsection{Quelles sont les parties critiques du code ?}
 
-\subsubsection{Clefs internes}
+\subsection{Comment s'est-on assuré que ces parties soient correctement implémentées ?}
 
-Concerne les clefs gérer à l'intérieur du container.
+\subsection{Quels sont les points-faibles restants ?}
 
-\begin{itemize}
-   \item Une clef de 256 bits pour \emph{AES}.
-   \item Une clef de 256 bits pour \emph{HMAC}.
-\end{itemize}
+\subsection{Quels sont les possibilités pour corriger ces points faibles ?}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%