FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Une archive cryptée Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Une archive cryptée Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Une archive cryptée Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Une archive cryptée Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Une archive cryptée Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Une archive cryptée Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Une archive cryptée Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Une archive cryptée Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Une archive cryptée Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Une archive cryptée Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Une archive cryptée Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Une archive cryptée Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Une archive cryptée Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Une archive cryptée Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Une archive cryptée Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -47%
SAMSUNG T7 Shield Bleu – SSD Externe 1 To ...
Voir le deal
89.99 €

 

 Une archive cryptée

Aller en bas 
4 participants
AuteurMessage
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Une archive cryptée   Une archive cryptée EmptyMer 21 Mar 2012 - 23:58

Pour les paranoïaques, ou simplement les prodents: j'ai fait un petit outil qui permet de crypter des fichiers.

En fait, je crée un fichier archive contenant la liste des fichiers cryptés, avec leur nom et chemin d'accès d'origine, et leur nom crypté. Evidemment, l'archive est elle-même cryptée. Les fichiers ne sont pas physiquement déplacés, mais cryptés et renommés de façon aléatoire. Pour chaque archive, on choisit un mot de passe dont la longueur n'est pas limité - cela peut être une phrase entière, un chapitre d'un livre, des caractères aléatoires même spéciaux, etc. L'archive elle-même est cryptée avec ce mot de passe, ainsi que tous les fichiers dépendant de l'archive. On peut créer autant d'archives qu'on veut, chacun avec son propre mot de passe.

Attention: l'oubli du mot de passe rend IMPOSSIBLE de récupérer ses fichiers !

Voici le code:
Code:
' archivage.bas

' Gestion d'un fichier archive crypté.
' Le fichier est divisé en blocs de longueur variable..
' Tous les blocs sont cryptés, avec un mot de passe de longueur libre,
' puis un algorithme interne de transformation des octets...
' Le premier bloc de 40 octets est la racine et donne les informations suvantes:
'  32 octets repère de validité du fichier
'    egrvichxachitlgeegavichaychovame
'  4 octets taille du fichier en octets
'  4 octets ptr 1er bloc répertoire
' Un bloc a la structure générale suivante:
'  4 octets longueur du bloc
'  n octets utiles
' La partie utile d'un bloc répertoire:
'  255 octets maxi de nom de fichier
'  L'ordre des noms de fichier dans le répertoire n'est pas significatif.
' Le dernier bloc est un bloc vide qui a donc une longueur de 4 octets
' qui sont tous à zéro: longueur du bloc est zéro.

' On n'archive que les noms cryptés des fichiers, avec leur chemin.
' Les fichiers eux-mêmes seront cryptés sur place, en écrasant leur contenu.
' Ceci permet une sécurité totale car ils seront impossibles à relire.

' Tous les fichiers d'une même archive sont cryptés par le même mot de passe.
' Le mot de passe de cryptage n'est PAS mémorisé dans l'archive !

' La fonction Ajouter ajoute un nom de fichier dans l'archive et crypte ce fichier.
' La fonction Extraire enlève un nom de fichier et le décrypte.
' La fonction Intégrer réintègre un nom de fichier crypté dans dans l'archive.
' Ceci a son utilité si l'archive est corrompu - on peut ainsi le reconstituer
' sans perdre les données.

' A l'ouverture d'une archive, elle est chargée dans la list et dlist
' A chaque modification, l'archive est reconstruite entièrement. Ainsi, il
' n'y a pas de trou après une suppression, et il n'y a pas besoin de
' réorganiser l'archive ni de gérer les emplacements vides.

' Il y a un moyen simple de "durcir" le cryptage, le personnaliser et le
' rendre impénétrable, même pour un autre Panoramicien, même si l'on connaît
' le mot de passe (à condition de ne pas divulguer les sources de sa
' version personnelle, bien sûr !): c'est d'agrandir le tableau MASK% et
' de lui charger des valeurs supplémentaires, en adaptent la limite de 4
' actuelle dans les routines coder_interne et decoder_interne. Imparable.

' Les noms des fichiers sont systématiquement changés.. Pour cela, on utilise
' la dlist pour mémoriser les noms physiques après renommage. Les nouveaux
' noms sont construits par un générateur de hasard utilisant les lettres,
' chiffres et les signes "$_-". Seule la partie "nom de fichier" est remplacée
' ainsi; l'extension devient systématiquement "fac" (fichier archive crypté).
' La partie "chemin d'accès" reste inchangé. La longueur du nom de fichier est
' fixée arbitrairement à 15 caractères. Dans le fichier archive, on mémorise
' systématiquement les deux noms, dans le même format: d'abord le nom d'origine
' qui sera affiché dans la list, ensuite le nom de remplacement qui sera
' mémorisé dans la dlist. Ainsi, personne ne pourra savoir quel fichier *.fac
' correspond à quel fichier d'origine. De plus, les fichiers cryptés portent
' l'attribut "caché" ce qui les rend invisibles dans le répertoire, dans des
' conditions normales.

' Le cryptage en Panoramic est EXTREMEMENT lent. J'ai donc réalisé le même
' cryptage par une DLL Delphi nommée crypto.dll. Un paramètre dans les options
' permet de choisir entre les deux versions. La différence est spectaculaire:
' pour un fichier de 7500 ko (7,5 Mo):
'  Panoramic: 48 minutes
'  Delphi:    1 seconde

' Une fonction supplémentaire du menu Fichiers permet la suppression sécurisée
' d'un fichier. C'est indépendent d'une archive.

' *** routine principale
label labels : gosub labels
gosub variables
gosub form0
gosub menu
gosub GUI
gosub initialisations
end

' *** définition de tous les labels
labels:
  label variables, form0, menu, GUI, initialisations, close_options
  label new, opn, svg, svx, clsx, ajouter, sortir, options, val_options
  label aide, apropos, gerer_menu, close_saisie, close_apropos, close0
  label effacer, click_grille, close_pwd, timer_pwd, extraire, integrer
  label coder_interne, decoder_interne, IntToStr, StrToInt, detacher
  label coder_special, decoder_special, charger_repertoire, destroy
  label decoder_special_block, decoder_interne_block, convert_pwd
  label crypter, decrypter, StrToHex, nouveau_nom, decoder_block, crypter1
  return

' *** définition de toutes les variables
variables:
  dim no%, parent_1%, parent_2%
  dim nom_fichier$, no_open%, no_save%, no_options%, no_pwd%, no_open_data%
  dim nom_crypte$, rep_crypte$
  dim flag_present%, flag_modif%, no_modif%, no_val_options%, flag_auto%
  dim no_obj_si_present%(10), no_obj_si_modif%(10)
  dim n_obj_si_present%, n_obj_si_modif%, no_timer_pwd%, flag_ajouter%
  dim no_apropos%, no_aide%, flag_pwd%, mot_de_passe$, nom_clair$
  dim no_list_rep%, no_dlist_rep%, filsiz%, nbloc%, reste%, buffeur%(4096)
  dim i%, j%, k%, s$, x%, y%, lig%, col%, s1$, s2$, x, kc%
  dim ic%, jc%, nc%, np%, cc%, num%, pwd$, mot_de_passe%(2048), crypter_n%
  dim nom_rep$, nom_ini$, time1$, time2$, flag%
  dim taille_archive%, debut_repertoire%
  dim mask%(4), mask$
    mask%(1) =  85 : ' hex("55")
    mask%(2) = 170 : ' hex("AA")
    mask%(3) =  90 : ' hex("5A")
    mask%(4) = 165 : ' hex("A5")
  for i%=1 to 4
    mask$ = mask$ + chr$(mask%(i%))
  next i%
  dim nl$ : nl$ = chr$(13)+chr$(10)
  dim version$ : version$ = "V01.03"
  dim creation$ : creation$ = "27 Mars 2012"
  dim entete$ : entete$ = "egrvichxachitlgeegavichaychovame"
  dim zero$ : zero$ = chr$(0)+chr$(0)+chr$(0)+chr$(0)
  dim blocsiz% : blocsiz% = 4096
  dim limite_crypt% : limite_crypt% = 4096
  dim caracteres$ : caracteres$ = "abcdefghijklmnopqrstuvwxyz_$-0123456789"
  dim debug% : debug% = 0
  dim dll% : dll% = 0
  dim cryptage_renforce% : cryptage_renforce% = 0
  dim crypter% : crypter% = 1
  dim decrypter% : decrypter% = 0-1
  dim crypto_dll$ : crypto_dll$ = "C:\temp\crypto.dll"
 
  return
 
' *** configuration de l'écran principal
form0:
'  full_space 0
  if debug%=1
    width 0,850
  else
    width 0,350
  end_if
  height 0,570
  caption 0,"Archivage"
  on_close 0,close0
  return
 
' *** fermeture de la form 0
close0:
  if flag_modif%=1
    flag_auto% = 1
    gosub svg
    flag_auto% = 0
  end_if
  return

' *** création des menus
menu:
  no% = no% + 1 : main_menu no% : parent_1% = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_1%
    parent_2% = no% : caption no%,"Archives"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Nouvelle archive" : on_click no%,new
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Ouvrir une archive..." : on_click no%,opn
  no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no%
    caption no%,"Enregistrer l'archive" : on_click no%,svg
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no%
    caption no%,"Enregistrer l'archive sous.." : on_click no%,svx
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no%
    caption no%,"Fermer l'archive" : on_click no%,clsx
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"------------------"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Sortir" : on_click no%,sortir

  no% = no% + 1 : sub_menu no% : parent no%,parent_1%
    parent_2% = no% : caption no%,"Fichiers"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Ajouter un fichier en cryptant..." : on_click no%, ajouter : inactive no%
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Extraire un fichier en décryptant" : on_click no%, extraire : inactive no%
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Intégrer un fichier sans crypter..." : on_click no%, integrer : inactive no%
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Détacher un fichier sans décrypter" : on_click no%, detacher : inactive no%
    n_obj_si_present% = n_obj_si_present% + 1
    no_obj_si_present%(n_obj_si_present%) = no%
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"------------------"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Destruction sécurisée d'un fichier..." : on_click no%, destroy
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"------------------"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Options" : on_click no%, options
  no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no%
    no_val_options% = no%
    caption no%,"Valider les options" : on_click no%, val_options

  no% = no% + 1 : sub_menu no% : parent no%,parent_1%
    parent_2% = no% : caption no%,"Aide"
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"Aide" : on_click no%, aide
  no% = no% + 1 : sub_menu no% : parent no%,parent_2%
    caption no%,"A-propos" : on_click no%, apropos

  return
 
création de tous les objets Panoramic
GUI:
' *** d'abord les objets invisibles
'    dialogues, list, timer, ...
  no% = no% + 1 : open_dialog no% : no_open% = no%
    filter no%,"Fichier archive|*.dat"
  no% = no% + 1 : open_dialog no% : no_open_data% = no%
    filter no%,"Fichier|*.*"
  no% = no% + 1 : save_dialog no% : no_save% = no%
    filter no%,"Fichier archive|*.dat"
  no% = no% + 1 : timer no% : timer_off no% : no_timer_pwd% = no%
    timer_interval no%,100 : on_timer no%,timer_pwd
  no% = no% + 1 : list no% : if debug%=0 then hide no%
    no_dlist_rep% = no% : sort_on no%
    top no%,30 : left no%,330 : width no%,500 : height no%,400

' *** les objets de la form 0
  no% = no% + 1 : alpha no% : top no%,10 : left no%,10
    caption no%,"Contenu:"
  no% = no% + 1 : list no% : no_list_rep% = no% : sort_on no%
    width no%,300 : height no%,400
    top no%,30 : left no%,10
  no% = no% + 1 : alpha no% : top no%,450 : left no%,140
  no% = no% + 1 : progress_bar no% : top no%,470 : left no%,10
    width no%,300

' *** la page de saisie du mot de passe du programme
  no% = no% + 1 : form no%: hide no% : no_pwd% = no% : parent_1% = no%
    caption no%,"Mot de passe"
    top no%, 30 : left no%,30 : height no%,80 : width no%,400
    on_close no%,close_pwd
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,20 : left no%,20 : width no%,340 : secret_on no%

' *** la page de gestion des options avec ses champs
  no% = no% + 1 : form no% : hide no% : no_options% = no% : parent_1% = no%
    caption no%,"Options"
    top no%, 30 : left no%,30 : height no%,screen_y-60 : width no%,screen_x-60
    on_close no%,close_options
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,10 : left no%,160 : width no%,600 : secret_on no%
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,40 : left no%,160 : width no%,600 : secret_on no%
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,70 : left no%,160 : width no%,40
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,100 : left no%,160 : width no%,40
  no% = no% + 1 : check no% : parent no%,parent_1%
    top no%,130 : left no%,160 : width no%,40
  no% = no% + 1 : check no% : parent no%,parent_1%
    top no%,160 : left no%,160 : width no%,40
  no% = no% + 1 : check no% : parent no%,parent_1%
    top no%,190 : left no%,160 : width no%,40
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,10 : left no%,10 : caption no%,"Mot de passe:"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,40 : left no%,10 : caption no%,"Répéter mot de passe:"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,70 : left no%,10 : caption no%,"Taille de bloc (128...4096):"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,100 : left no%,10 : caption no%,"Limite de cryptage (0=tout):"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,130 : left no%,10 : caption no%,"Mode DEBUG:"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,160 : left no%,10 : caption no%,"Cryptage par DLL:"
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,190 : left no%,10 : caption no%,"Cryptage renforcé (par DLL):"

' *** la fenêtre de saisie avec ses champs
  no% = no% + 1 : form no% : hide no% : no_modif% = no% : parent_1% = no%
    caption no%,"Saisie"
    top no%, 200 : left no%,200 : height no%,100 : width no%,250
    on_close no%,close_saisie
  no% = no% + 1 : edit no% : parent no%,parent_1%
    top no%,20 : left no%,20 : width no%,130

' *** la fenêtre a-propos avc ses champs
  no% = no% + 1 : form no% : hide no% : no_apropos% = no% : parent_1% = no%
    caption no%,"A-propos"
    top no%, 200 : left no%,200 : height no%,150 : width no%,250
    on_close no%,close_apropos
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,20 : left no%,20
    s$ = "Archivage"+nl$
    s$ = s$ + "Version: "+version$+nl$
    s$ = s$ + "Date: "+creation$+nl$
    s$ = s$ + "Auteur: Klaus"+nl$
    caption no%,s$

' *** la fenêtre d'aide avec ses champs
  no% = no% + 1 : form no% : hide no% : no_aide% = no% : parent_1% = no%
    caption no%,"Aide"
    top no%, 20 : left no%,200 : height no%,720 : width no%,400
    on_close no%,close_apropos
  no% = no% + 1 : alpha no% : parent no%,parent_1%
    top no%,20 : left no%,20
    s$ = "Mode d'emploi"+nl$+nl$
    s$ = s$ + "Pour ouvrir ou créer un fichier archive, il faut spécifier"+nl$
    s$ = s$ + "un mot de passe. Ce mot peut avoir une longueur quelconque,"+nl$
    s$ = s$ + "être une phrase complète, une suite de caractères sans signification,"+nl$
    s$ = s$ + "et contenir tout caractère qu'il est possible de saisir au clavier."+nl$+nl$
    s$ = s$ + "ATTENTION !"+nl$
    s$ = s$ + "Le fichier archive sera créé avec ce mot de passe et ne peut être"+nl$
    s$ = s$ + "lu qu'avec le même mot de passe. Il n'existe aucun moyen d'accéder"+nl$
    s$ = s$ + "au contenu du fichier archive sans ce mot de passe !"+nl$+nl$
    s$ = s$ + "L'archive gère la liste des fichiers cryptés. Seuls les noms sont"+nl$
    s$ = s$ + "archivés - les fichiers restent physiquement à leur place. Les fichiers"+nl$
    s$ = s$ + "sont cryptés, et les noms également. Ainsi, dans le répertoire, les"+nl$
    s$ = s$ + "fichiers cryptés restent visibles, mais avec un nom aléatoire et "+nl$
    s$ = s$ + "une extension *.fac ce qui signifie Fichier Archive Crypté."+nl$+nl$
    s$ = s$ + "Dans les options, on peut choisir la taille des blocs traités en"+nl$
    s$ = s$ + "en une seule opération (entre 128 et 4096). On peut aussi choisir"+nl$
    s$ = s$ + "la limite de cryptage. La valeur 0 signifie que le fichier entier"+nl$
    s$ = s$ + "sera crypté, quelque soit sa taille. Attention: cela peut être long !"+nl$
    s$ = s$ + "Une valeur n plus grande que 0 bloque le cryptage après les n premiers"+nl$
    s$ = s$ + "caractères. Ce sera beaucoup plus rapide pour les gros fichiers. Ils"+nl$
    s$ = s$ + "seront toujours inexploitable pour les applications concernées, mais"+nl$
    s$ = s$ + "leur contenu au-delà de cette limite apparaîtra en clair. Il y a donc"+nl$
    s$ = s$ + "un arbitrage à faire entre sécurité et performance."+nl$+nl$
    s$ = s$ + "ATTENTION ! Un fichier crypté avec une limite de cryptage donnée"+nl$
    s$ = s$ + "ne peut être décryptée qu'avec la MEME limite de cryptage !"+nl$+nl$
    s$ = s$ + "L'option DEBUG permet d'afficher, outre la liste avec les noms des"+nl$
    s$ = s$ + "fichiers en clair, une liste contenant les noms des fichiers en clair"+nl$
    s$ = s$ + "suivi d'un ; puis du nom crypté des fichiers cryptés."+nl$
    s$ = s$ + "L'option Cryptage par DLL permet d'effectuer le cryptage par la"+nl$
    s$ = s$ + "dll crypto.dll. Le gain de vitesse est spectaculaire: pour un fichier"+nl$
    s$ = s$ + "de 7,5 Mo, la durée est de 48 minutes en Panoramic, alors qu'elle"+nl$
    s$ = s$ + "tombe à 1 seconde (!) avec la DLL !"+nl$+nl$
    s$ = s$ + "Dans le cas du cryptage par DLL, une option permet d'obtenit un cryptage"+nl$
    s$ = s$ + "renforcé. Cela va au-delà du cryptage par les deux mots de passe et rend"+nl$
    s$ = s$ + "le décryptage impossible sans l'accès à ce programme."+nl$+nl$
    s$ = s$ + "Le menu Fichiers donne les possibilités suivantes:"+nl$
    s$ = s$ + "- ajouter un fichier en le cryptant"+nl$
    s$ = s$ + "- extraire un fichier en le décryptant"+nl$
    s$ = s$ + "- intégrer un fichier sans le crypter"+nl$
    s$ = s$ + "- détacher un fichier sans le décrypter"+nl$
    s$ = s$ + "- détruire un fichier de façon sécurisée"+nl$
    caption no%,s$

  return
 
' *** toutes les initialisations du programme
initialisations:
' répertoire de l'application, nom du fichier ini
  s$ = param_value$(0)
  nom_rep$ = file_extract_path$(s$)
  if instr(lower$(s$),"\temp\")>0 then nom_rep$ = "C:\temp\"
  nom_ini$ = nom_rep$ + "archivage.ini" : ' adapter le nom du fichier ini
  dir_dialog no_open%,nom_rep$
  dir_dialog no_save%,nom_rep$
  if dir_exists(nom_rep$)=0 then dir_make nom_rep$
  if file_exists(nom_ini$)=0 : ' créer le fichier ini vide s'il n'existe pas
    file_open_write 1,nom_ini$
    file_writeln 1,"; créé le "+date$+" à "+time$+" heures"
    s$ = ""
    s$ = "A"+"d"+"m"+"i"+"n"
    gosub coder_interne
    file_writeln 1,"MotDePasse="+s1$
    file_writeln 1,"TailleDeBloc=1024"
    file_writeln 1,"LimiteCryptage=4096"
    file_writeln 1,"Debug=0"
    file_writeln 1,"CryptageDLL=0"
    file_writeln 1,"CryptageRenforcé=0"
    file_close 1
  end_if
  text no_options%+3,"1024"
  text no_options%+4,"4096"
 
  mark_off no_options%+5
  mark_off no_options%+6
  mark_off no_options%+7
' traiter le fichier ini
  file_open_read 1,nom_ini$
  file_readln 1,s$
  while file_eof(1)=0
    file_readln 1,s$
    if left$(s$,11)="MotDePasse="
      s1$ = mid$(s$,12,len(s$))
      gosub decoder_interne
      mot_de_passe$ = s$
      text no_options%+1,mot_de_passe$
      text no_options%+2,mot_de_passe$
    end_if
    if left$(s$,13)="TailleDeBloc="
      blocsiz% = val(mid$(s$,14,len(s$)))
      text no_options%+3,str$(blocsiz%)
    end_if
    if left$(s$,15)="LimiteCryptage="
      limite_crypt% = val(mid$(s$,16,len(s$)))
      text no_options%+4,str$(limite_crypt%)
    end_if
    if left$(s$,6)="Debug="
      debug% = val(mid$(s$,7,len(s$)))
      if debug%=1
        mark_on no_options%+5
      else
        mark_off no_options%+5
      end_if
      if debug%=1
        width 0,850
        show no_dlist_rep%
      else
        hide no_dlist_rep%
        width 0,350
      end_if
    end_if
    if left$(s$,12)="CryptageDLL="
      dll% = val(mid$(s$,13,len(s$)))
      if dll%=1
        mark_on no_options%+6
      else
        mark_off no_options%+6
      end_if
    end_if
    if left$(s$,17)="CryptageRenforcé="
      cryptage_renforce% = val(mid$(s$,18,len(s$)))
      if dll%=1
        mark_on no_options%+7
      else
        mark_off no_options%+7
      end_if
    end_if
' charger le fichier ini
  end_while
  file_close 1
  i% = 0
  if dll%=1
    dll_on crypto_dll$
    dll_off
  end_if
  if lower$(param_value$(1))="/shredder"
    caption 0,"Destruction sécurisée"
    hide 0
    goto destroy
  end_if
  inactive 0
  caption no_pwd%,"Mot de passe du programme"
  flag_pwd% = 1
  show no_pwd%
  return
 
' *** coder la chaîne dans s$ en fonction de l'algorithme interne dans s1$
coder_interne:
  nc% = len(s$)
  jc% = 0
  s1$ = ""
  for ic%=1 to nc%
    cc% = asc(mid$(s$,ic%,1))
    jc% = jc% + 1
    if jc%>4 then jc% = 1
    cc% = bin_xor(cc%,mask%(jc%))
    s1$ = s1$ + right$("0"+hex$(cc%),2)
  next ic%
  return

' *** décoder la chaine hexa dans s1$ vers une chaîne interne dans s$
decoder_interne:
  nc% = len(s1$)
  jc% = 0
  s$ = ""
  for ic%=1 to nc% step 2
    cc% = hex(mid$(s1$,ic%,2))
    jc% = jc% + 1
    if jc%>4 then jc% = 1
    cc% = bin_xor(cc%,mask%(jc%))
    s$ = s$ + chr$(cc%)
  next ic%
  return
 
' *** coder la chaîne dans s$ en fonction du mot de passe dans s1$
coder_special:
  nc% = len(s$)
  np% = len(mot_de_passe$)
  jc% = 0
  s1$ = ""
  for ic%=1 to nc%
    cc% = asc(mid$(s$,ic%,1))
    jc% = jc% + 1
    if jc%>np% then jc% = 1
    cc% = bin_xor(cc%,asc(mid$(mot_de_passe$,jc%,1)))
    s1$ = s1$ + chr$(cc%)
  next ic%
  return

' *** décoder la chaine hexa dans s1$ par mot de passe dans s$
decoder_special:
  nc% = len(s1$)
if i%=81 then message "special: nc%="+str$(nc%)
  np% = len(mot_de_passe$)
  jc% = 0
  s$ = ""
  for ic%=1 to nc%
    cc% = asc(mid$(s1$,ic%,1))
if i%=81 then item_add no_list_xxx%,"ic%="+str$(ic%)+" cc%="+str$(cc%)
    jc% = jc% + 1
    if jc%>np% then jc% = 1
    cc% = bin_xor(cc%,asc(mid$(mot_de_passe$,jc%,1)))
    s$ = s$ + chr$(cc%)
if i%=81 then item_add no_list_xxx%,"==> len(s$)="+str$(len(s$))+" cc%="+str$(cc%)
  next ic%
if i%=81 then message "len(s$)="+str$(len(s$))
  return

' *** décoder le tableau buffeur%
decoder_interne_block:
  nc% = crypter_n%
  jc% = 0
  for ic%=1 to nc% step 2
    jc% = jc% + 1
    if jc%>4 then jc% = 1
    buffeur%(ic%) = bin_xor(buffeur%(ic%),mask%(jc%))
  next ic%
  return

' *** décoder le tableau buffeur% par mot de passe
decoder_special_block:
  nc% = crypter_n%
  np% = len(mot_de_passe$)
  kc% = 0
  for ic%=1 to nc%
    kc% = kc% + 1
    if kc%>np% then kc% = 1
    buffeur%(ic%) = bin_xor(buffeur%(ic%),mot_de_passe%(kc%))
  next ic%
  return
 
' *** décoder le tableau buffeur% par mot de passe
decoder_block:
  nc% = crypter_n%
  np% = len(mot_de_passe$)
  jc% = 0
  kc% = 0
  for ic%=1 to nc%
    jc% = jc% + 1
    if jc%>4 then jc% = 1
    kc% = kc% + 1
    if kc%>np% then kc% = 1
    buffeur%(ic%) = bin_xor(bin_xor(buffeur%(ic%),mask%(jc%)),mot_de_passe%(kc%))
  next ic%
  return

' *** convertir le mot de passe de string en tableau entier
convert_pwd:
  for ic%=1 to len(mot_de_passe$)
    mot_de_passe%(ic%) = asc(mid$(mot_de_passe$,ic%,1))
  next ic%
  return

' *** fonction "nouveau fichier"
new:
clsx:
  flag_auto% = 1
  if flag_modif%=1 then gosub svg
  flag_auto% = 0
  if flag_present%=1
    gosub effacer
    flag_present% = 0
    flag_modif% = 0
  end_if
  inactive 0
  caption no_pwd%,"Mot de passe de l'archive"
  flag_pwd% = 2
  text no_pwd%+1,""
  show no_pwd%
  return

' *** fonction "ouvrir un fichier existant"
opn:
  s$ = file_name$(no_open%)
  if s$="_" then return
  gosub effacer
  inactive 0
  caption no_pwd%,"Mot de passe de l'archive"
  flag_pwd% = 3
  text no_pwd%+1,""
  show no_pwd%
  return

' *** fonction "sauvegarder le fichier"
svg:
  if nom_fichier$=""
    message "Aucun nom de fichier connu pour cette archive"
    return
  end_if
  if flag_auto%=0
    if file_exists(nom_fichier$)=1
      if message_confirmation_yes_no("Ce fichier existe déjà."+nl$+"Voulez-vous le remplacer ?")<>1 then return
    end_if
  end_if
    filebin_open_write 1,nom_fichier$
    num% = 44
    if count(no_list_rep%)>0
      for i%=1 to count(no_list_rep%)
        num% = num% + 4 + len(item_read$(no_list_rep%,i%))
      next i%
    end_if
    gosub IntToStr
    s$ = entete$ + s1$
    s1$ = zero$
    if count(no_list_rep%)>0
      num% = 40
      gosub IntToStr
    end_if
    s$ = s$ + s1$
    gosub coder_special
    s$ = s1$
    gosub coder_interne
    filebin_hexa_write 1,40,s1$
    if count(no_list_rep%)>0
      for i%=1 to count(no_list_rep%)
        num% = len(item_read$(no_list_rep%,i%)) : ' mémoriser le nom d'origine
        gosub IntToStr
        s$ = s1$
        gosub coder_special
        s$ = s1$
        gosub coder_interne
        filebin_hexa_write 1,4,s1$
        s$ = item_read$(no_list_rep%,i%)
        gosub coder_special
        s$ = s1$
        gosub coder_interne
        filebin_hexa_write 1,len(s1$)/2,s1$
        s1$ = item_read$(no_dlist_rep%,i%)
        nom_crypte$ = mid$(s1$,instr(s1$,";")+1,len(s1$))
        num% = len(nom_crypte$) : ' mémoriser le nom crypté
        gosub IntToStr
        s$ = s1$
        gosub coder_special
        s$ = s1$
        gosub coder_interne
        filebin_hexa_write 1,4,s1$
        s$ = nom_crypte$
        gosub coder_special
        s$ = s1$
        gosub coder_interne
        filebin_hexa_write 1,len(s1$)/2,s1$
      next i%
    end_if
    s$ = zero$
    gosub coder_special
    s$ = s1$
    gosub coder_interne
    filebin_hexa_write 1,4,s1$
    filebin_close 1
  return

' *** fonction "sauvegarder le fichier sous un autre nom"
svx:
  s$ = file_name$(no_save%)
  if s$="_" then return
  if instr(right$(s$,5),".")=0 then s$ = s$ + ".txt"
  nom_fichier$ = s$
  caption 0,file_extract_name$(nom_fichier$)
  gosub svg
  return
 
' *** fonction "sortir du programme"
sortir:
  terminate
 
' *** fonction "ajouter un fichier" (le fichier sera crypté)
ajouter:
  s$ = file_name$(no_open_data%)
  if s$="_" then return
  nom_clair$ = s$
  flag_modif% = 1
  item_add no_list_rep%,nom_clair$
  gosub nouveau_nom
  item_add no_dlist_rep%,nom_clair$+";"+nom_crypte$
  flag_ajouter% = 1
  gosub crypter : ' crypter ce fichier
  flag_ajouter% = 0
  file_rename nom_clair$,nom_crypte$
  wait 50
'  file_hide nom_crypte$                                                                  message "Le fichier a été crypté !"+nl$+"Début: "+time1$+"  Fin: "+time2$
  return
 
' *** fonction "extraire un fichier" (le fichier sera décrypté)
extraire:
  if item_index(no_list_rep%)=0 then return
  s$ = "Voulez-vous vraiment extraire le fichier:"+nl$
  s$ = s$ + item_index$(no_list_rep%)
  if message_confirmation_yes_no(s$)=1
    flag_modif% = 1
    nom_clair$ = item_index$(no_list_rep%)
    s$ = item_read$(no_dlist_rep%,item_index(no_list_rep%))
    nom_crypte$ = mid$(s$,instr(s$,";")+1,len(s$))
    file_rename nom_crypte$,nom_clair$
    wait 50
    file_hide_off nom_clair$
    s$ = nom_clair$
    gosub decrypter : ' decrypter ce fichier
    item_delete no_dlist_rep%,item_index(no_list_rep%)
    item_delete no_list_rep%,item_index(no_list_rep%)
    message "Le fichier a été décrypté !"+nl$+"Début: "+time1$+"  Fin: "+time2$
  end_if
  return

' *** fonction "integrer un fichier" (le fichier sera laissé inchangé)
integrer:
  s$ = file_name$(no_open_data%)
  if s$="_" then return
  flag_modif% = 1
  item_add no_list_rep%,s$
  gosub nouveau_nom
  file_rename s$,nom_crypte$
  wait 50
  file_hide nom_crypte$
  item_add no_dlist_rep%,s$+";"+nom_crypte$
  message "Le fichier n'a PAS été crypté !"
  return

' *** fonction "détacher un fichier" (le fichier sera laissé inchangé)
detacher:
  if item_index(no_list_rep%)=0 then return
  s$ = "Voulez-vous vraiment détacher le fichier:"+nl$
  s$ = s$ + item_index$(no_list_rep%)
  if message_confirmation_yes_no(s$)=1
    flag_modif% = 1
    nom_clair$ = item_index$(no_list_rep%)
    s$ = item_read$(no_dlist_rep%,item_index(no_list_rep%))
    nom_crypte$ = mid$(s$,instr(s$,";")+1,len(s$))
    file_rename nom_crypte$,nom_clair$
    wait 50
    file_hide_off nom_clair$
    item_delete no_dlist_rep%,item_index(no_list_rep%)
    item_delete no_list_rep%,item_index(no_list_rep%)
    message "Le fichier n'a PAS été décrypté !"
  end_if
  return

' *** afficher la page d'aide en mode non-modal
aide:
  show no_aide%
  to_foreground no_aide%
  return

' *** afficher la page à-propos en mode modal
apropos:
  inactive 0
  show no_apropos%
  return
 
' *** fermer la page a-propos
close_apropos:
  hide no_apropos%
  active 0
  to_foreground 0
  return

' *** adapter les menus si effacement
effacer:
  flag_present% = 0
  flag_modif% = 0
  clear no_list_rep%
  clear no_dlist_rep%
  gosub gerer_menu
  return

' *** adapter les menus en fonction de la situation
gerer_menu:
  if flag_present%=1
    if n_obj_si_present% >0
      for i%=1 to n_obj_si_present%
        active no_obj_si_present%(i%)
      next i%
    end_if
  else
    if n_obj_si_present% >0
      for i%=1 to n_obj_si_present%
        inactive no_obj_si_present%(i%)
      next i%
    end_if
  end_if
  if flag_modif%=1
    if n_obj_si_modif% >0
      for i%=1 to n_obj_si_modif%
        active no_obj_si_modif%(i%)
      next i%
    end_if
  else
    if n_obj_si_modif% >0
      for i%=1 to n_obj_si_modif%
        inactive no_obj_si_modif%(i%)
      next i%
    end_if
  end_if
  return

' *** montrer la page de gestion des options en mode modal
options:
  inactive 0 : show no_options%
  return

' *** fermer la page des options
close_options:
  hide no_options%
  s$ = text$(no_options%+1)
  i% = 1
  if len(s$)>0
    if s$<>text$(no_options%+2)
      message "Erreur en saisie du mot de passe !"
      text no_options%+1,""
      text no_options%+2,""
      i% = 0
    end_if
  end_if
  if numeric(text$(no_options%+3))=0
    message "Erreur en saisie de la taille du bloc !"
    i% = 0
  else
    j% = val(text$(no_options%+3))
    if (j%<128) or (j%>4096)
      message "Erreur en saisie de la taille du bloc !"
      i% = 0
    end_if
  end_if
  if numeric(text$(no_options%+4))=0
    message "Erreur en saisie de la limite de cryptage !"
    i% = 0
  end_if
  if i%=1
    active no_val_options%
    blocsiz% = val(text$(no_options%+3))
    limite_crypt% = val(text$(no_options%+4))
  end_if
  debug% = checked(no_options%+5)
  if debug%=1
    width 0,850
    show no_dlist_rep%
  else
    hide no_dlist_rep%
    width 0,350
  end_if
  dll% = checked(no_options%+6)
  cryptage_renforce% = checked(no_options%+7)
  active 0
  to_foreground 0
  return

' *** modèle de gestion d'un clic dans un GRID
'    avec affichage de la fenêtre de saisie en mode modal
click_grille:
  x% = mouse_x_left_down(no_grille%)
  y% = mouse_y_left_down(no_grille%)
  col% = grid_x_to_column(no_grille%,x%)
  lig% = grid_y_to_row(no_grille%,y%)
' ici gérer la case cliquée
  caption no_modif%,"Saisie"
  inactive 0
  show no_modif%
  return
 
' *** fermeture de la fenêtre de saisie
close_saisie:
  s$ = text$(no_modif%+1)
' ici, gérer la nouvelle valeur présente dans s$
  flag_modif% = 1
  flag_present% = 1
  gosub gerer_menu
  hide no_modif%
  active 0
  to_foreground 0
  return

' *** enregistrer les options modifiées
val_options:
  file_open_write 1,nom_ini$
  file_writeln 1,"; créé le "+date$+" à "+time$+" heures"
' écrire les options dans le fichier ini
  s$ = text$(no_options%+1)
  gosub coder_interne
  file_writeln 1,"MotDePasse="+s1$
  file_writeln 1,"TailleDeBloc="+str$(blocsiz%)
  file_writeln 1,"LimiteCryptage="+str$(limite_crypt%)
  file_writeln 1,"Debug="+str$(debug%)
  file_writeln 1,"CryptageDLL="+str$(dll%)
  file_writeln 1,"CryptageRenforcé="+str$(cryptage_renforce%)
  file_close 1
  inactive no_val_options%
  return
 
' *** fermeture de la page de mot de passe
close_pwd:
  i% = i% + 1
  pwd$ = text$(no_pwd%+1)
  if flag_pwd%=1  : ' mode "programme"
    if pwd$=mot_de_passe$
      active 0
      to_foreground 0
      return
    end_if
    if i%>3 then terminate
  end_if
  if flag_pwd%=2
    if len(pwd$)<6
      message "Le mot de passe doit avoir au moins 6 caractères !"
      text no_pwd%+1,""
      timer_on no_timer_pwd%
      return
    end_if
    s1$ = file_name$(no_save%)
    if s1$="_"
      active 0
      to_foreground 0
      return
    end_if
    if instr(right$(s1$,5),".")=0 then s1$ = s1$ + ".dat"
    nom_fichier$ = s1$
    caption 0,file_extract_name$(nom_fichier$)
    if file_exists(nom_fichier$)=1
      s$ = "ce fichier existe déjà !"+nl$+"Voulez-vous vraiment le remplacer ?"
      if message_confirmation_yes_no(s$)<>1
        active 0
        to_foreground 0
        return
      end_if
    end_if
    mot_de_passe$ = pwd$
    filebin_open_write 1,nom_fichier$
    num% = 44
    gosub IntToStr
    s$ = entete$ + s1$ + zero$
    gosub coder_special
    s$ = s1$
    gosub coder_interne
    filebin_hexa_write 1,40,s1$
    s$ = zero$
    gosub coder_special
    s$ = s1$
    gosub coder_interne
    filebin_hexa_write 1,4,s1$
    filebin_close 1
    flag_present% = 1
    gosub gerer_menu
    active 0
    to_foreground 0
    return
  end_if
  if flag_pwd%=3
    nom_fichier$ = s$
    caption 0,file_extract_name$(nom_fichier$)
    filebin_open_read 1,nom_fichier$
    filebin_hexa_read 1,40,s1$ : ' lire l'entête
    mot_de_passe$ = pwd$
    gosub decoder_interne
    s1$ = s$
    gosub decoder_special
    if left$(s$,32)<>entete$
      filebin_close 1
      s$ = "Ce fichier n'est pas une archive valide"+nl$
      s$ = s$ + "ou le mot de passe est invalide !"
      message s$
      text no_pwd%+1,""
      mot_de_passe$ = ""
      active 0
      to_foreground 0
      return
    end_if
    s1$ = mid$(s$,33,4)
    gosub StrToInt
    taille_archive% = num%
    s1$ = mid$(s$,37,4)
    gosub StrToInt
    debut_repertoire% = num%
    gosub charger_repertoire
    filebin_close 1
    flag_present% = 1
    gosub gerer_menu
    active 0
    to_foreground 0
    return
  end_if
  timer_on no_timer_pwd%
  return
timer_pwd:
  timer_off no_timer_pwd%
  to_foreground 0
  show no_pwd%
  to_foreground no_pwd%
  return

' ***conversion d'un entier en chaîne de 4 caractères
IntToStr:
  s1$ = right$("0000000"+hex$(num%),8)
  s1$ = chr$(hex(mid$(s1$,1,2)))+chr$(hex(mid$(s1$,3,2)))+chr$(hex(mid$(s1$,5,2)))+chr$(hex(mid$(s1$,7,2)))
  return
 
' *** convertion d'une chaîne de 4 caractères en entier
StrToInt:
  s1$ = hex$(asc(mid$(s1$,1,1)))+hex$(asc(mid$(s1$,2,1)))+hex$(asc(mid$(s1$,3,1)))+hex$(asc(mid$(s1$,4,1)))
  num% = hex(s1$)
  return

' *** charger la list et dlist par le répertoire
charger_repertoire:
  filebin_position 1,40      : ' position du premier bloc répertoire
  filebin_hexa_read 1,4,s1$
  gosub decoder_interne
  s1$ = s$
  gosub decoder_special
  s1$ = s$
  gosub StrToInt
  while num%<>0          : ' tant qu'on a un bloc répertoire:
    filebin_hexa_read 1,num%,s1$    : ' lire le nom d'origine du fichier
    gosub decoder_interne
    s1$ = s$
    gosub decoder_special
    item_add no_list_rep%,s$        : ' mémoriser
    nom_clair$ = s$
    filebin_hexa_read 1,4,s1$      : ' lire la longueur du bloc suivant
    gosub decoder_interne
    s1$ = s$
    gosub decoder_special
    s1$ = s$
    gosub StrToInt
    filebin_hexa_read 1,num%,s1$    : ' lire le nom crypté du fichier
    gosub decoder_interne
    s1$ = s$
    gosub decoder_special
    item_add no_dlist_rep%,nom_clair$+";"+s$    : ' mémoriser
    filebin_hexa_read 1,4,s1$      : ' lire la longueur du bloc suivant
    gosub decoder_interne
    s1$ = s$
    gosub decoder_special
    s1$ = s$
    gosub StrToInt
  end_while
  return
 
' *** destruction sécurisée d'un fichier
destroy:
  s$ = file_name$(no_open_data%)
  if s$="_" then return
  if message_confirmation_yes_no("Voulez-vous vraiment supprimer le fichier"+nl$+s$+"  ?")=1
    inactive 0
    time1$ = time$
    nom_clair$ = s$
    gosub nouveau_nom
    file_rename nom_clair$,nom_crypte$
    wait 50
    dll_on crypto_dll$
    i% = dll_call1("effacer",adr(nom_crypte$))
    dll_off
    time2$ = time$
    message "Le fichier a été effacé !"+nl$+"Début: "+time1$+"  Fin: "+time2$
    active 0
  end_if
  if lower$(param_value$(1))="/shredder" then terminate
  return

' *** crypter le fichier dont le nom est en s$
crypter:
  flag% = crypter%
crypter1:
  inactive 0
  time1$ = time$
  if dll%=1
    dll_on crypto_dll$
    j% = flag%*cryptage_renforce%
    i% = dll_call4("crypter",adr(mask$),adr(mot_de_passe$),adr(s$), j%)
    dll_off
  else
    s2$ = s$
    file_rename s2$,s2$+"tmp"
    wait 50
    filebin_open_read 2,s2$+"tmp"
    filsiz% = filebin_size(2)
    nbloc% = int(filsiz%/blocsiz%)
    reste% = filsiz% - nbloc%*blocsiz%
    min no_list_rep%+2,0
    max no_list_rep%+2,filsiz%
    position no_list_rep%+2,0
    caption no_list_rep%+1,"0 %"
    display
    gosub convert_pwd
    filebin_open_write 3,s2$
    if nbloc%>0
      crypter_n% = blocsiz%
      for i%=1 to nbloc%
        position no_list_rep%+2,i%*blocsiz%
        x = i%*blocsiz%/filsiz%
        x = int(x*10000)/100
        caption no_list_rep%+1,str$(x)+" %  "+str$(i%)+"/"+str$(nbloc%)+" blocs"
        display
        filebin_block_read 2,blocsiz%,buffeur%(0)
        if (limite_crypt%=0) or (i%*blocsiz%<=limite_crypt%)
'          gosub decoder_interne_block
'          gosub decoder_special_block
          gosub decoder_block
        end_if
        filebin_block_write 3,blocsiz%,buffeur%(0)
      next i%
    end_if
    if reste%>0
      crypter_n% = reste%
      position no_list_rep%+2,filsiz%
      caption no_list_rep%+1,"100 %"
      display
      filebin_block_read 2,reste%,buffeur%(0)
      if (limite_crypt%=0) or (nbloc%*blocsiz%<=limite_crypt%)
'        gosub decoder_interne_block
'        gosub decoder_special_block
        gosub decoder_block
      end_if
      filebin_block_write 3,reste%,buffeur%(0)
    end_if
    position no_list_rep%+2,0
    caption no_list_rep%+1,""
    filebin_close 3
    filebin_close 2
    if flag_ajouter%=0 then file_delete s2$+"tmp"
  end_if
  time2$ = time$
  active 0
  return
 
' *** décrypter le fichier dont le nom est en s$
decrypter:
  flag% = decrypter%
  gosub crypter1
  return

' *** convertir le string s1$ en string hexa dans s$
StrToHex:
  s$ = ""
  for ic%=1 to len(s1$)
    s$ = s$ + right$("0"+hex$(asc(mid$(s1$,ic%,1))),2)
  next ic%
  return

' *** générer le nouveau nom du fichier
nouveau_nom:
  rep_crypte$ = file_extract_path$(s$)
  repeat
    nom_crypte$ = ""
    for ic%=1 to 15
      jc% = int(rnd(38))+1
      nom_crypte$ = nom_crypte$ + mid$(caracteres$,jc%,1)
    next ic%
    nom_crypte$ = rep_crypte$ + nom_crypte$ + ".fac"
  until file_exists(nom_crypte$)=0
  return

Ce programme peut utiliser une DLL de cryptage nommée crypto.dll. On peut la télécharger ici:
Site: http://www.mydrive.ch/
Identifiant: panoramic@klausgunther
Mot de passe: panoramic123

Pour les besoins des tests, ma DLL est placée dans C:\temp\, mais le chemin est dans une variable et est adaptable (sous-programme "variables").


Dernière édition par Klaus le Mer 28 Mar 2012 - 21:35, édité 6 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyJeu 22 Mar 2012 - 0:42

il y a une virgule manquante dans le source copié (ligne 337 dans initialisation)
file_writeln 1 "LimiteCryptage=4096" => ajouter la virgule avant le "

Au début, dans l'aide, remplacer ' version personnemme par personnelle

Quel est le mot de passe du programme a saisir au démarrage ?


Dernière édition par Jicehel le Jeu 22 Mar 2012 - 0:54, édité 1 fois
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyJeu 22 Mar 2012 - 0:52

Bien vu ! Corrigé dans le premier poste. Merci !


EDIT

Il y a un petit bug avec les grands fichiers - je suis en tgrain de corriger. Patience...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyVen 23 Mar 2012 - 1:32

Bug corrigé. Ca marche maintenant avec de gros fichiers.

Mais, grosse déception: les "performances" sont tellement mauvaises que le programme est inutilisable pour de gros fichiers. C'est acceptable jusqu'à quelques centaines de ko ou à la limite quelques Mo (documents texte, notes, images légères, icônes, sources Panoramic, etc).

Pourtant, dans cette version, j'ai laissé tomber FILEBIN_HEXA_xxx au profit de FILEBIN_BLOCK_xxx en travaillant uniquement dans un tableau d'entiers, au lieu de passer par des chaînes de caractères. En gros, la procédure est la suivante:
- lecture d'un bloc par FILEBIN_BLOCK_READ
- application du mot de passe par BIN_XOR sur le bloc
- application du mot de passe interne par BIN_XOR sur le bloc
- écriture du bloc traité para FILEBIN_BLOCK_WRITE.
Mais c'est très lent. Je vais tenter d'optimiser mes traitements, en particulier en fusionnant les deux passages de cryptage en un seul.

Donc: opérationnel dans toutes ses fonctions, mais peut mieux faire au niveau des performances !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

Une archive cryptée Empty
MessageSujet: +++   Une archive cryptée EmptyVen 23 Mar 2012 - 19:46

Ca semble intéressant, mais comment peut-on s'en servir ?
Alors, on un grand tableau et au dessus un petit tableau
marqué "Mot de passe du programme"
on écrit un mot de passe dans la fenêtre de ce petit tableau
et après ???????????????????????????????????
Appuyer sur Entrée ou sur Echap ne mène à rien,
comment sortir de ce petit tableau ?????????????????
scratch scratch scratch
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyVen 23 Mar 2012 - 22:07

Le programme est sécurisé lui-même par un mot de passe "maître" sans lequel on ne peut pas y entrer. Au démarrage, ou après la suppression du fichier ini, le programme recrée un fichier ini avec les options par défaut, dont le mot de passe maître qui est Admin (tel quel, avec le A majuscule et le reste en minuscule). Dans le menu Fichiers fonction Options, on peut changer ce mot de passe en n'importe quoi - tout caractère acceptable dans un EDIT peut être utilisé, et cela peut être long... Il faut confirmer ce mot de passe pour éviter les faites de frappe, et ne pas oublier, après être sortie de la fenêtre des options, d'appeler la fonction Valider les options dans le menu Fichiers (cette option s'active lorsqu'un a fait une modification dans les options).

Une dernière info: les différentes fenêtres de saisie ne comportent aucun bouton de validation ni d'abandon - on sort simplement en les fermant pas la croix, et le programme fait derrière ce qu'il faut.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyVen 23 Mar 2012 - 22:21

Nouvelle version, avec une optimisation de la phase de cryptage du fichier. Les deux passages de cryptage one été fucsionnés en un seul, et le coeur du traitement de fait sur une seule ligne
Code:
    buffeur%(ic%) = bin_xor(bin_xor(buffeur%(ic%),mask%(jc%)),mot_de_passe%(kc%))
dans le sous-programme decoder_block. C'est plus cohérent, mais au niveau des performances, c'est toujours décevant (de l'ordre de 48 minutes pour un fichier de 7,5 Mo !). Je pense que le problème vient de la fonction BIN_XOR, mais je vais approfondir cela.

Juste pour info: j'ai amélioré les messages de progression, ainsi que le message de fin.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

Une archive cryptée Empty
MessageSujet: +++   Une archive cryptée EmptySam 24 Mar 2012 - 17:30

Ah, merci, là ça marche.
Eh, c'est pas mal du tout !
Évidement, c'est vrai que c 'est un peu long,
mais panoramic n'est pas follement rapide.
jocolor alien jocolor
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptySam 24 Mar 2012 - 19:35

As-tu vu que le mot de passe d'accès au programme est dans le fichier ini, mais crypté ?

Et tu peux toujours lancer un outil de casse des mots de passe, en mode "brute force" - il ne trouvera pas, j'en suis certain.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptySam 24 Mar 2012 - 22:06

Youpiiiiiiiiiiiiiiiii !

J'ai résolu le problème des performances, et ce de façon si spectaculaire que j'ai du passer en mode debug de ma boucle pour m'assurer que je ne rêvais pas ! Pour un fichier de 7,5 Mo, je passe de 48 minutes à 1 seconde ! Oui, c'est bien 1 seconde ! Le secret ? Le cryptage du fichier est fait par une DLL en Delphi qui reproduit EXACTEMENT de cryptage que je fais en Panoramic ! J'ai ajouté un paramètre dans la page des options pour activer ou non le cryptage par DLL. Par défaut, c'est le cryptage par Panoramic.

Le premier post est mis à jour avec le programme Panoramic adapté à cette trouvaille, et il contient aussi les indications comment télécharger cette DLL.

Maintenant, c'est parfaitement exploitable, même pour des dizaines de très gros fichiers !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Invité
Invité




Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyDim 25 Mar 2012 - 0:11

Et bien je dis chapeau!

J'ai moi même fait un programme de criptage (différent du tien, et pratiquement impossible à décoder) pour mes mots de passe.
Et si je veux cripter du texte, c'est aussi très long, avec l'instruction BIN_X_OR().
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyDim 25 Mar 2012 - 0:42

Pour les amateurs, voici le code source de la DLL crypto.dll. C'est très court !
Code:
library Crypto;


uses
  SysUtils,
  Dialogs,
  Classes;

{$R *.res}

function crypter(pwd1,pwd2,fic: pchar): integer; stdcall; export;
var
  pass1, pass2, fichier: string;
  canal: File;
  buffer: array[1..4096] of Char;
  nlu, i, x, p1, p2: integer;
begin
  pass1 := pchar(pstring(pwd1)^);
  pass2 := pchar(pstring(pwd2)^);
  fichier := pchar(pstring(fic)^);

  AssignFile(canal,fichier);
  Reset(canal, 1);
  repeat
    x := FilePos(canal);
    BlockRead(canal,buffer,4096,nlu);
    p1 := 0;
    p2 := 0;
    for i:=1 to 4096 do begin
      p1 := p1 + 1;
      if p1>length(pass1) then p1 := 1;
      p2 := p2 + 1;
      if p2>length(pass2) then p2 := 1;
      buffer[i] := chr(ord(buffer[i]) xor ord(pass1[p1]) xor ord(pass2[p2]));
    end;
    Seek(canal,x);
    BlockWrite(canal,buffer,nlu);
  until nlu<4096;
  CloseFile(canal);
  result := 0;
end;

exports
  crypter;

begin
end.

Je viens de crypter un fichier de 90 Mo - c'est fait en 5 secondes !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyDim 25 Mar 2012 - 3:33

Nouvelle version. Le menu Fichiers a une fonction supplémentaire:
Destruction sécurisée d'un fichier

Cette fonction utilise impérativement la dll crypto.dll pour supprimer le fichier après avoir renommé le fichier de façon aléatoire, puis entièrement remplacé ses données à 9 reprises, avec des speudo_données, en terminant par des chr$(0) partout. Cette fonction est indépendante d'une archive - elle est accessible même si aucune archive n'est ouverte.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyMer 28 Mar 2012 - 21:42

Nouvelle version:

1. La fonction de destruction sécurisée est maintenant accessible SANS mot de passe ! Il faut pour cela créer un EXE à partir du source, et lancer le programme en mode ligne de commande (par EXECUTE, EXECUTE_WAIT ou par un raccourci sur le bureau) avec un paramètre /shredder (insensible à la casse).

2. J'ai ajouté une option "Cryptage renforcé". Cela n'a d'effet qu'en utilisant l'option "Cryptage par" DLL". Et dans ce cas, il y a un cryptage supplémentaire, transparent pour l'utilisateur du programme ARCHIVAGE.BAS, mais cela rend le fichier totalement impossible à décrypter sans posséder la DLL crypto.dll et sans savoir comment l'utiliser. C'est basé sur un mélange de bits entre caractères avant le cryptage par les deux mots de passe, et la restitution des bits de chaque caractère après décryptage.

Et, comme dit dans le post précédent, le programme avec l'option DLL est ultra-rapide !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Invité
Invité




Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptyJeu 29 Mar 2012 - 19:48

Ton archive cryptée m'intéresse. Je la regarderai de près quand j'aurai fini mes programmes en cours.
Merci pour ton travail.
Revenir en haut Aller en bas
Severin




Nombre de messages : 547
Localisation : Braunschweig / Germany
Date d'inscription : 13/12/2010

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptySam 31 Mar 2012 - 14:31

@ Klaus

Code:
Dies ist eine schöne Sache.

Ich habe schon seit langer Zeit über das Veschlüsseln nachgedacht. Wenn man Dateien im Textmodus abspeichert
kann ein Nutzer diese manipulieren. Warum auch immer.

Ich bin auf folgende Idee gekommen:

Es wird nur die erstellte Datei verschlüsselt und in das Arbeitsverzeichnis geschrieben.
Das Passwort kann im Programm festgeschrieben werden, oder durch Kennwort Eingabe bei Programmstart zugeordnet werden.
Wenn ein Masterkennwort eingegeben wird, schreiben wir verschlüsselt und unverschlüsselt in verschiedene Verzeichnisse.
Also eine Kombination von Master- und Nutzerkennwort. Damit ist die Originaldatei immer verfügbar.

Darstellung:
'
Master:  Severin
Nutzer: Klaus
***************************************************************
Eingabe:
Severin+Klaus
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis --> Kennwort "Klaus"
Ausgabe: Datei "Panoramic" --> unverschlüsselt im Mastersverzeichnis --> wegen Masterkennwort "Severin"
***************************************************************
Eingabe:
Severin
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis --> Kennwort "Klaus"
Ausgabe: Datei "Panoramic" --> unverschlüsselt im Mastersverzeichnis --> wegen Masterkennwort "Severin"
***************************************************************
Eingabe:
Klaus
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis --> Kennwort "Klaus"
***************************************************************
Vorteil:
lesbare Datei
Master kann Originaldatei löschen
'
Nachteil:
???
***************************************************************
Eingelesen wird immer die verschlüsselte Datei --> Kennwort "Klaus"

Soweit meine Überlegungen. Nun meine Bitte.

Kannst du dein Archivprogramm so umgestallten, das dies möglich ist.
Mir reicht eine minimale Ausführung. Dein Archivprogramm umzuschreiben ist sehr aufwendig. "Sprachprobleme"
Möglichs mit deiner DLL. Damit sollte beim Speichern kein Zeitverlusst eintreten.

Mir ist bewusst, das ist eine unverschämte Bitte.  :oops:  Wenn ja, lass dir Zeit.

Severin


Code:
C'est une belle chose.

J'ai pensé pendant longtemps au cours de la Veschlüsseln. Si elle enregistre les fichiers en mode texte
un utilisateur peut manipuler. Pour une raison quelconque.

Je suis venu à l'idée suivante:

Ce n'est que le fichier crypté qui est créée et écrite dans le répertoire de travail.
Le mot de passe peut être inscrite dans le programme, ou un mot de passe pour être affecté au démarrage.
Si un mot de passe maître est entré, nous écrivons cryptés et non cryptés dans des répertoires différents.
Ainsi, une combinaison du maître et de mot de passe utilisateur. Ainsi, le fichier original est toujours disponible.

Représentation:
»
Maître: Severin
Utilisateur: Klaus
************************************************** *************
Entrée:
Klaus Severin +
»
Problème: Fichier "panoramique" -> crypté dans le répertoire utilisateur -> Mot de passe "Klaus"
Problème: Fichier "panoramique" -> en clair dans le répertoire du maître -> Mot de passe principal pour "Severin"
************************************************** *************
Entrée:
Severin
»
Problème: Fichier "panoramique" -> crypté dans le répertoire utilisateur -> Mot de passe "Klaus"
Problème: Fichier "panoramique" -> en clair dans le répertoire du maître -> Mot de passe principal pour "Severin"
************************************************** *************
Entrée:
Klaus
»
Problème: Fichier "panoramique" -> crypté dans le répertoire utilisateur -> Mot de passe "Klaus"
************************************************** *************
Avantage:
fichier lisible
Master peut supprimer le fichier original
»
Inconvénient:
?
************************************************** *************
Lecture sera toujours le fichier crypté -> Mot de passe "Klaus"

En ce qui concerne mes pensées. Maintenant ma demande.

Pouvez-vous archiver votre programme afin umgestallten que cela est possible.
Me tend un minimum d'exécution. Réécrivez votre programme d'archivage est très coûteux. "Les problèmes de langue"
Möglichs avec votre DLL. Cela ne devrait pas se produire lors de l'enregistrement Zeitverlusst.

Je sais que c'est une demande scandaleuse.  :oops:  Si oui, prenez votre temps.

Severin
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptySam 31 Mar 2012 - 18:16

Ich werde mir das überlegen. Allerdings habe ich Bedenken, eine verschlüsselte Datei euch noch im Klartext zu speichern - damit ist das Verschlüsseln letztendlich nutzlos, selbst wenn die Klartextdatei in einem anderen Verzeichnis untergebracht wird. Sollte jemand Zugang zu Deinem Computer haben, findet et mit Sicherheit den Klartext. Aus diesem Grunde überschreibe ich die zu verschlusselnde Datei mit den unlesbaren Werten - damit ist der Klartext automatisch gelöscht.

Noch ein par Informationen mehr:
- das programm hat ein Master-Passwort, dass man in des Optionen-Seite ändern kann. Bei Programmstart ist est "Admin" (genau so mit Gross- und Kleinschreibung). Da kannst Du eisetzen, was Du willst, aber besser nicht Deinen Namen ouder ein kurzes Wort - eher eine Folge fon Gross- und Kleinbuchstaben, Ziffern und Sonderzeichen. Dieses Passwort wird verschlüsselt in der INI-Datei abgelmegt.
- um ein neues Archiv anzulegen, muss man dann ein anderes Passwort angeben. Auch hier gelten die gleichen Regeln: keinen Zusammenhang mit persönlichen Angaben wie Namen, Daten usw, m¨glichst längerer Text mig Sonderzeichen oder ganze Sätze, usw. Dieses Password wird dann gebraucht, um das Archiv wieder zu öffnen. Es wird aber in keinem Fall im Archiv aufgezeichnet. Sowie die Arbeit mit einem Archiv zu Ende ist, ist das Password einfach "vergessen" und es gibt keinen Weg, es zu rekonstruieren. Man muss es einfach wissen. Jede Datei in einem Archiv wird mit dem selben Passwort verschlüsselt, man muss allerdings darauf achten, alle Dateien möglichst mit den gleichen Optionen zu verschlüsseln (sie Optionen-Seite), da sonst ein Entschlüsseln sehr problematisch wird.
- man kann selbstverständlich so viele Archive anlegen wie benötigt. Jedes Archiv hat sein eigenes Passwort, unabhängig von den anderen Archiven. Et gibt bewusst keine Liste des Archive, und ich rate dazu, dir Archive nicht alle in den gleichen Ordner zu tun - dies ist zu augenfällig. Aus dem gleichen Grund rate ich dringend davon ab, die zu verschlüsselnden Dateien in einem Verzeichnis zu gruppieren. Sie sollten an ihrem gewöhnlichen Platz bleiben und dort verschlüsselt werden. Sie werden dann nach Verschlüsselung zu etwas Unlesbarem umbenannt und bekommen das "unsichtbar" Attribut. All dies ist im Archiv verschlüsselt gespeichert, und so ist est möglich, beim Entschlüsseln die Datei im gleichen Verzeichnis zu lassn, ihr ihren ursprünglichen Namen zurückzugeben und das "unsichtbar" Attribut wieder rückgängig zu machen.
- es kann jede beliebige Datei verschlüsselt werden - Text, Photos, Excel-Documente, Programme, ... Alles was als Datei in einem Verzeichnis zu finden ist.

Kleine Zugabe:
Für besondere Sicherheitsfanatiker kann man ein Archiv anlegen, in dem man alle Archive verschlusselt. Die gleichen Regeln gelten natürlich auch hier. Dies ist möglich, da ein Archif auch nur eind Datei ist und also selbst wier verschlüsselt (man sagt "überschlüsselt) werden kann.

Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Severin




Nombre de messages : 547
Localisation : Braunschweig / Germany
Date d'inscription : 13/12/2010

Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée EmptySam 31 Mar 2012 - 19:09

Erweiterte Erklärung:

Code:
Neue Darstellung

Ich habe schon seit langer Zeit über das Veschlüsseln nachgedacht. Wenn man Dateien im Textmodus abspeichert
kann ein Nutzer diese manipulieren. Warum auch immer.

Ich bin auf folgende Idee gekommen:

Es wird nur die erstellte Datei verschlüsselt und in das Arbeitsverzeichnis geschrieben.
Das Passwort kann im Programm festgeschrieben werden, oder durch Kennwort Eingabe bei Programmstart zugeordnet werden.
Wenn ein Masterkennwort eingegeben wird, schreiben wir verschlüsselt und unverschlüsselt in verschiedene Verzeichnisse.
Also eine Kombination von Master- und Nutzerkennwort. Damit ist die Originaldatei immer verfügbar.
Es gibt wichtige Gründe, das diese Daten nicht verändert werden.

Neue Darstellung wie in meinem Programm:
'
Programmstart ---> Nutzer gibt sein FirmenKennwort --> "1ß263%"
Programmstart ---> Nutzer gibt sein Kennwort --> "a?b!c%"
Programm erkennt Nutzer
Nutzer kann arbeiten
'
Ich habe ein Untermenü für Master, mit Kennwort gesichert
Starten Untermenü von Admin ---> Master gibt sein Kennwort --> "a?dm$in§"
Programm erkennt Admin
Admin kann Daten unverschlüsselt speichern

oder

Programmstart  ---> Master gibt sein Kennwort --> "a?dm$in§"
Programm erkennt Admin
Admin kann Daten unverschlüsselt speichern

Im Programm hinterlegt nicht in INI.Datei:
Textdatei in Panoramic integriert, in EXE

Master:  Severin =  --> "a?dm$in§"
Nutzer: Klaus =  --> "a?b!c%"
***************************************************************
Eingabe:
Severin+Klaus
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis\Daten --> Kennwort --> "a?b!c%"
Ausgabe: Datei "Panoramic" --> unverschlüsselt im Mastersverzeichnis auf Stick\Firma x\Daten --> wegen Masterkennwort--> "a?dm$in§"
***************************************************************
Eingabe:
Severin
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis\Daten --> Kennwort --> "a?b!c%"
Ausgabe: Datei "Panoramic" --> unverschlüsselt im Mastersverzeichnis auf Stick\Firma x\Daten --> wegen Masterkennwort --> "a?dm$in§"
***************************************************************
Eingabe:
Klaus
'
Ausgabe: Datei "Panoramic" --> verschlüsselt im Nutzerverzeichnis\Daten --> Kennwort --> "a?b!c%"
***************************************************************
Vorteil:
lesbare Datei, kann manuell bearbeitet werden
Master kann Originaldatei löschen
'
Nachteil:
???
***************************************************************
Eingelesen wird immer die verschlüsselte Datei --> Kennwort --> "a?b!c%"
Programm erkennt Nutzer

Soweit meine Überlegungen. Nun meine Bitte.

Kannst du dein Archivprogramm so umgestallten, das dies möglich ist.
Mir reicht eine minimale Ausführung. Dein Archivprogramm umzuschreiben ist sehr aufwendig. "Sprachprobleme"
Möglichs mit deiner DLL. Damit sollte beim Speichern kein Zeitverlusst eintreten.

Mir ist bewusst, das ist eine unverschämte Bitte. Wenn ja, lass dir Zeit.

Severin
Revenir en haut Aller en bas
Contenu sponsorisé





Une archive cryptée Empty
MessageSujet: Re: Une archive cryptée   Une archive cryptée Empty

Revenir en haut Aller en bas
 
Une archive cryptée
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Visualiseur de photos dans une archive ZIP

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: