#!/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 "$@"