Accueil > > > [C++] & SFML CRYPTOGRAPHIE
[C++] & SFML CRYPTOGRAPHIE
Information sur la source
Description
Petit code qui "brouille un texte" dans une image...
Oui, qui brouille, au départ j'ai tenté de caché totalement le texte dans l'image en l'éparpillant, mais je cherche
encore un moyen de mélanger les pixels correctement.
Dans ce programme, j'ai juste fait des inversion 2 par 2 de lignes et de colones de pixels.
Voila le principe :
On écrit dans paint un texte sur un fond vert (la couleur de fond doit donc être 0,255,0 dans Couleurs/Modifier les
couleurs... dans paint). Cette image doit être nommée texte.bmp.
Ensuite on prend une autre image, n'importe quel format.
On met les deux à coté de l'executable.
On ouvre le programme, là il demande le nom de l'image (la derniere évoquée),
puis le nom d'enregistrement (n'importe quoi).
On valide, puis on se met sur la fenetre graphique.
On peut voir l'image de départ. On appuie sur une touche, et les pixels sont mélangés, et le texte qui est extrait
de l'image texte.bmp se colle sur ce mélange.
On rappuie est on peut voir l'image remise en place, et le texte brouillé.
En quittant cette image est enregistrée sous le nom précédement rentré.
Pour "débrouiller" le texte, on réouvre le programme, on choisit "décrypter", est les étapes sont quasi-similaire.
Le programme, les dlls et un exemple sont disponibles à cette adresse : http://dl.free.fr/getfile.pl?file=/EyfTgLKj
Source
- /// RY-CRYPTEUR
- // disponible sur http://dl.free.fr/getfile.pl?file=/EyfTgLKj
-
-
- #include <SFML/Graphics.hpp>
- #include <iostream>
- #include <fstream>
-
- int main()
- {
-
- std::cout << " Bienvenue\n\n";
- std::cout << "Cryptage (1)\nDecryptage (2)\n\nVotre choix : ";
- int choix;
- std::cin >> choix;
-
-
-
- std::string chemin;
- std::cout << "\n\n\nNom de l'image : \n";
- std::cin >> chemin;
- std::string NomFin;
- if (choix != 1 && choix != 2)
- {
- EXIT_FAILURE;
- }
-
-
- std::cout << "\n\nNom d'enregistrement : \n";
- std::cin >> NomFin;
-
-
-
- system ("PAUSE");
-
- sf::RenderWindow App(sf::VideoMode(1024, 768), "SFML Views");
-
-
- sf::Image Image;
- if (!Image.LoadFromFile(chemin))
- return EXIT_FAILURE;
- sf::Sprite Background(Image);
-
-
- Background.Resize(1024, 768);
-
- App.Clear (sf::Color (255,255,255));
- App.Draw(Background);
- App.Display();
-
-
-
-
- //////////////////// VARIABLES //////////////////////
-
- /*int mtaillex = Image.GetWidth();
- int mtailley = Image.GetHeight();
- int TAILLEX = (mtaillex / 400) - 1;
- int TAILLEY = (mtailley / 400) - 1 ;*/
- int TAILLEX = 1;
- int TAILLEY = 1;
-
- std::cout << "\n Taille x: " << TAILLEX << "\n\n";
- std::cout << "\n Taille y: " << TAILLEY << "\n\n";
-
- sf::Color map [TAILLEX] [TAILLEY];
- sf::Color temp [TAILLEX] [TAILLEY];
-
- bool next = false;
-
- ///////////////////// ATTENTE /////////////////////////
-
-
- std::cout << "\n\nVeuillez appuyez sur une touche pour continuer.\n\n";
-
- next = false;
- while (!next)
- {
-
- sf::Event Event;
- while (App.GetEvent(Event))
- {
-
-
- if ((Event.Type == sf::Event::KeyPressed))
- next = true;
- if (Event.Type == sf::Event::Closed)
- App.Close();
-
- if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
- App.Close();
- }
-
-
-
- App.Clear();
- App.Draw(Background);
- App.Display();
- }
-
-
- /////////////////// TRAITEMENT //////////////////////
-
-
- /// En x
-
-
- for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY))
- {
- if ((j + TAILLEY) < Image.GetHeight())
- {
- for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX*2))
- {
- if ((i + 2* TAILLEX) < Image.GetWidth())
- {
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- map [x] [y] = Image.GetPixel((i+x),(j+y));
- temp [x][y] = Image.GetPixel ((i+TAILLEX+x), (j+y));
- }
- }
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- Image.SetPixel ((i+x), (j+y), temp [x] [y]);
- Image.SetPixel ((i+x+TAILLEX),(j+y), map [x][y]);
- }
- }
-
- }
- }
- }
- }
-
- /// En y
- for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX))
- {
- if ((i + 2* TAILLEX) < Image.GetWidth())
- {
- for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY * 2))
- {
- if ((j + TAILLEY) < Image.GetHeight())
- {
-
-
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- map [x] [y] = Image.GetPixel((i+x),(j+y));
- temp [x][y] = Image.GetPixel ((i+x), (TAILLEY+j+y));
- }
- }
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- Image.SetPixel ((i+x), (j+y), temp [x] [y]);
- Image.SetPixel ((i+x),(TAILLEY +j+y), map [x][y]);
- }
- }
-
- }
- }
- }
- }
-
-
-
-
- //////// MISE EN PLACE DE L'OBJET
- if (choix == 1)
- {
-
- sf::Image imgTexte;
-
- if (!imgTexte.LoadFromFile("texte.bmp"))
- return EXIT_FAILURE;
-
- for (int i = 0; i < imgTexte.GetWidth(); i++)
- {
- for (int j = 0; j < imgTexte.GetHeight(); j++)
- {
- if (imgTexte.GetPixel(i,j) != sf::Color (0,255,0))
- {
- Image.SetPixel (i, j, imgTexte.GetPixel(i,j));
- }
- }
- }
-
- }
-
-
-
-
- ///////////////////// ATTENTE /////////////////////////
-
-
- std::cout << "\n\nVeuillez appuyez sur une touche pour continuer.\n\n";
-
- next = false;
- while (!next)
- {
-
- sf::Event Event;
- while (App.GetEvent(Event))
- {
-
-
- if ((Event.Type == sf::Event::KeyPressed))
- next = true;
- if (Event.Type == sf::Event::Closed)
- App.Close();
-
- if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
- App.Close();
- }
-
-
-
- App.Clear();
- App.Draw(Background);
- App.Display();
- }
-
-
- ////////////////////// Enregistrement //////////////////
-
- if (choix == 2)
- {
- Image.SaveToFile (NomFin);
- system ("cls");
- std::cout << "Vous pouvez fermer la fenetre.\n\n";
- }
-
- /////////////////// REMISE EN PLACE //////////////////////
-
- /// En y
- for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX))
- {
- if ((i + 2* TAILLEX) < Image.GetWidth())
- {
- for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY * 2))
- {
- if ((j + TAILLEY) < Image.GetHeight())
- {
-
-
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- map [x] [y] = Image.GetPixel((i+x),(j+y));
- temp [x][y] = Image.GetPixel ((i+x), (TAILLEY +j+y));
- }
- }
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- Image.SetPixel ((i+x), (j+y), temp [x] [y]);
- Image.SetPixel ((i+x),(TAILLEY + j+y), map [x][y]);
- }
- }
-
- }
- }
- }
- }
-
-
-
- /// En x
-
-
- for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY))
- {
- if ((j + TAILLEY) < Image.GetHeight())
- {
- for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX*2))
- {
- if ((i + 2* TAILLEX) < Image.GetWidth())
- {
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- map [x] [y] = Image.GetPixel((i+x),(j+y));
- temp [x][y] = Image.GetPixel ((i+TAILLEX+x), (j+y));
- }
- }
- for (int y = 0; y < TAILLEY; y++)
- {
- for (int x = 0; x < TAILLEX; x++)
- {
- Image.SetPixel ((i+x), (j+y), temp [x] [y]);
- Image.SetPixel ((i+x+TAILLEX),(j+y), map [x][y]);
- }
- }
-
- }
- }
- }
- }
-
-
-
-
- ////////////////////// Enregistrement //////////////////
-
- if (choix == 1)
- {
- Image.SaveToFile (NomFin);
- system ("cls");
- std::cout << "Vous pouvez fermer la fenetre.\n\n";
- }
-
- ///////////////////// ATTENTE /////////////////////////
-
-
- App.Clear (sf::Color (255,255,255));
- App.Draw(Background);
- App.Display();
-
-
-
-
- while (App.IsOpened())
- {
-
- sf::Event Event;
- while (App.GetEvent(Event))
- {
-
- if (Event.Type == sf::Event::Closed)
- App.Close();
-
- if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
- App.Close();
- }
-
-
-
- App.Clear();
- App.Draw(Background);
- App.Display();
- }
-
-
-
- return EXIT_SUCCESS;
- }
/// RY-CRYPTEUR
// disponible sur http://dl.free.fr/getfile.pl?file=/EyfTgLKj
#include <SFML/Graphics.hpp>
#include <iostream>
#include <fstream>
int main()
{
std::cout << " Bienvenue\n\n";
std::cout << "Cryptage (1)\nDecryptage (2)\n\nVotre choix : ";
int choix;
std::cin >> choix;
std::string chemin;
std::cout << "\n\n\nNom de l'image : \n";
std::cin >> chemin;
std::string NomFin;
if (choix != 1 && choix != 2)
{
EXIT_FAILURE;
}
std::cout << "\n\nNom d'enregistrement : \n";
std::cin >> NomFin;
system ("PAUSE");
sf::RenderWindow App(sf::VideoMode(1024, 768), "SFML Views");
sf::Image Image;
if (!Image.LoadFromFile(chemin))
return EXIT_FAILURE;
sf::Sprite Background(Image);
Background.Resize(1024, 768);
App.Clear (sf::Color (255,255,255));
App.Draw(Background);
App.Display();
//////////////////// VARIABLES //////////////////////
/*int mtaillex = Image.GetWidth();
int mtailley = Image.GetHeight();
int TAILLEX = (mtaillex / 400) - 1;
int TAILLEY = (mtailley / 400) - 1 ;*/
int TAILLEX = 1;
int TAILLEY = 1;
std::cout << "\n Taille x: " << TAILLEX << "\n\n";
std::cout << "\n Taille y: " << TAILLEY << "\n\n";
sf::Color map [TAILLEX] [TAILLEY];
sf::Color temp [TAILLEX] [TAILLEY];
bool next = false;
///////////////////// ATTENTE /////////////////////////
std::cout << "\n\nVeuillez appuyez sur une touche pour continuer.\n\n";
next = false;
while (!next)
{
sf::Event Event;
while (App.GetEvent(Event))
{
if ((Event.Type == sf::Event::KeyPressed))
next = true;
if (Event.Type == sf::Event::Closed)
App.Close();
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
App.Close();
}
App.Clear();
App.Draw(Background);
App.Display();
}
/////////////////// TRAITEMENT //////////////////////
/// En x
for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY))
{
if ((j + TAILLEY) < Image.GetHeight())
{
for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX*2))
{
if ((i + 2* TAILLEX) < Image.GetWidth())
{
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
map [x] [y] = Image.GetPixel((i+x),(j+y));
temp [x][y] = Image.GetPixel ((i+TAILLEX+x), (j+y));
}
}
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
Image.SetPixel ((i+x), (j+y), temp [x] [y]);
Image.SetPixel ((i+x+TAILLEX),(j+y), map [x][y]);
}
}
}
}
}
}
/// En y
for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX))
{
if ((i + 2* TAILLEX) < Image.GetWidth())
{
for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY * 2))
{
if ((j + TAILLEY) < Image.GetHeight())
{
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
map [x] [y] = Image.GetPixel((i+x),(j+y));
temp [x][y] = Image.GetPixel ((i+x), (TAILLEY+j+y));
}
}
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
Image.SetPixel ((i+x), (j+y), temp [x] [y]);
Image.SetPixel ((i+x),(TAILLEY +j+y), map [x][y]);
}
}
}
}
}
}
//////// MISE EN PLACE DE L'OBJET
if (choix == 1)
{
sf::Image imgTexte;
if (!imgTexte.LoadFromFile("texte.bmp"))
return EXIT_FAILURE;
for (int i = 0; i < imgTexte.GetWidth(); i++)
{
for (int j = 0; j < imgTexte.GetHeight(); j++)
{
if (imgTexte.GetPixel(i,j) != sf::Color (0,255,0))
{
Image.SetPixel (i, j, imgTexte.GetPixel(i,j));
}
}
}
}
///////////////////// ATTENTE /////////////////////////
std::cout << "\n\nVeuillez appuyez sur une touche pour continuer.\n\n";
next = false;
while (!next)
{
sf::Event Event;
while (App.GetEvent(Event))
{
if ((Event.Type == sf::Event::KeyPressed))
next = true;
if (Event.Type == sf::Event::Closed)
App.Close();
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
App.Close();
}
App.Clear();
App.Draw(Background);
App.Display();
}
////////////////////// Enregistrement //////////////////
if (choix == 2)
{
Image.SaveToFile (NomFin);
system ("cls");
std::cout << "Vous pouvez fermer la fenetre.\n\n";
}
/////////////////// REMISE EN PLACE //////////////////////
/// En y
for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX))
{
if ((i + 2* TAILLEX) < Image.GetWidth())
{
for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY * 2))
{
if ((j + TAILLEY) < Image.GetHeight())
{
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
map [x] [y] = Image.GetPixel((i+x),(j+y));
temp [x][y] = Image.GetPixel ((i+x), (TAILLEY +j+y));
}
}
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
Image.SetPixel ((i+x), (j+y), temp [x] [y]);
Image.SetPixel ((i+x),(TAILLEY + j+y), map [x][y]);
}
}
}
}
}
}
/// En x
for (int j = 0; j < Image.GetHeight(); j+= (TAILLEY))
{
if ((j + TAILLEY) < Image.GetHeight())
{
for (int i = 0; i < Image.GetWidth(); i+= (TAILLEX*2))
{
if ((i + 2* TAILLEX) < Image.GetWidth())
{
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
map [x] [y] = Image.GetPixel((i+x),(j+y));
temp [x][y] = Image.GetPixel ((i+TAILLEX+x), (j+y));
}
}
for (int y = 0; y < TAILLEY; y++)
{
for (int x = 0; x < TAILLEX; x++)
{
Image.SetPixel ((i+x), (j+y), temp [x] [y]);
Image.SetPixel ((i+x+TAILLEX),(j+y), map [x][y]);
}
}
}
}
}
}
////////////////////// Enregistrement //////////////////
if (choix == 1)
{
Image.SaveToFile (NomFin);
system ("cls");
std::cout << "Vous pouvez fermer la fenetre.\n\n";
}
///////////////////// ATTENTE /////////////////////////
App.Clear (sf::Color (255,255,255));
App.Draw(Background);
App.Display();
while (App.IsOpened())
{
sf::Event Event;
while (App.GetEvent(Event))
{
if (Event.Type == sf::Event::Closed)
App.Close();
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
App.Close();
}
App.Clear();
App.Draw(Background);
App.Display();
}
return EXIT_SUCCESS;
}
Conclusion
Bon, j'avoue que le code à beau être en C++, il n'est pas très orienté objet.
Mais bon, c'était un petit défi que je m'étais lancé.
Je sais que ce programme est loin (très loin) d'être parfait, et je ne rejetterais pas vos commentaires ainsi vos idées :)
D'ailleurs si quelqu'un connait une façon de vraiment mélanger les pixels de façon mathématique...
M'enfin voila, http://dl.free.fr/getfile.pl?file=/EyfTgLKj
Historique
- 13 mai 2010 16:12:46 :
- Conclusion
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Probléme de variable externe [ par mateo40 ]
J'ai un problème !! (pas tres original comme intro...)Je travaile sous Builder C++.J'ai 2 fichiers DES.h et DES.cpp qui contiennent une classe dédiée
cryptage et cryptographie [ par H_lecteur ]
bonjour,j besoin de la documentation sur le cryptage et la cryptographie svp.... merci de bien vouloir m'aider......
Comment insere des information provenant d'une page web dans un cpp [ par malaouac1 ]
Bonjour a tous Je souhaiterai pouvoir inserer des information provenant d'une page web dans un programme en cpp. je voudrai pouvoir voir ces infos dan
comment utiliser la biblio de turbo c dans dev-cpp? [ par sidimo85 ]
Je suis habitue a travailler en turbo c. Mntnt je travaille sur dev-cpp, et je me retrouve avec des errors de compilation quand j utilise la syntaxe d
probleme avec string [ par slyfer07 ]
Bonjour tout le monde,je débute en C++ et je suis en train de réaliser mon premier projet (j'utilise DevC++). Celui-ci comprend mon main.cpp
Problème avec SDL_ttf... [ par noursmarron ]
Je suis désespéré et au bord du suicide lolun peu noob aussi mais bon ;)Donc je viens d'installer SDL qui marche très bien (sur co
J'arrive pas à installééuh! [ par tekila_bandita ]
Bonjour,Eh bien je possede Linux Mandrake free 2006 et Windows Xp familiale, et j'utilise les compilateurs gcc et g++ pour mandriva et l'IDE dev-cpp s
Mais comment utiliser wxWidgets avec Code::Blocks et VC++ 7.1 toolkit ??!!! [ par zippro4012 ]
Je programme en C++ dans l'éditeur Code::Blocks, et compile avec VC++ 7.1 toolkit.Il est relativement ennuyeux d'utiliser les APIs Windows pour c
PROBLEME AVEC UNE BIBLIOTHEQUE GRAPHIQUE [ par tekila_bandita ]
Bonjour, je me suis acheté un livre sur le C++ intitulé "La BIBLE C++" de Cay HORSTMANN et timothy BUDD... Dans ce livre, pour l'introductio
Visual cpp, Rhapsody [ par boyweuz ]
Bonjour tout le monde,Je travaille sur un projet interfaçant visual c++ et Rhapsody.Je veux faire une interface graphiphe sous visual c++ et d
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|