Crypter un fichier sous Linux avec OpenSSL, GPG ou scrypt

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 opensslLangage du code : Bash (bash)

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 100000Langage du code : Bash (bash)

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 100000Langage du code : Bash (bash)

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 gnupgLangage du code : Bash (bash)

La commande pour crypter les données avec GnuPG :

gpg --batch --yes --passphrase-file passfile --symmetric --compress-algo none --output crypted.gpg clearLangage du code : Bash (bash)

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.gpgLangage du code : Bash (bash)

scrypt

Pour installer scrypt sous Ubuntu :

sudo apt install scryptLangage du code : Brainfuck (brainfuck)

La commande pour crypter les données avec scrypt :

scrypt enc --passphrase file:passfile clear crypted.scryptLangage du code : Bash (bash)

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 clearLangage du code : Bash (bash)

Benchmark

J’ai encrypté puis décrypté un fichier texte (un dump SQL) de 14 GO.

  • GPG :
    • encryption : 1 minutes 5 secondes en moyenne
    • décryption : 1 minute 19 secondes en moyenne
  • OpenSSL :
    • encryption : 23 secondes en moyenne
    • décryption : 18 secondes en moyenne
  • scrypt :
    • encryption : 1 minute 14 secondes en moyenne
    • décryption : 1 minute 32 secondes en moyenne

Ensuite, j’ai compressé le dump SQL avec l’outil zstd, puis j’ai concaténé plusieurs fois ce fichier pour obtenir un fichier binaire de 14 GO. Le but est de tester avec un fichier binaire qui ne soit pas du simple texte (qui s’encrypte potentiellement plus facilement).

  • GPG :
    • encryption : 1 minute et 19 secondes en moyenne
    • décryption : 55 secondes en moyenne
  • OpenSSL:
    • encryption : 34 secondes en moyenne
    • décryption : 39 secondes en moyenne
  • scrypt :
    • encryption : 49 secondes en moyenne
    • décryption : 46 secondes en moyenne

Conclusion

OpenSSL reste de loin le plus rapide, aussi bien en encryption qu’en décryption. Des experts vous diront que c’est normal, qu’il est conçu pour ça, et que l’encryption AES peut être accélérée matériellement. C’est bon à savoir.

5 commentaires pour “Crypter un fichier sous Linux avec OpenSSL, GPG ou scrypt

  1. @Nicolas Le Gland : Merci beaucoup, je vais regarder. Cette option ne semble pas exister (pas listée dans la page de man de gpg sur mon système), mais je vais creuser la question de la désactivation de la compression. Le cas échéant, je compléterai mon benchmark.

  2. J’ai mis à jour la commande GPG avec l’option « –compress-algo none », et mis à jour les benchmarks.
    Effectivement, ça va plus vite, mais ça reste plus lent qu’OpenSSL.

  3. @Zul : J’ai eu la même remarque sur Twitter. C’est marrant.
    Les mots « crypter » et « décrypter » sont au dictionnaire, et ce sont des anglicismes très courants.

    Mais j’imagine que tu n’utilises jamais d’anglicisme, toi ? C’est vrai qu’en informatique, on n’utilise jamais les termes filesystem, log, passphrase, library, mock, benchmark, digital, commit, scalable, software, hardware, chatbot, cloud, big data, batch, blacklist, fixture, string, newsletter, reset, inline, launcher, lock, nocode, thread, boot, keygen, getter/setter, spam, scroll, screenshot, preview, namespace, socket, stack, template, download/upload, uptime, firmware, update…

    Ou alors, « chiffrer » serait le seul terme qui mérite une croisade ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.