Skip to main content
Une illustration numérique futuriste présentant un cadenas vert néon brillant flottant au-dessus d'une interface de terminal en ligne de commande transparente. L'écran du terminal affiche le texte 'GnuPG ENCRYPTION ACTIVE', sur un fond sombre de motifs de circuits imprimés bleus et verts et de code binaire tombant.

Simplifier le Chiffrement de Fichiers sur Linux & macOS avec GnuPG et Bash

2 min 380 words

Protégez vos données des accès non autorisés avec ce workflow robuste en ligne de commande pour macOS et Linux.

Supposez que vous devez transférer un fichier ou un dossier à quelqu’un sans risque d’interception—que ce soit sur un réseau non sécurisé ou via un email d’entreprise. Dans ce cas, chiffrer vos documents est essentiel.

Bien que plusieurs utilitaires existent pour macOS et Linux, notamment GnuPG et OpenSSL, je recommande GnuPG. En tentant d’utiliser OpenSSL, j’ai rencontré des erreurs récurrentes avec des fichiers spécifiques (typiquement ceux contenant des octets NUL). Une discussion sur ce sujet souligne pourquoi GnuPG est généralement le choix supérieur pour ce cas d’usage.

Dans ce post, je présente deux fonctions Bash basées sur GnuPG compatibles avec Linux et macOS. Ces wrappers fournissent une solution en ligne de commande simplifiée pour chiffrer et déchiffrer à la fois des fichiers et des dossiers.

Installation

D’abord, nous devons nous assurer que gnupg est installé.

Sur macOS

Nous utiliserons Homebrew, le gestionnaire de paquets populaire pour macOS. Si brew n’est pas encore installé, lancez la commande suivante :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Une fois Homebrew prêt, installez gpg :

brew install gnupg

Sur Linux

gpg est habituellement pré-installé. Si non, utilisez le gestionnaire de paquets de votre distribution. Pour les systèmes basés sur Debian (Ubuntu, Mint, etc.) :

sudo apt install gnupg

Tester l’installation

Vérifiez l’installation en contrôlant la version :

gpg --version

Vous devriez voir une sortie similaire à ceci :

gpg (GnuPG) 2.4.5
libgcrypt 1.10.3
Copyright (C) 2024 g10 Code GmbH
...
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256...

Chiffrement

Utiliser la commande GPG brute

Pour chiffrer un seul fichier nommé a_file en utilisant l’algorithme AES256 :

gpg --symmetric --cipher-algo AES256 a_file

GPG vous demandera d’entrer une phrase secrète (passphrase).

Note : Choisissez une phrase secrète robuste (au moins 8 caractères, mélangeant chiffres et caractères spéciaux). Si le mot de passe est trop faible, GPG peut demander une confirmation ou le rejeter selon votre configuration.

Une fonction wrapper pour un usage plus facile

La commande brute ne gère pas les dossiers nativement (vous devez les archiver d’abord). La fonction ci-dessous gère à la fois les fichiers et les dossiers automatiquement. Ajoutez ceci à votre .bashrc ou .bash_profile :

function encrypt(){
  to_encrypt=""
  original_to_encrypt=""
  output_file=""
  other_input=""
  is_folder=0

  for param in "$@" ; do
    key=$(echo "${param}" | cut -d"=" -f1)
    value=$(echo "${param}" | cut -d"=" -f2)
    if [ "${key}" = "--input" ] ; then
      to_encrypt=${value}
      original_to_encrypt=${value}
    elif [ "${key}" = "--output" ] ; then
      output_file=${value}
    else
      other_input=${param}
    fi
  done

  if [ ${#to_encrypt} -eq 0 ] ; then
    if [ ${#other_input} -gt 0 ] ; then
      to_encrypt=${other_input}
      original_to_encrypt=${other_input}
    else
      printf "Chemin vers le fichier à chiffrer : "
      read -r to_encrypt;
      original_to_encrypt=${to_encrypt}
    fi
  fi

  if ! command -v gpg &> /dev/null ; then
    printf "Commande requise 'gpg' non installée.\n"
    return 1
  fi

  if [ -d "${to_encrypt}" ] ; then
    if ! command -v zip &> /dev/null ; then
      printf "Commande requise 'zip' non installée.\n"
      return 1
    fi

    zip -r "${to_encrypt}.zip" "${to_encrypt}"
    to_encrypt="${to_encrypt}.zip"
    is_folder=1
  elif [ ! -f "${to_encrypt}" ] ; then
    echo "Chiffrement impossible : il n'y a pas de fichier nommé ${to_encrypt}"
    return 1
  fi

  if [ ${#output_file} -eq 0 ] ; then
    output_file="${original_to_encrypt}.gpg"
  fi
  
  if gpg --output "${output_file}" --symmetric --cipher-algo AES256 "${to_encrypt}" ; then
    echo "${original_to_encrypt} chiffré avec succès !"
  else
    echo "Une erreur est survenue durant le chiffrement de ${original_to_encrypt}"
  fi

  if [ ${is_folder} -eq 1 ] ; then
    rm "$to_encrypt"
  fi
}

Usage

Lancez simplement :

encrypt
# Ou avec arguments :
encrypt file_to_encrypt
encrypt --input=my_folder --output=secure_archive.gpg

Si l’entrée est un dossier, le script le zippe automatiquement avant le chiffrement.

Déchiffrement

Utiliser la commande GPG brute

Pour déchiffrer un fichier :

gpg --output output_file --decrypt a_file.gpg

Une fonction wrapper pour un usage plus facile

Cette fonction détecte si le fichier déchiffré était une archive zip (de notre étape précédente) et l’extrait automatiquement.

function decrypt(){
  to_decrypt=""
  output_file=""
  other_input=""

  for param in "$@" ; do
    key=$(echo "${param}" | cut -d"=" -f1)
    value=$(echo "${param}" | cut -d"=" -f2)
    if [ "${key}" = "--input" ] ; then
      to_decrypt=${value}
    elif [ "${key}" = "--output" ] ; then
      output_file=${value}
    else
      other_input=${param}
    fi
  done

  if [ ${#to_decrypt} -eq 0 ] ; then
    if [ ${#other_input} -gt 0 ] ; then
          to_decrypt=${other_input}
        else
          printf "Chemin vers le fichier à déchiffrer : "
          read -r to_decrypt;
        fi
  fi

  if [ ${#output_file} -eq 0 ] ; then
    if [[ "${to_decrypt}" == *".gpg" ]] ; then
      output_file="${to_decrypt%.gpg}"
    else
      printf "Chemin pour le fichier déchiffré : "
      read -r output_file;
    fi
  fi

  if ! command -v gpg &> /dev/null ; then
    printf "Commande requise 'gpg' non installée.\n"
    return 1
  fi

  gpg --output "${output_file}" --decrypt "${to_decrypt}"
  if [ $? -ne 0 ] ; then
    printf "Erreur durant le déchiffrement. La clé et le fichier sont-ils valides ?\n"
    return 1
  fi

  # Logique auto-unzip
  if unzip -t "${output_file}" &> /dev/null; then
      if [[ "${output_file}" != *".zip" ]] ; then
        mv "${output_file}" "${output_file}.zip"
        output_file="${output_file}.zip"
      fi
      unzip "${output_file}"
      rm "${output_file}"
  fi
}

Usage

decrypt encrypted_file.gpg
# Ou
decrypt --input=encrypted_file.gpg --output=my_secret_file