let rsaKeySize = 2048
let aesKeySize = 128
+ exception KeySizeError
+ exception IVSizeError
+
/// Returns a cryptographically strong sequence of bytes.
let rand size : byte[] =
let result = Array.zeroCreate size
/// Returns an encrypted output stream.
let encryptAES (key: byte[]) (iv: byte[]) (outputStream: Stream) : CryptoStream =
- assert (key.Length = aesKeySize / 8 && iv.Length = 16)
- use aes = new AesCryptoServiceProvider () // Default mode is CBC.
- aes.KeySize <- aesKeySize
+ if key.Length <> aesKeySize / 8 then raise KeySizeError
+ if iv.Length <> 16 then raise IVSizeError
+ use aes = new AesCryptoServiceProvider (KeySize = aesKeySize) // Default mode is CBC.
let encryptor = aes.CreateEncryptor (key, iv)
new CryptoStream (outputStream, encryptor, CryptoStreamMode.Write)
/// Returns a decrypted input stream.
let decryptAES (key: byte[]) (iv: byte[]) (inputStream: Stream) : CryptoStream =
- assert (key.Length = aesKeySize / 8 && iv.Length = 16)
- use aes = new AesCryptoServiceProvider ()
- aes.KeySize <- aesKeySize
+ if key.Length <> aesKeySize / 8 then raise KeySizeError
+ if iv.Length <> 16 then raise IVSizeError
+ use aes = new AesCryptoServiceProvider (KeySize = aesKeySize)
let decryptor = aes.CreateDecryptor (key, iv)
new CryptoStream (inputStream, decryptor, CryptoStreamMode.Read)
// Create a stream to compute the HMAC-SHA256 against all data being written.
let HMACStream (key: byte[]) (outputStream: Stream) : Stream * HMACSHA256 =
- assert (key.Length = 32)
+ if key.Length <> 32 then raise KeySizeError
let hmac = new HMACSHA256 (key)
new CryptoStream (outputStream, hmac, CryptoStreamMode.Write) :> Stream, hmac
let ComputeHMAC (key: byte[]) (inputStream: Stream) : byte[] =
- assert (key.Length = 32)
+ if key.Length <> 32 then raise KeySizeError
let hmac = new HMACSHA256 (key)
hmac.ComputeHash inputStream
\ No newline at end of file
D'après \cite{wiki-key-size}, la société \emph{RSA Security}\footnote{\rsasecurity} annonce qu'une taille de clefs \emph{RSA} de 2048 bits est suffisante jusqu'en 2030. Cela dépend également du niveau d'importance des documents que l'on souhaite chiffrer dans la mesure ou une attaque demande énormément de moyens.
-Toujours d'après \cite{wiki-key-size}, une taille de clef \emph{AES} de 128 bits reste actuellement hors de portée d'une attaque.
+Toujours d'après \cite{wiki-key-size}, une taille de clef \emph{AES} de 128 bits reste, actuellement, hors de portée de toutes attaques.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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'à l'\emph{IV}, le tout chiffré avec \emph{RSA-2048}. La taille des données chiffrées est égale à $k_c + k_a + iv = 128 + 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 = 128 + 256 + 128 = 512\,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 toutes autres données associées.
Quelques mesures sur un fichier de 871 MiB ont été effectuées sous \emph{Linux} avec \emph{Mono} 3.10.0 ainsi que sous \emph{Windows 8} avec \emph{Visual Studio 2012}. Il est a noter que l'implémentation \emph{AES} de \emph{Mono} est en \emph{C\#} et n'utilise évidemment pas l’accélération matérielle d'\emph{Intel} présente sur la machine : \emph{AES-NI}.
-Les tests sous \emph{Windows 8} ont été fait sur une machine ne possédant pas \emph{AES-NI}. Cette fonctionnalité est normalement utilisée par la version de \emph{Microsoft} du \emph{runtime} \emph{.NET}.
+Les tests sous \emph{Windows 8} ont été fait sur une machine ne possédant pas \emph{AES-NI}. Cette fonctionnalité est normalement utilisée par l’implémentation du \emph{runtime} \emph{.NET} de \emph{Microsoft} .
\begin{tabular}{ l | r | r | r | r }
& \multicolumn{2}{c|}{Chiffrement} & \multicolumn{2}{|c}{Déchiffrement} \\
\cline{2-5}
& \multicolumn{1}{c}{\emph{Mono}} & \multicolumn{1}{|c|}{\emph{MS .NET}} & \multicolumn{1}{|c|}{\emph{Mono}} & \multicolumn{1}{c}{\emph{MS .NET}} \\
\cline{2-5}
- Temps & 39 s & 21 s & 55 s & 22 s \\
- Mémoire utilisée & 7.0 MiB & 14 MiB & 14.3 MiB & 13.9 MiB \\
+ Temps & 39 s & 20 s & 48 s & 20 s \\
+ Mémoire utilisée & 7.0 MiB & 14 MiB & 15.2 MiB & 13.9 MiB \\
Taux \emph{CPU} & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% & 1 x 100 \% \\
\end{tabular}