Replace AESManager by AesCryptoServiceProvider.
authorUmmon <greg.burri@gmail.com>
Sat, 29 Nov 2014 22:00:46 +0000 (23:00 +0100)
committerUmmon <greg.burri@gmail.com>
Sat, 29 Nov 2014 22:00:46 +0000 (23:00 +0100)
labo2-fsharp/CryptoFile/API.fs
labo2-fsharp/CryptoFile/Crypto.fs
labo2-fsharp/CryptoFile/CryptoFile.fsproj
labo2-fsharp/labo2-fsharp.userprefs
rapport/main.tex

index 80f3a3d..424959d 100644 (file)
@@ -36,7 +36,7 @@ module API =
         let keyAES, keyMAC, iv = Crypto.rand 32, Crypto.rand 32, Crypto.rand 16
         let fileInfo = new FileInfo (inputFilePath)
         use inputStream = fileInfo.OpenRead ()
-        use outputStream = new FileStream (outputFilePath, FileMode.Create, FileAccess.Write)
+        use outputStream = new FileStream (outputFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, 4096 * 100)
         let writer = new BinaryWriter (outputStream)
 
         outputStream.Position <- 32L + 256L // Skips mac and signature. They will be written later.
index 24cebd0..560cd13 100644 (file)
@@ -62,7 +62,7 @@ module internal Crypto =
     /// Returns an encrypted output stream.
     let encryptAES (key: byte[]) (iv: byte[]) (outputStream: Stream) : CryptoStream =
         assert (key.Length = 32 && iv.Length = 16)
-        use aes = new AesManaged ()
+        use aes = new AesCryptoServiceProvider () // Default mode is CBC.
         aes.KeySize <- 256
         let encryptor = aes.CreateEncryptor (key, iv)
         new CryptoStream (outputStream, encryptor, CryptoStreamMode.Write)
@@ -70,7 +70,7 @@ module internal Crypto =
     /// Returns a decrypted input stream.
     let decryptAES (key: byte[]) (iv: byte[]) (inputStream: Stream) : CryptoStream =
         assert (key.Length = 32 && iv.Length = 16)
-        use aes = new AesManaged ()
+        use aes = new AesCryptoServiceProvider ()
         aes.KeySize <- 256
         let decryptor = aes.CreateDecryptor (key, iv)
         new CryptoStream (inputStream, decryptor, CryptoStreamMode.Read)
index cf20e54..28cc1fe 100644 (file)
@@ -44,8 +44,8 @@
     <Compile Include="AssemblyInfo.fs" />\r
     <Compile Include="Types.fs" />\r
     <Compile Include="Crypto.fs" />\r
-    <Compile Include="API.fs" />\r
     <Compile Include="UnitTests.fs" />\r
+    <Compile Include="API.fs" />\r
   </ItemGroup>\r
   <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" />\r
 </Project>
\ No newline at end of file
index 40ddddc..69b756f 100644 (file)
@@ -1,27 +1,16 @@
 <Properties>
-  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
-  <MonoDevelop.Ide.Workbench ActiveDocument="CryptoFileTests/Tests.fs">
+  <MonoDevelop.Ide.Workspace ActiveConfiguration="Release|x86" />
+  <MonoDevelop.Ide.Workbench ActiveDocument="CryptoFile/Crypto.fs">
     <Files>
-      <File FileName="CryptoFile/UnitTests.fs" Line="9" Column="9" />
-      <File FileName="CryptoFile/Crypto.fs" Line="1" Column="1" />
+      <File FileName="CryptoFile/UnitTests.fs" Line="1" Column="1" />
+      <File FileName="CryptoFile/Crypto.fs" Line="47" Column="47" />
       <File FileName="CryptoFile/Types.fs" Line="1" Column="1" />
       <File FileName="run_tests.sh" Line="1" Column="1" />
-      <File FileName="CryptoFileTests/Program.fs" Line="17" Column="17" />
-      <File FileName="CryptoFile/API.fs" Line="17" Column="17" />
+      <File FileName="CryptoFileTests/Program.fs" Line="1" Column="1" />
+      <File FileName="CryptoFile/API.fs" Line="37" Column="37" />
       <File FileName="CryptoFileTests/AssemblyInfo.fs" Line="1" Column="1" />
-      <File FileName="CryptoFileTests/Tests.fs" Line="21" Column="21" />
+      <File FileName="CryptoFileTests/Tests.fs" Line="9" Column="9" />
     </Files>
-    <Pads>
-      <Pad Id="ProjectPad">
-        <State expanded="True">
-          <Node name="CryptoFile" expanded="True" />
-          <Node name="CryptoFileTests" expanded="True">
-            <Node name="References" expanded="True" />
-            <Node name="Tests.fs" selected="True" />
-          </Node>
-        </State>
-      </Pad>
-    </Pads>
   </MonoDevelop.Ide.Workbench>
   <MonoDevelop.Ide.DebuggingService.Breakpoints>
     <BreakpointStore />
index 7a603ce..bf0f64f 100644 (file)
@@ -51,7 +51,7 @@ 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.
+Le but de ce laboratoire est de définir les algorithmes cryptographiques 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éfini par nos soins. Une implémentation sera ensuite proposée.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -61,19 +61,19 @@ Le but de ce laboratoire est de définir les algorithmes cryptographique et leur
 
 \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 Authenticité : un attaquant ne doit pas pouvoir forger un container. Une signature est réalisée à l'aide d'une paire de clefs \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}
+\subsection{Comment s'assure-t-on que les données sont stockées de manière confidentielle ? En particulier en 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.
+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 ?}
@@ -115,9 +115,9 @@ Ces clefs sont générées aléatoirement à chaque création d'un container.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{format du container}
+\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.
+Le format est défini 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 ;
@@ -129,11 +129,11 @@ key-value-pair = key[string], value[string] ;
 string = size[vint], content-utf8 ;
 \end{lstlisting}
 
-\texttt{nb-meta-data} est le nombre de pair clef-valeur des méta-données.
+\texttt{nb-meta-data} est le nombre de paires 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$.
+\texttt{keys} correspond aux clefs $k_c$ et $k_a$ ainsi qu'à 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.
+Les méta-données (\texttt{meta-data}) peuvent contenir, par exemple, le nom du fichier, sa date de création, ses droits, ou toutes autres données associées.
 
 Le type \texttt{vint} correspond à un entier de taille variable, initialement occupant un octet.
 
@@ -141,16 +141,16 @@ Comme les clefs (\emph{AES} et \emph{HMAC-SHA256}) sont différentes à chaque c
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{processus}
+\section{Processus}
 
-\subsection{chiffrement}
+\subsection{Chiffrement}
 
 Entrées :
 
 \begin{itemize}
    \item $f$ : fichier
    \item $k_{pub}$ : clef publique RSA
-   \item $k_{signpriv}$ : clef privé de signature RSA
+   \item $k_{signpriv}$ : clef privée de signature RSA
 \end{itemize}
 
 
@@ -171,12 +171,12 @@ Processus :
 Où $+$ dénote la concaténation.
 
 
-\subsection{déchiffrement}
+\subsection{Déchiffrement}
 
 Entrée :
 
 \begin{itemize}
-   \item $c$ : container chiffrées
+   \item $c$ : container chiffrés
    \item $k_{priv}$ : clef privée RSA
    \item $k_{signpub}$ : la clef publique de signature RSA
 \end{itemize}
@@ -190,15 +190,15 @@ Processus :
    \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.
+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ées.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{Implémentation}
 
-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}.
+Nous utilisons ici la plate-forme \emph{.NET} ainsi que le langage \emph{F\#}. L'ensemble des éléments cryptographiques requis sont fournis par \emph{.NET}\footnote{\dotnetcrypto}.
 
-Deux \emph{assemblies} sont crées :
+Deux \emph{assemblies} sont créées :
 
 \begin{itemize}
    \item \emph{CryptoFile} : \emph{Library} mettant à disposition l'\emph{API} de chiffrement de fichier et de déchiffrement de container.
@@ -213,7 +213,7 @@ Il est possible de compiler la solution à l'aide de \emph{MonoDevelop}\footnote
 
 \begin{itemize}
    \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 encrypt <file> <container>} : Chiffre le fichier \texttt{<file>} vers 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}
 
@@ -226,7 +226,7 @@ La \emph{ĺibrary} \emph{CryptoFile} est composée de trois fichiers :
 
 \begin{itemize}
    \item \emph{Types.fs} : Quelques types publics.
-   \item \emph{Crypto.fs} : Toutes les primitives cryptographique nécessaire.
+   \item \emph{Crypto.fs} : Toutes les primitives cryptographiques nécessaires.
    \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}
@@ -238,10 +238,10 @@ 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 *)
+    (* Generates a pair of keys (public * private)
+       to be used in the following two functions. 
+       You have the reponsability of keeping
+       the private part secret. *)
     let generatKeysPair : Key * Key
     
     let encryptFile (inputFilePath : string)
@@ -265,7 +265,7 @@ Chiffrement :
 
 \begin{itemize}
    \item Temps : 42 s.
-   \item Mémoire utilisée : 15 MiB.
+   \item Mémoire utilisée : 8.9 MiB.
    \item Taux \emph{CPU} : un cœur à 100 \%
 \end{itemize}
 
@@ -273,28 +273,30 @@ Déchiffrement :
 
 \begin{itemize}
    \item Temps : 55 s.
-   \item Mémoire utilisée : 20 MiB.
+   \item Mémoire utilisée : 14.3 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 et comment s'assure-t-on que ces parties soit correctement implémentées ?}
+\subsection{Quelles sont les parties critiques du code et comment s'assure-t-on que ces parties soient 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}.
 
-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.
+La mémoire correspondant aux clefs générées devrait être effacée. 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 prises en particulier à ce sujet.
 
 
 \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é.
+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}
 
+[TODO]
+
 
 
 \bibliographystyle{plain}