#!/usr/bin/perl -w

# 
# CrypTK
# 
# Auteur : Stéphane Caron
# Date : mars 2005
# Web : http://www.tastalian.org/
# 
# Petit outil de cryptage en Perl qui utilise le
# module Tk que l'on peut trouver sur le CPAN.
# 

use strict;
use Tk;
use Tk::FileSelect;

# ============================================================
# Interface.

# Création de la fenêtre
my $main = new MainWindow;
$main->title("perlCrypt");

# Cadre 1
my $frame1 = $main->Frame()->pack(
    -side => "top",
    -fill => "both",
    -expand => 1,
    -padx => 5,
    -pady => 5
);

# Cadre 2
my $frame2 = $main->Frame()->pack(
    -side => "bottom",
    -fill => "both",
    -expand => 1,
    -padx => 5,
    -pady => 5
);

# Label "Adresse du fichier"
my $m_LabelFichier = $frame1->Label(
    -text => "Adresse du fichier :"
    )->grid(
    -row => 0,
    -column => 0
);

# Zone de saisie d'adresse
my $m_Fichier = $frame1->Entry()->grid(
    -row => 0,
    -column => 1
);

# Bouton parcourir
my $m_FichierButton = $frame1->Button(
    -text => "...",
    -command => sub {
       $adr = $main->FileSelect();
        $m_Fichier->delete(0, 'end');
        $m_Fichier->insert(0, $adr->Show);
    },
    -padx=>1,
    -pady=>-1
    )->grid(
    -row => 0,
    -column => 2
);

# Label "Clef de cryptage"
my $m_LabelClef = $frame1->Label(
    -text => "Clef de cryptage :  "
    )->grid(
    -row => 1,
    -column => 0
    );

# Zone de saisie de clef
my $m_Clef = $frame1->Entry()->grid(
    -row => 1,
    -column => 1
);

# Bouton de masquage
my $m_ClefButton = $frame1->Button(
    -text => " * ",
    -command => sub {
        $m_Clef->configure(-show => "*");
    },
    -padx=>1,
    -pady=>-1
    )->grid(
    -row => 1,
    -column => 2
);

# Bouton crypter
my $m_Crypt = $frame2->Button(
    text => "Crypter",
    command => sub {
        &crypter($m_Fichier->get(), $m_Clef->get());
    }
    )->pack(
    -side => "left",
    -fill => "both",
    -expand => 1
);

# Bouton decrypter
my $m_Decrypt = $frame2->Button(
    text => "Décrypter",
    command => sub {
       &decrypter($m_Fichier->get(), $m_Clef->get());
    }
    )->pack(
    -side => "left",
    -fill => "both",
    -expand => 1
);

# Bouton d'infos
my $m_Info = $frame2->Button(
    text => "Infos",
    command => sub {
       $main->messageBox(
           -message => "   ..:::: perlCrypt ::::..\n\n".
                       "par Naopic Tastalian\n".
                       "http://www.tastalian.org/");
    }
    )->pack(
    -side => "left",
    -fill => "both",
    -expand => 1
);

# Boucle principale
MainLoop();

# ============================================================
# Procédures.

# Crypter le fichier
sub crypter
{
    # Récupération des variables passées en argumrent
    my ($adr, $clef) = @_;
    chomp($clef);

    # Ouvertue du fichier source
    (open(FICHIER, $adr) ||
        die("Impossible d'ouvrir le fichier!"));

    # Ouvertue du fichier temporaire
    (open(CRYPT, ">$adr\~") ||
       die("Impossible d'écrire sur le support!"));

    # Lecture du fichier ligne par ligne
    my $ligne = <FICHIER>;
    until($ligne eq "") {
        if ($ligne ne "\n") {
            chomp($ligne);
            $ligne = (~($ligne^$clef));
            print CRYPT $ligne;
        }
        print CRYPT "\n";
        $ligne = <FICHIER>;
    }
    
    # Fermeture des fichiers ouvertes
    ((close(CRYPT) && close(FICHIER)) ||
        die("Impossible de refermer les fichiers!"));

    # Remplacement du fichier source par le résultat
    (rename("$adr\~", $adr) ||
        die("Impossible de renommer le fichier temporaire!"));
}

# Décrypter le fichier
sub decrypter
{
    # Récupération des variables passées en argumrent
    my ($adr, $clef) = @_;
    chomp($clef);

    # Ouvertue du fichier source
    (open(FICHIER, $adr) ||
        die("Impossible d'ouvrir le fichier!"));

    # Ouvertue du fichier temporaire
    (open(DECRYPT, ">$adr\~") ||
        die("Impossible d'écrire sur le support!"));

    # Lecture du fichier ligne après ligne
    my $ligne = <FICHIER>;
    until($ligne eq "") {
        if ($ligne ne "\n") {
            chomp($ligne);
            $ligne = ((~$ligne)^$clef);
            print DECRYPT $ligne;
        }
        print DECRYPT "\n";
        $ligne = <FICHIER>;
    }

    # Fermeture des fichiers ouvertes
    ((close(DECRYPT) && close(FICHIER)) ||
        die("Impossible de refermer les fichiers!"));

    # Remplacement du fichier source par le résultat
    (rename("$adr\~", $adr) ||
        die("Impossible de renommer le fichier temporaire!"));
}

# - EOF -