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