Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Une archive cryptée | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Une archive cryptée Mer 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 | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une archive cryptée Jeu 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 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Jeu 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... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Ven 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 ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 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 ????????????????? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Ven 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. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Ven 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. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 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. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Sam 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. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Sam 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 !
| |
| | | Invité Invité
| Sujet: Re: Une archive cryptée Dim 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(). |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Dim 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 ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Dim 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. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Mer 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 ! | |
| | | Invité Invité
| Sujet: Re: Une archive cryptée Jeu 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. |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: Une archive cryptée Sam 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 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une archive cryptée Sam 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.
| |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: Une archive cryptée Sam 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 | |
| | | Contenu sponsorisé
| Sujet: Re: Une archive cryptée | |
| |
| | | | Une archive cryptée | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |