Crypter un fichier sous Linux avec OpenSSL, GPG ou scrypt

Publié le 20 octobre 2024 par Abouchard

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.