info:7-zip-crypt

#!/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 "$@"
  • info/7-zip-crypt.txt
  • Dernière modification : 2026/04/08 05:27
  • de radeff