Sous Linux, nous avons la chance d’avoir plusieurs outils qui peuvent être utilisés pour crypter des fichiers. Nous allons voir comment le faire avec les outils suivants :
- OpenSSL, un outil installé à peu près partout, qui gère la plupart des protocoles et algorithmes d’encryption. SI OpenSSL est connu pour des PKI (infrastructures d’encryption à clés asymétriques publique/privée), il n’est pas conçu pour crypter de grosses quantités de données avec des clés asymétriques, mais il est très rapide lorsqu’il crypte avec une clé symétrique.
- GNU Privacy Guard (ou GnuPG, ou GPG), une implémentation open source très connue du standard OpenGPG. C’est un outil de très bon niveau, bien que lent.
- scrypt, une implémentation open source de la fonction de dérivation de clé du même nom. Il n’est pas encore très connu, mais il est très efficace.
Il y a un principe que je vais appliquer dans les trois cas : la passphrase (le mot de passe) d’encryption ne doit pas être écrite en clair sur la ligne de commande. Le faire serait une faille potentielle de sécurité, car n’importe qui ayant un accès à la machine pourrait voir cette passphrase en regardant la liste des processus en cours d’exécution.
Nous écrirons donc la passphrase dans un fichier, en nous assurant bien que ce fichier a des droits en lecture uniquement pour l’utilisateur courant, avec la commande chmod 600 passfile
OpenSSL
Pour installer OpenSSL sous Ubuntu, utilisez la commande suivante :
sudo apt install openssl
OpenSSL propose tout un éventail d’algorithmes. On va utiliser une clé symétrique de 256 bits en mode « Cipher Block Chaining » (CBC).
La commande pour crypter les données :
openssl enc -aes-256-cbc -e -salt -in clear -out crypted.openssl -pass file:passfile -pbkdf2 -iter 100000
Avec clear
le chemin vers le fichier à encrypter ; crypted.openssl
le chemin vers le fichier crypté ; passfile
le chemin vers le fichier qui contient la passphrase.
La commande pour décrypter les données :
openssl enc -aes-256-cbc -d -salt -in crypted.openssl -out clear -pass file:passfile -pbkdf2 -iter 100000
Le paramètre -iter définit le nombre d’itérations pour la dérivation de clé. Plus il est grand mieux c’est, mais plus le traitement prend du temps. Une valeur de cent mille ou un million est plutôt bonne.
GPG
Pour installer GPG sous Ubuntu, utilisez la commande suivante :
sudo apt install gnupg
La commande pour crypter les données avec GnuPG :
gpg --batch --yes --passphrase-file passfile --symmetric --output crypted.gpg clear
Avec clear
le chemin vers le fichier à encrypter ; crypted.gpg
le chemin vers le fichier crypté ; passfile
le chemin vers le fichier qui contient la passphrase.
La commande pour décrypter les données :
gpg --batch --yes --passphrase-file passfile --decrypt --output clear crypted.gpg
scrypt
Pour installer scrypt sous Ubuntu :
sudo apt install scrypt
La commande pour crypter les données avec scrypt :
scrypt enc --passphrase file:passfile clear crypted.scrypt
Avec clear
le chemin vers le fichier à encrypter ; crypted.scrypt
le chemin vers le fichier crypté ; passfile
le chemin vers le fichier qui contient la passphrase.
La commande pour décrypter les données :
scrypt dec --passphrase file:passfile crypted.scrypt clear
Benchmark
J’ai encrypté puis décrypté un fichier texte (un dump SQL) de 14 GO.
- GPG :
- encryption : 2 minutes 29 secondes en moyenne
- fichier crypté de 1,6 GO
- décryption : 2 minutes 3 secondes en moyenne
- OpenSSL :
- encryption : 22 secondes en moyenne
- fichier crypté de 14 GO
- décryption : 17 secondes en moyenne
- scrypt :
- encryption : 1 minute 16 secondes en moyenne
- fichier crypté de 14 GO
- décryption : 1 minute 38 secondes en moyenne
Ensuite, j’ai compressé le dump sql avec l’outil zstd, donnant un fichier de 852 MO.
- GPG :
- encryption : 21 secondes en moyenne
- fichier crypté de 852 MO
- décryption : 6,4 secondes en moyenne
- OpenSSL:
- encryption : 1,5 seconde en moyenne
- fichier crypté de 852 MO
- décryption : 1 seconde en moyenne
- scrypt :
- encryption : 4 secondes en moyenne
- fichier crypté de 852 MO
- décryption : 3 secondes en moyenne
Ensuite, j’ai concaténé plusieurs fois le fichier compressé de 852 MO, pour obtenir un fichier de 14 GO. Le but est de tester avec un fichier binaire qui ne soit pas du simple test (qui se compresse et s’encrypte plus facilement).
- GPG :
- encryption : 6 minutes et 42 secondes en moyenne
- fichier crypté de 14 GO
- décryption : 4 minutes en moyenne
- OpenSSL:
- encryption : 37 secondes en moyenne
- fichier crypté de 14 GO
- décryption : 38 secondes en moyenne
- scrypt :
- encryption : 49 secondes en moyenne
- fichier crypté de 14 GO
- décryption : 45 secondes en moyenne
Conclusion
On peut remarquer qu’en plus de crypter les fichiers, GPG compresse les fichiers textes de manière très efficace (ce que ne tentent même pas OpenSSL et scrypt). Mais qu’est-ce qu’il est lent !
Par contre, si votre but est de crypter des fichiers binaires − par exemple des fichiers que vous aurez compressé par avance − OpenSSL reste de loin le plus rapide, aussi bien en encryption qu’en décryption.