Improve the report.
[crypto_lab2.git] / rapport / main.tex
1 \documentclass[a4paper,10pt]{article}
2
3 \usepackage[francais]{babel}
4 \usepackage[utf8]{inputenc}
5 \usepackage[T1]{fontenc}
6 \usepackage{lmodern}
7
8 \usepackage{graphicx}
9 \usepackage{listings}
10 \usepackage{url}
11 \usepackage{upquote}
12 \usepackage{color}
13 \usepackage[usenames,dvipsnames]{xcolor}
14
15 %%% URLs %%%
16 \urldef{\dotnetcrypto}\url{http://msdn.microsoft.com/en-us/library/System.Security.Cryptography%28v=vs.110%29.aspx}
17 \urldef{\monodevelop}\url{http://www.monodevelop.com/}
18 \urldef{\rsacryptoserviceprovider}\url{http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider%28v=vs.110%29.aspx}
19
20 \title{ICR - Labo \#2 : \textit{Conception et implémentation d'un container sécurisé pour des données médicales}}
21 \author{G.Burri}
22
23 \lstdefinelanguage{FSharp}%
24 {morekeywords={let, new, match, with, rec, open, module, namespace, type, of, member, %
25 and, for, while, true, false, in, do, begin, end, fun, function, return, yield, try, %
26 mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit, finally },
27 otherkeywords={ let!, return!, do!, yield!, use!, var, from, select, where, order, by },
28 keywordstyle=\color{blue}\bfseries,
29 sensitive=true,
30 basicstyle=\ttfamily,
31 breaklines=true,
32 xleftmargin=\parindent,
33 aboveskip=\bigskipamount,
34 tabsize=4,
35 morecomment=[l][\color{OliveGreen}]{///},
36 morecomment=[l][\color{OliveGreen}]{//},
37 morecomment=[s][\color{OliveGreen}]{{(*}{*)}},
38 morestring=[b]",
39 showstringspaces=false,
40 literate={`}{\`}1,
41 stringstyle=\color{red},
42 }
43
44 \begin{document}
45
46 \nocite{*}
47
48 \maketitle
49
50
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 \section{Introduction}
53
54 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.
55
56
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 \section{Niveaux de sécurité}
59
60 \subsection{Quel est le niveau de sécurité que l'on souhaite atteindre ?}
61
62 \begin{itemize}
63 \item Confidentialité : les données chiffrées ne doivent pas pouvoir être décryptées par un attaquant.
64 \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.
65 \item Intégrité : il ne faut pas que les données chiffrées aient pu être altérées par un attaquant.
66 \end{itemize}
67
68
69 \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}
70
71 Les méta-données ainsi que les données sont chiffrées ensemble. Voir le format du container décrit ci-après.
72
73
74 \subsection{Comment s'assure-t-on que les données stockées sont authentiques ? Quels sont les risques à prendre en compte ?}
75
76 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.
77
78
79 \subsection{Comment s'assure-t-on que les données stockées sont intègres ?}
80
81 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}).
82
83
84 \subsection{Quels sont les clefs cryptographiques requises qu'il est nécessaire de gérer ?}
85
86 \subsubsection{Clefs externes}
87
88 Concerne les clefs externes à l'\emph{API}.
89
90 \begin{itemize}
91 \item Une paire de clefs \emph{RSA-2048} pour la signature.
92 \item Une paire de clefs \emph{RSA-2048} pour le chiffrement des clefs \emph{AES}.
93 \end{itemize}
94
95
96 \subsubsection{Clefs internes}
97
98 Concerne les clefs gérées à l'intérieur du container.
99
100 \begin{itemize}
101 \item Une clef de 256 bits pour \emph{AES}.
102 \item Une clef de 256 bits pour \emph{HMAC}.
103 \end{itemize}
104
105 Ces clefs sont générées aléatoirement à chaque création d'un container.
106
107
108 \section{Choix des algorithmes et des paramètres}
109
110 \begin{itemize}
111 \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é ;
112 \item \emph{HMAC-SHA256} pour la vérification de l'intégrité ;
113 \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é.
114 \end{itemize}
115
116
117 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118 \section{format du container}
119
120 Le format est définit comme suit en \emph{EBNF}. Les valeurs entre crochets correspondent soit à une taille en bits soit à un type.
121
122 \begin{lstlisting}[frame=single, breaklines, basicstyle=\ttfamily\footnotesize]
123 container = header, ciphertext ;
124 header = mac[256], signature[2048], keys[2048] ;
125 ciphertext = AES(plaintext) ;
126 plaintext = meta-data, file-content ;
127 meta-data = nb-meta-data[byte], { key-value-pair } ;
128 key-value-pair = key[string], value[string] ;
129 string = size[vint], content-utf8 ;
130 \end{lstlisting}
131
132 \texttt{nb-meta-data} est le nombre de pair clef-valeur des méta-données.
133
134 \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$.
135
136 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.
137
138 Le type \texttt{vint} correspond à un entier de taille variable, initialement occupant un octet.
139
140 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.
141
142
143 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
144 \section{processus}
145
146 \subsection{chiffrement}
147
148 Entrées :
149
150 \begin{itemize}
151 \item $f$ : fichier
152 \item $k_{pub}$ : clef publique RSA
153 \item $k_{signpriv}$ : clef privé de signature RSA
154 \end{itemize}
155
156
157 Processus :
158
159 \begin{enumerate}
160 \item Génération d'une clef 256 bits pour \emph{AES} $\rightarrow k_c$.
161 \item Génération d'une clef 256 bits pour \emph{MAC} $\rightarrow k_a$.
162 \item Génération d'un \emph{IV} 128 bits pour le mode \emph{CBC} $\rightarrow iv$.
163 \item Construction du $plaintext$, voir format ci dessus.
164 \item Chiffrement du $plaintext$ avec \emph{AES-CBC256}, $k_c$ et $iv \rightarrow ciphertext$.
165 \item Calcul de MAC de $ciphertext$ $\rightarrow mac$.
166 \item Signature de $mac$ avec $k_{signpriv}$ $\rightarrow sig$.
167 \item Chiffrement de $k_c + k_a + iv$ avec $k_pub \rightarrow keys$.
168 \item Renvoie $mac + sig + keys + ciphertext$.
169 \end{enumerate}
170
171 Où $+$ dénote la concaténation.
172
173
174 \subsection{déchiffrement}
175
176 Entrée :
177
178 \begin{itemize}
179 \item $c$ : container chiffrées
180 \item $k_{priv}$ : clef privée RSA
181 \item $k_{signpub}$ : la clef publique de signature RSA
182 \end{itemize}
183
184 Processus :
185
186 \begin{enumerate}
187 \item Lecture de $mac$, calcul de $mac'$ sur $c$ comparaison des deux afin de vérifier l'intégrité.
188 \item Vérification de la signature avec $k_{signpub}$.
189 \item Déchiffrement de $k_c + k_a + iv$ avec $k_{priv}$.
190 \item Déchiffrement du reste des données ($ciphertext$).
191 \end{enumerate}
192
193 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.
194
195
196 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
197 \section{Implémentation}
198
199 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}.
200
201 Deux \emph{assemblies} sont crées :
202
203 \begin{itemize}
204 \item \emph{CryptoFile} : \emph{Library} mettant à disposition l'\emph{API} de chiffrement de fichier et de déchiffrement de container.
205 \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.
206 \end{itemize}
207
208 \subsection{Utilisation}
209
210 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.
211
212 À partir du dossier \texttt{labo2-fsharp} et après avoir compiler en \emph{release} la solution, voici ce qu'il est possible d'effectuer :
213
214 \begin{itemize}
215 \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe tests} : Réalise une série de tests.
216 \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe encrypt <file> <container>} : Chiffre le fichier \texttt{<file>} ver le container \texttt{<container>}.
217 \item \texttt{CryptoFileTests/bin/Release/CryptoFileTests.exe decrypt <container> <output directory>} : Déchiffre le container \texttt{<container>} dans le dossier \texttt{<output directory>}.
218 \end{itemize}
219
220 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.
221
222
223 \subsection{Organisation du code}
224
225 La \emph{ĺibrary} \emph{CryptoFile} est composée de trois fichiers :
226
227 \begin{itemize}
228 \item \emph{Types.fs} : Quelques types publics.
229 \item \emph{Crypto.fs} : Toutes les primitives cryptographique nécessaire.
230 \item \emph{UnitTests.fs} : Quelques tests unitaires du module \emph{Crypto}.
231 \item \emph{API.fs} : L'interface publique de la \emph{library}. Elle est détaillée ci-après.
232 \end{itemize}
233
234 \subsubsection{API}
235
236 Voici la partie publique de la \emph{library} \emph{CryptoFile}.
237
238 \begin{minipage}{\linewidth} % Pour éviter que le listing soit séparé sur deux pages.
239 \begin{lstlisting}[language=FSharp, frame=single, basicstyle=\ttfamily\footnotesize]
240 module API =
241 (* Generate a key pair (public * private)
242 for using in the next two functions.
243 You have the reponsability to keep
244 the private part secret *)
245 let generatKeysPair : Key * Key
246
247 let encryptFile (inputFilePath : string)
248 (outputFilePath : string)
249 (signaturePrivKey: Key)
250 (cryptPubKey : Key)
251
252 let decryptFile (sourceFilePath : string)
253 (targetDirPath : string)
254 (signaturePubKey: Key)
255 (decryptPrivKey : Key)
256 \end{lstlisting}
257 \end{minipage}
258
259
260 \subsection{Mesures de performance}
261
262 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}.
263
264 Chiffrement :
265
266 \begin{itemize}
267 \item Temps : 42 s.
268 \item Mémoire utilisée : 15 MiB.
269 \item Taux \emph{CPU} : un cœur à 100 \%
270 \end{itemize}
271
272 Déchiffrement :
273
274 \begin{itemize}
275 \item Temps : 55 s.
276 \item Mémoire utilisée : 20 MiB.
277 \item Taux \emph{CPU} : un cœur à 100 \%
278 \end{itemize}
279
280
281 \section{Analyse de la sécurité de l'implémentation}
282
283 \subsection{Quelles sont les parties critiques du code et comment s'assure-t-on que ces parties soit correctement implémentées ?}
284
285 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}.
286
287 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.
288
289
290 \subsection{Quels sont les points faibles restants et quelles sont les possibilités de les corriger ?}
291
292 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é.
293
294
295 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
296 \section{Conclusion}
297
298
299
300 \bibliographystyle{plain}
301 \bibliography{main}
302
303 \end{document}