\documentclass[a4paper,10pt]{article}

\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{graphicx}
\usepackage{listings}
\usepackage{url}
\usepackage{upquote} 
\usepackage{color}

\title{ICR - Labo \#2 : \textit{Conception et implémentation d'un container sécurisé pour des données médicales}}
\author{G.Burri}

\lstdefinelanguage{FSharp}%
{morekeywords={let, new, match, with, rec, open, module, namespace, type, of, member, % 
and, for, while, true, false, in, do, begin, end, fun, function, return, yield, try, %
mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit, finally },
  otherkeywords={ let!, return!, do!, yield!, use!, var, from, select, where, order, by },
  keywordstyle=\color{blue}\bfseries,
  sensitive=true,
  basicstyle=\ttfamily,
        breaklines=true,
  xleftmargin=\parindent,
  aboveskip=\bigskipamount,
        tabsize=4,
  morecomment=[l][\color{greencomments}]{///},
  morecomment=[l][\color{greencomments}]{//},
  morecomment=[s][\color{greencomments}]{{(*}{*)}},
  morestring=[b]",
  showstringspaces=false,
  literate={`}{\`}1,
  stringstyle=\color{redstrings},
}

\begin{document}

\nocite{*}

\maketitle


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}

\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{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é.
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{format du container}

Le format est définit comme suit en \emph{EBNF}. Les valeurs entre crochets correspondent soit à une taille en bits soit à un type.

\begin{lstlisting}[frame=single, breaklines, basicstyle=\ttfamily\footnotesize]
container = header, ciphertext ;
header = mac[256], signature[2048], keys[2048] ;
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[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{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.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{processus}

\subsection{chiffrement}

Entrées :

\begin{itemize}
   \item $f$ : fichier
   \item $k_{pub}$ : clef publique RSA
   \item $k_{signpriv}$ : clef privé de signature RSA
\end{itemize}


Processus :

\begin{enumerate}
   \item Génération d'une clef 256 bits pour \emph{AES} $\rightarrow  k_c$.
   \item Génération d'une clef 256 bits pour \emph{MAC} $\rightarrow k_a$.
   \item Génération d'un \emph{IV} 128 bits pour le mode \emph{CBC} $\rightarrow iv$.
   \item Construction du $plaintext$, voir format ci dessus.
   \item Chiffrement du $plaintext$ avec \emph{AES-CBC256}, $k_c$ et $iv \rightarrow ciphertext$.
   \item Calcul de MAC de $ciphertext$ $\rightarrow mac$.
   \item Signature de $mac$ avec $k_{signpriv}$ $\rightarrow sig$.
   \item Chiffrement de $k_c + k_a + iv$ avec $k_pub \rightarrow keys$.
   \item Renvoie $mac + sig + keys + ciphertext$.
\end{enumerate}

Où $+$ dénote la concaténation.


\subsection{déchiffrement}

Entrée :

\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}

Processus :

\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{Implémentation}

\subsection{Utilisation}

\subsection{Organisation du code}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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 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.
\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 précédemment.


\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{Comment s'assure-t-on que les données stockées sont intègres ?}

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}).


\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érer à 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}


17 Mo de mémoire et 19 s pour chiffrer un fichier de 404 Mo


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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}

\end{document}
