#!/bin/bash
# Script de chiffrement/déchiffrement avec 7-zip
# attention à bien conserver votre clé de chiffrement!
# Fred Radeff (aka FR), fradeff@akademia.ch, www.radeff.red
# 08.05.26
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Vérifier si 7z est installé
check_7zip() {
if ! command -v 7z &> /dev/null; then
echo -e "${RED}Erreur: 7-zip n'est pas installé.${NC}"
echo -e "${YELLOW}Installation: sudo apt install p7zip-full (Debian/Ubuntu)${NC}"
exit 1
fi
}
# Afficher l'aide
show_help() {
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Script de chiffrement avec 7-zip ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}Utilisation:${NC}"
echo " $0 [OPTIONS]"
echo ""
echo -e "${GREEN}Options:${NC}"
echo " -e, --encrypt FICHIER Chiffrer un fichier"
echo " -d, --decrypt FICHIER Déchiffrer un fichier"
echo " -o, --output NOM Nom du fichier de sortie (optionnel)"
echo " -h, --help Afficher cette aide"
echo ""
echo -e "${GREEN}Exemples:${NC}"
echo " $0 -e secret.txt"
echo " $0 -e secret.txt -o archive.7z"
echo " $0 -d secret.7z"
echo " $0 -d secret.7z -o secret_dechiffre.txt"
echo ""
}
# Chiffrer un fichier
encrypt_file() {
local input_file=$1
local output_file=$2
# Vérifier si le fichier existe
if [ ! -f "$input_file" ]; then
echo -e "${RED}Erreur: Le fichier '$input_file' n'existe pas.${NC}"
exit 1
fi
# Définir le nom de sortie par défaut
if [ -z "$output_file" ]; then
output_file="${input_file}.7z"
fi
echo -e "${GREEN}→ Chiffrement du fichier: ${BLUE}$input_file${NC}"
echo -e "${GREEN}→ Fichier de sortie: ${BLUE}$output_file${NC}"
echo ""
# Chiffrer avec 7-zip
# -p : va demander le mot de passe (sans le mettre en argument)
# -mx=9 : compression maximale
# -mhe=on : chiffrer les noms de fichiers
# Utilisation de -p seul pour forcer la demande de mot de passe
7z a -p -mx=9 -mhe=on "$output_file" "$input_file"
if [ $? -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ Fichier chiffré avec succès !${NC}"
echo -e "${YELLOW}→ Le fichier original peut être supprimé: rm $input_file${NC}"
else
echo -e "${RED}✗ Erreur lors du chiffrement.${NC}"
exit 1
fi
}
# Déchiffrer un fichier
decrypt_file() {
local input_file=$1
local output_file=$2
# Vérifier si le fichier existe
if [ ! -f "$input_file" ]; then
echo -e "${RED}Erreur: Le fichier '$input_file' n'existe pas.${NC}"
exit 1
fi
echo -e "${GREEN}→ Déchiffrement du fichier: ${BLUE}$input_file${NC}"
echo ""
# Créer un répertoire temporaire
local temp_dir=$(mktemp -d)
# IMPORTANT: NE PAS mettre -p du tout pour forcer la demande interactive
# 7z va automatiquement demander le mot de passe si le fichier est chiffré
echo -e "${YELLOW}>>> Le mot de passe va vous être demandé ci-dessous <<<${NC}"
echo ""
7z x "$input_file" -o"$temp_dir"
if [ $? -eq 0 ]; then
# Trouver le(s) fichier(s) extrait(s)
local extracted_files=("$temp_dir"/*)
if [ ${#extracted_files[@]} -eq 1 ] && [ -f "${extracted_files[0]}" ]; then
# Un seul fichier extrait
if [ -z "$output_file" ]; then
# Utiliser le nom original sans l'extension .7z
output_file="${input_file%.7z}"
# Si c'est toujours la même chose, ajouter "_dechiffre"
if [ "$output_file" = "$input_file" ]; then
output_file="${input_file}_dechiffre"
fi
fi
mv "${extracted_files[0]}" "$output_file"
echo ""
echo -e "${GREEN}✓ Fichier déchiffré avec succès : ${BLUE}$output_file${NC}"
else
# Plusieurs fichiers ou dossiers
if [ -z "$output_file" ]; then
output_file="extracted_$(date +%Y%m%d_%H%M%S)"
fi
mv "$temp_dir" "$output_file"
echo ""
echo -e "${GREEN}✓ Dossier déchiffré avec succès : ${BLUE}$output_file${NC}"
fi
rm -rf "$temp_dir"
else
echo ""
echo -e "${RED}✗ Erreur lors du déchiffrement. Vérifiez que :${NC}"
echo -e "${RED} 1. Le mot de passe est correct${NC}"
echo -e "${RED} 2. Le fichier est bien une archive 7z chiffrée${NC}"
rm -rf "$temp_dir"
exit 1
fi
}
# Menu interactif
interactive_mode() {
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Script de chiffrement avec 7-zip ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
while true; do
echo -e "${GREEN}Que voulez-vous faire ?${NC}"
echo " 1) Chiffrer un fichier"
echo " 2) Déchiffrer un fichier"
echo " 3) Quitter"
echo ""
read -p "Votre choix [1-3] : " choice
case $choice in
1)
clear
echo "Liste des fichiers du répertoire courant:"
ls
read -p "Fichier à chiffrer : " input_file
read -p "Fichier de sortie (appuyez Entrée pour auto) : " output_file
encrypt_file "$input_file" "$output_file"
echo ""
;;
2)
clear
ls *.7z
read -p "Fichier à déchiffrer (.7z) : " input_file
read -p "Fichier de sortie (appuyez Entrée pour auto) : " output_file
decrypt_file "$input_file" "$output_file"
echo ""
;;
3)
echo -e "${GREEN}Au revoir !${NC}"
exit 0
;;
*)
echo -e "${RED}Choix invalide${NC}"
;;
esac
done
}
# Test rapide de l'archive (optionnel)
test_archive() {
local archive=$1
echo -e "${YELLOW}Test de l'archive...${NC}"
7z t "$archive" -p
}
# Main
main() {
check_7zip
# Si aucun argument, mode interactif
if [ $# -eq 0 ]; then
interactive_mode
exit 0
fi
# Traitement des arguments
local mode=""
local input=""
local output=""
while [[ $# -gt 0 ]]; do
case $1 in
-e|--encrypt)
mode="encrypt"
input="$2"
shift 2
;;
-d|--decrypt)
mode="decrypt"
input="$2"
shift 2
;;
-o|--output)
output="$2"
shift 2
;;
-t|--test)
mode="test"
input="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}Option inconnue: $1${NC}"
show_help
exit 1
;;
esac
done
# Exécuter l'action demandée
case $mode in
encrypt)
encrypt_file "$input" "$output"
;;
decrypt)
decrypt_file "$input" "$output"
;;
test)
test_archive "$input"
;;
*)
echo -e "${RED}Erreur: Spécifiez -e, -d ou -t${NC}"
show_help
exit 1
;;
esac
}
# Lancer le script
main "$@"