GPG - Script - batch - auto encrypt
Voir aussi :
Par défaut GPG utilise le dossier « .gnupg » dans le HOMEDIR de l'utilisateur. Il contient notamment la configuration, le trousseau de clefs, le trust database etc…
Or notre besoin actuel est juste de pouvoir chiffrer un fichier avec une clef publique déterminée. Je propose une approche “stateless” où le trousseau de clefs serait créé avant chaque chiffrement et détruit à la fin.
Par exemple pour chiffrer “secret_plan_to_rule_the_world.txt” avec la clef publique de Bob :
bash gpg-auto-encrypt.sh -k bob.pub.asc -i secret_plan_to_rule_the_world.txt -o encrypted-data.txt.gpg
Le fichier “encrypted-data.txt.gpg” a été généré et peut être envoyé. Seul Bob pourra le déchiffrer.
En cas de changement de clef, il suffit de remplacer le fichier “bob.pub.asc”
Il manque cruellement la vérification de Signature \ Sans signature rien de garantie que le fichier chiffré n’a été altéré volontairement ou pour des causes techniques.\ Sans signature vous pouvez faire confiance sur le fait que seul Bob pourra déchiffré le fichier (à condition d’être certain de la clef de Bob et que Bob ai bien protégé sa clef privée) \ Mais Bob ne peut pas avoir confiance en votre fichier.
gpg-auto-encrypt.sh
#! /bin/bash set -euo pipefail export LC_ALL=C SCRIPT_NAME="$(basename "$0")" install -d "${HOME}/tmp/" GNUPGHOME="$(mktemp -d -p "${HOME}/tmp/" --suffix=_"${SCRIPT_NAME%%.*}")" trap 'rm -rf "$GNUPGHOME"' EXIT gpg_import() { PUBKEY_ID=$(gpg --batch --import "${PUBKEY_FILE}" 2>&1 | awk '/^gpg: key / {gsub(":", "") ; print $3 ;}') } gpg_encrypt() { gpg --batch --trust-model always --output "$OUTPUT_FILE" -r "${PUBKEY_ID}" --encrypt "$DATA_FILE" } main() { gpg_import gpg_encrypt } usage() { cat <<-EOF Usage: $0 -k KEY_FILE -i INPUT_FILE -o OUTPUT_FILE Mandatory arguments: -k FILE Public key file. -i FILE File to encrypt. -o FILE Encrypted file to write. Example : $0 -k bob.pub.asc -i secret_plan_to_rule_the_world.txt -o encrypted-data.txt.gpg EOF } ARGS_COUNT="$#" while [ "${1-}" != "" ]; do case $1 in -k) shift PUBKEY_FILE=$1 ;; -i) shift DATA_FILE=$1 ;; -o) shift OUTPUT_FILE=$1 ;; -h | --help) usage exit 0 ;; --) # End of all options shift break ;; -*) echo "SCRIPT_NAME: invalid option" >&2 echo "Try '$SCRIPT_NAME --help' for more information." >&2 exit 1 ;; *) usage ;; esac shift done if [ "$ARGS_COUNT" -lt 6 ]; then usage exit 1 fi main
