let testRSA () =
let kpub, kpriv = generateRSAKeysPair
-
- let plaintext = "Hello, World!"
- printfn "plaintext: %A" plaintext
-
+ let plaintext = "Are you from the past?"
let cipherdata = encryptRSA kpub (Encoding.UTF8.GetBytes plaintext)
- printfn "cipherdata: (size: %A) %A" cipherdata.Length cipherdata
-
let decryptedData = decryptRSA kpriv cipherdata
let decryptedText = Encoding.UTF8.GetString decryptedData
- printfn "decryptedtext: %A" decryptedText
assert (plaintext = decryptedText)
printfn "testRSA OK"
let testRSASignature () =
let kpub, kpriv = generateRSAKeysPair
- let plaintext = "Hello, World!"
+ let plaintext = "Lightspeed is too slow. We'll have to go right to ludicrous speed!"
let sha256 = new SHA256Managed ()
let signature = signRSA kpriv (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext))
assert verifySignRSA kpub (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext)) signature
let testAES () =
let plaintext = "There is no place like 127.0.0.1"
- let output = new MemoryStream ()
- let sr = new StreamReader (output)
+ let memory = new MemoryStream ()
let key = Crypto.rand 32
let iv = Crypto.rand 16
- let input = encryptAES key iv output
+ let input = encryptAES key iv memory
let sw = new StreamWriter (input)
-
sw.Write plaintext
+ sw.Flush ()
+ input.FlushFinalBlock ()
+
+ memory.Position <- 0L
+ let output = decryptAES key iv memory
+ let sr = new StreamReader (output)
+
assert (sr.ReadToEnd () = plaintext)
+ printfn "testAES OK"
let runAllUnitTests () =
testRSA ()
- testRSASignature ()
\ No newline at end of file
+ testRSASignature ()
+ testAES ()
\ No newline at end of file
header = mac[256], signature[2048], keys[2048] ;
ciphertext = AES(plaintext) ;
plaintext = meta-data, file-content ;
-meta-data = meta-data-size[int32], { key-value-pair } ;
+meta-data = nb-meta-data[byte], { 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{nb-meta-data} est le nombre de pair 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$.
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.
+Le type \texttt{vint} correspond à un entier de taille variable, initialement occupant un octet.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{itemize}
\item \emph{Types.fs} : Quelques types publics.
- \item \emph{Crypto.fs} : Contient toutes les primitives cryptographique nécessaire.
- \item \emph{UnitTests.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.
+ \item \emph{Crypto.fs} : Toutes les primitives cryptographique nécessaire.
+ \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}
\subsubsection{API}
\end{lstlisting}
+\subsection{Mesures de performance}
-17 Mo de mémoire et 19 s pour chiffrer un fichier de 404 Mo
+Quelques mesures sur un fichier de 871 MiB.
+Chiffrement :
+
+\begin{itemize}
+ \item Temps : 42 s.
+ \item Mémoire utilisée : 15 MiB.
+ \item Taux \emph{CPU} : un cœur à 100 \%
+\end{itemize}
+
+Déchiffrement :
+
+\begin{itemize}
+ \item Temps : 55 s.
+ \item Mémoire utilisée : 20 MiB.
+ \item Taux \emph{CPU} : un cœur à 100 \%
+\end{itemize}
\section{Analyse de la sécurité de l'implémentation}