Simplifier le Chiffrement de Fichiers sur Linux & macOS avec GnuPG et Bash
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