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 |
|
|
| Cryptage/décryptage d'un fichier quelconque | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Cryptage/décryptage d'un fichier quelconque Mer 14 Avr 2010 - 17:19 | |
| Un moyen simple de crypter un fichier (pas trop long) avec un mot ou une phrase clé. Ça ne résistera sans doute pas au FBI mais au moins c'est simple. - Code:
-
' Cryptage/décryptage d'un fichier texte ou binaire DIM mp$, i, j, v, vc, f$, fc$, fd$, f1$, f2$ LABEL Codbin
mp$ = "MotDePasse": ' Code de cryptage, plus c'est long, mieux c'est f$ = "C:\Textes\Lorem.txt": ' fichier à crypter fc$ = "Z:\Fcod" fd$ = "Z:\Fdec.txt"
PRINT "Codage..." f1$ = f$: f2$ = fc$: GOSUB Codbin PRINT "Décodage..." f1$ = fc$: f2$ = fd$: GOSUB Codbin PRINT "Terminé !" END
Codbin: ' cryptage/décryptage (symétrique) FILEBIN_OPEN_READ 1, f1$: FILEBIN_OPEN_WRITE 2, f2$ j = 1 FOR i = 1 TO FILEBIN_SIZE(1) FILEBIN_READ 1, v vc = BIN_XOR(v, ASC(MID$(mp$, j, 1))) FILEBIN_WRITE 2, vc j = j + 1: IF j > LEN(mp$) THEN j = 1 NEXT i FILEBIN_CLOSE 1: FILEBIN_CLOSE 2 RETURN | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Mer 14 Avr 2010 - 21:43 | |
| Intéressant, ce programme de cryptage. L'algorythme est simple (XOR octet par octet avec une phrase clé), et à moins de connaître la phrase clé, il n'est pas si évident à décrypter - du moins pour le hacker lambda.
J'ai une remarque à faire qui n'a rien à voir avec l'algorythme, mais plutôt avec les techniques de programmation. Si l'on est soucieux du temps d'exécution (et cela s'applique en particulier dans des boucles lentes comme celles lisant dans un fichier binaire), il est utile de déclarer les variables qui ne peuvent recevoir que des valeurs entières, avec le qualificateur % afin de leur donner une identité "integer". C'est particulièrement vrai pour toutes les variables servant de base pour une boucle ou pour un index qui est recalculé à chaque itération.
Je sais, l'effort de saisie est plus important et il ne faut pas oublier le %, mais heureusement, Panoramic est là pour sursauter sur un "i" si "i%" a été déclaré.
Dans la même veine (et juste pour le plaisir), il vaut mieux faire i%=i%+i% au lieu de i%=i%*2. Il y a d'autres techniques d'optimisation; je ne mentionnerai que celle qui consiste à stocker dans une variable séparée une expression d'indice réutilisée à deux ou plusieurs endroits dans une boucle. Le résultat est nettement visible. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:04 | |
| - Citation :
- stocker dans une variable séparée une expression d'indice réutilisée à deux ou plusieurs endroits dans une boucle
Je crois que je comprendrai mieux avec un exemple. @JL35: intéressant, j'avais déjà utilisé un truc comme ça, mais je n'avais pas pensé à filebin, ça devrait être plus rapide, surtout avec les astuces de Klaus. Ouh, on va pouvoir faire des super programmes confidentiels avec ça !
Dernière édition par jjn4 le Jeu 15 Avr 2010 - 0:15, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 0:12 | |
| @Klaus tu as évidemment raison en ce qui concerne l'utilisation de variables entières, là c'était un exemple vite fait. Tiens, il faudra que je mesure la différence de temps d'exécution en fonction du type de variable. Mais c'est de toutes façons assez lent, l'accès octet par octet du fichier. L'intérêt de la technique XOR c'est que c'est parfaitement réversible. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:18 | |
| Ah, pas si lent que ça, je pense ! L'important, c'est que l'utilisateur ne remarque pas une attente trop perceptible, et pour des fichiers pas trop gigantesque, ça doit être bon. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 0:26 | |
| Et puis pour un fichier donné on ne le fait qu'une fois, alors quelques secondes de traitement... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:29 | |
| Euh... là je ne sais pas, dans l'utilisation de textes confidentiels et "vivants" en quelque sorte, on peut le reprendre à tout moment, corriger une partie antérieure, cela peut donner de nombreuses utilisations. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 0:33 | |
| Ca dépend évidemment de l'utilisation... Je reprends mon exemple, il semble qu'une étiquette (Codbin: ) ne supporte pas de commentaire à côté, ça fait une erreur ?
C'est drôle, mais si je rajoute le suffixe % à toutes les variables nombres, il n'y a aucune différence mesurable de temps de traitement ...! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:39 | |
| Eh non, c'est qu'il faut mettre un 2° : exemple : boucle: : ' Commentaire | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 0:40 | |
| Ah bon ! ce n'est pas très joli... Allez | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:42 | |
| Pour constater une différence, il doit falloir d'abord éliminer toute utilisation de chaîne dans la boucle. mp$, mid$(..., len(mp$)...
Dernière édition par jjn4 le Jeu 15 Avr 2010 - 0:48, édité 3 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 0:43 | |
| On se croise, c'est exact, ça fait bizarre... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 1:41 | |
| J'ai essayé sur un fichier txt gigantesque (146 Ko) : Avec ta formule : 30 sec Avec la même ne comportant pas de chaîne et n'ayant que des % : 25 sec Cela fait 17% de mieux, pas terrible ! Qui dit mieux ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Optimisation en temps d'exécution Jeu 15 Avr 2010 - 8:09 | |
| Voici un exemple d'optimisation: - Code:
-
' Cryptage/décryptage d'un fichier texte ou binaire DIM mp$, i%, j%, v%, vc%, f$, fc$, fd$, f1$, f2$, len_mp% DIM val_mp%(50) LABEL Codbin
mp$ = "MotDePasse": ' Code de cryptage, plus c'est long, mieux c'est len_mp% = len(mp$) for i%=1 to len_mp% val_mp%(i%) = ASC(MID$(mp$,i%,1)) next i%
f$ = "C:\Textes\Lorem.txt": ' fichier à crypter fc$ = "Z:\Fcod" fd$ = "Z:\Fdec.txt"
PRINT "Codage..." f1$ = f$: f2$ = fc$: GOSUB Codbin PRINT "Décodage..." f1$ = fc$: f2$ = fd$: GOSUB Codbin PRINT "Terminé !" END
Codbin: ' cryptage/décryptage (symétrique) FILEBIN_OPEN_READ 1, f1$: FILEBIN_OPEN_WRITE 2, f2$ j% = 1 FOR i% = 1 TO FILEBIN_SIZE(1) FILEBIN_READ 1, v% vc% = BIN_XOR(v%, val_mp%(j%)) FILEBIN_WRITE 2, vc% j% = j% + 1: IF j% > len_mp% THEN j% = 1 NEXT i% FILEBIN_CLOSE 1: FILEBIN_CLOSE 2 RETURN
Il n'y a plus de variables à virgule flottante, le calcul de len(mp$) est fait une fois pour toutes, et la clé de cryptage est converti en tableau de valeurs antières au début du programme. Résultat: plus de traitement de chaînes de caractères dans la boucle. Evidemment, plus le fichier est long, plus la différence est sensible. Même quelques dizaines de ko ne sont pas bien gris. Essaie avec une photo... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 10:49 | |
| Tu as raison, je crois qu'on ne peut guère faire mieux comme optimisation. PS sur un fichier de 159k je n'ai trouvé que 12% de gain de temps (36s au lieu de 41s) en précalculant dans un tableau les valeurs binaires du mot de cryptage (méthode Klaus). C'est un peu décevant, mais je pense qu'on perd l'essentiel du temps dans les accès disque octet par octet, le travail sur les chaînes n'est pas si pénalisant que ça. Imaginez qu'on puisse lire le fichier d'un coup dans une variable, coder cette variable, puis la réécrire d'un coup, le traitement serait quasiment instantané: je l'ai fait dans un autre basic (freebasic), et c'est immédiat.
Je précise également que cette méthode XOR n'est pas trop adaptée aux fichiers binaires, because s'il y a de grandes plages d'octets à 0, le mot de cryptage apparaîtra en clair dans ces plages dans le fichier codé (ça n'est valable que pour des gens mal intentionnés qui voudraient décortiquer le fichier codé). | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 15 Avr 2010 - 12:21 | |
| C'est ça, c'est la formule avec laquelle j'avais fait le calcul. Il me semble que les if... then... prennent également pas mal de temps, je crois qu'il devrait être possible de remplacer ça par une formule mathémathique simple, mais mes maths sont loin, je ne me rappelle plus comment faire. Mais de toute façon, je pense que ça ne ferait que grignoter encore 2 ou 3 secondes, pas plus. C'est désespérant. @JL35: pour le XOR tu as raison, c'est d'un cryptage un peu simpliste, mais il ne s'agit pas de traiter des documents de "très haute sécurité" (attention, le FBI nous observe) | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: --- Jeu 15 Avr 2010 - 16:27 | |
| J'ai trouvé une formule mathématique permettant de remplacer if...then... Remplacer alors : - Code:
-
j%=j%+1 : if j%>mp% then j%=1 par - Code:
-
j%=j%-int(j%/10)*10+1 Mais j'ai mesuré, 28" au lieu de 26" finalement, c'est plus lent, alors j'ai rien dit... ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Jeu 15 Avr 2010 - 16:51 | |
| Ça tombe bien, parce qu'on n'a rien entendu. Oui le cryptage est basique, mais ça suffit largement pour un usage ... familial. Ce n'est pas pour la liste des clients d'une banque suisse. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Ven 16 Avr 2010 - 17:45 | |
| Et voilà , je lis un post et hop une idée vient puis c'est l'insomnie. Bon je me suis amusé à concentrer des bouts de code de tout le monde et vous verrez je commence à comprendre le Klauss'ien' et cà donne cà : - Code:
-
dim ecranL,ecranT dim a$,b$,doss$,cx dim code$,visible%,affich$ DIM mp$, i%, j%, v%, vc%, f$, fc$, fd$, f1$, f2$, len_mp% DIM val_mp%(50),act$ code$="#1971#" affich$="" label Nouv,Ouvrir,Ouvrir2,Enrgt,Quit,Crypt,Decrypt,Mail,Charg_list label digicode,clk1,clk2,clk3,clk4,clk5,clk6,clk7,clk8,clk9,clk10,clk11,clk12 label Codbin,clef caption 0,"Messages secrets" height 0,550:width 0,760 ecranL=(screen_x-760)/2:ecranT=(screen_y-550)/2 top 0,ecranT:left 0,ecranL
main_menu 1 sub_menu 2:caption 2,"Fichier" :parent 2,1 sub_menu 3:caption 3,"Nouveau" :parent 3,2 :on_click 3,Nouv sub_menu 5:caption 5,"Enregistrer" :parent 5,2 :on_click 5,Enrgt sub_menu 6:caption 6,"Quitter" :parent 6,2 :on_click 6,Quit sub_menu 7:caption 7,"Edition" :parent 7,1 sub_menu 8:caption 8,"Cryptage" :parent 8,7 :on_click 8,Crypt sub_menu 9:caption 9,"Décryptage" :parent 9,7 :on_click 9,Decrypt sub_menu 10:caption 10,"Options" :parent 10,1 sub_menu 11:caption 11,"Envoyer par mail":parent 11,10 :on_click 11,Mail alpha 12:caption 12,"Messages édités":font_name 12,"arial":top 12,15:left 12,15 list 13:top 13,35:left 13,15:width 13,170:height 13,200:color 13,254,250,131 font_color 13,0,0,255 :font_name 13,"Times new roman":font_size 13,10:on_click 13,Ouvrir
alpha 14:caption 14,"Messages reçus":font_name 14,"arial":top 14,250:left 14,15
list 15:top 15,270:left 15,15:width 15,170:height 15,200:color 15,254,250,131 font_color 15,255,0,0:font_name 15,"Times new roman":font_size 15,10:on_click 15,Ouvrir2
alpha 16:caption 16,"Corps du message":font_name 16,"arial":top 16,15:left 16,220
memo 17:top 17,35:left 17,220 :height 17,435:width 17,500 font_name 17,"Times new roman":font_size 17,10:font_color 17,91,1,72:color 17,254,250,131
gosub Charg_list end
Charg_list: doss$=dir_current$ clear 13 dir_change "Edit" item_add 13,file_find_first$ a$=file_find_next$ while a$<>"_" item_add 13,a$ a$=file_find_next$ end_while file_find_close dir_change doss$ clear 15 dir_change "Recep" item_add 15,file_find_first$ b$=file_find_next$ while b$<>"_" item_add 15,b$ b$=file_find_next$ end_while file_find_close dir_change doss$ return Nouv: cx=message_confirmation_yes_no("Voulez vous enregistrer le texte édité ?") if cx=1 gosub Enrgt else clear 17 end_if return Ouvrir: if item_index$(13)<>"_" clear 17 file_load 17,"Edit\"+item_index$(13) end_if return Ouvrir2: if item_index$(15)<>"_" clear 17 file_load 17,"Recep\"+item_index$(15) end_if return Enrgt: cx=message_input("Nommer le fichier","Nom du fichier :","") if cx=1 file_save 17,"Edit\"+message_text$+".txt" clear 17 gosub charg_list end_if return digicode: visible%=1 form 20 height 20,210:width 20,140 top 20,260:left 20,450 command_target_is 20 button 21 :width 21,25 :top 21,45 :left 21,15 :caption 21,"1" :cursor_point 21 :on_click 21,clk1 button 22 :width 22,25 :top 22,45 :left 22,45 :caption 22,"2" :cursor_point 22 :on_click 22,clk2 button 23 :width 23,25 :top 23,45 :left 23,75 :caption 23,"3" :cursor_point 23 :on_click 23,clk3 button 24 :width 24,25 :top 24,75 :left 24,15 :caption 24,"4" :cursor_point 24 :on_click 24,clk4 button 25 :width 25,25 :top 25,75 :left 25,45 :caption 25,"5" :cursor_point 25 :on_click 25,clk5 button 26 :width 26,25 :top 26,75 :left 26,75 :caption 26,"6" :cursor_point 26 :on_click 26,clk6 button 27 :width 27,25 :top 27,105 :left 27,15 :caption 27,"7" :cursor_point 27 :on_click 27,clk7 button 28 :width 28,25 :top 28,105 :left 28,45 :caption 28,"8" :cursor_point 28 :on_click 28,clk8 button 29 :width 29,25 :top 29,105 :left 29,75 :caption 29,"9" :cursor_point 29 :on_click 29,clk9 button 30:width 30,25 :top 30,135 :left 30,15 :caption 30,"0" :cursor_point 30 :on_click 30,clk10 button 31:width 31,25 :top 31,135 :left 31,45 :caption 31,"#" :cursor_point 31 :on_click 31,clk11 button 32:width 32,25 :top 32,135 :left 32,75 :caption 32,"Ok" :cursor_point 32 :on_click 32,clk12 edit 33 :width 33,85 :top 33,15 :left 33,15 :secret_on 33:font_name 33,"arial":font_bold 33:text 33,"******" color 33,199,199,255 return
clk1: affich$=affich$+"1" text 33,affich$ return clk2: affich$=affich$+"2" text 33,affich$ return clk3: affich$=affich$+"3" text 33,affich$ return clk4: affich$=affich$+"4" text 33,affich$ return clk5: affich$=affich$+"5" text 33,affich$ return clk6: affich$=affich$+"6" text 33,affich$ return clk7: affich$=affich$+"7" text 33,affich$ return clk8: affich$=affich$+"8" text 33,affich$ return clk9: affich$=affich$+"9" text 33,affich$ return clk10: affich$=affich$+"0" text 33,affich$ return clk11: affich$=affich$+"#" text 33,affich$ return clk12: if affich$=code$ hide 20 command_target_is 0 gosub clef else cx=message_confirmation_yes_no("Voulez vous réessayer") if cx=1 text 33,"" affich$="" else hide 20 gosub quit end_if end_if return
clef: mp$ = affich$:' Code de cryptage, plus c'est long, mieux c'est len_mp% = len(mp$) for i%=1 to len_mp% val_mp%(i%) = ASC(MID$(mp$,i%,1)) next i%
if act$="code"
file_save 17,doss$+"\Base.txt" f$ = doss$+"\Base.txt" fc$ = doss$+"\Fcod"
f1$ = f$: f2$ = fc$: GOSUB Codbin
file_load 17,doss$+"\Fcod" file_delete doss$+"\Base.txt" file_delete doss$+"\Fcod"
else file_save 17,doss$+"\Fcod" fc$ = doss$+"\Fcod" fd$ = doss$+"\Fdec.txt"
f1$ = fc$: f2$ = fd$: GOSUB Codbin
file_load 17,doss$+"\Fdec.txt" file_delete doss$+"\Fcod" file_delete doss$+"\Fdec.txt"
end_if return
Codbin: FILEBIN_OPEN_READ 1, f1$: FILEBIN_OPEN_WRITE 2, f2$ j% = 1 FOR i% = 1 TO FILEBIN_SIZE(1) FILEBIN_READ 1, v% vc% = BIN_XOR(v%, val_mp%(j%)) FILEBIN_WRITE 2, vc% j% = j% + 1: IF j% > len_mp% THEN j% = 1 NEXT i% FILEBIN_CLOSE 1: FILEBIN_CLOSE 2 return
Crypt: act$="code" if visible%=1 show 20 affich$="" else gosub digicode end_if return Decrypt: act$="decode" if visible%=1 show 20 affich$="" else gosub digicode end_if return Mail: cx=message_input("Envoyer par mail","Destinataire :","") if cx=1 execute "mailto:"+message_text$+"?subject=Message&body="+text$(17) end_if return Quit: terminate
Bon pour que celà fonctionne il vous faut un dossier source ou vous mettez le code.bas ,et deux sous dossier nommés "Recep" et "Edit" le premier est pour des messages recus l'autre pour ceux créés. On peut chercher à améliorer, surtout pour la cle de cryptage (#1971#) qui est là comprise dans le code source et que l'on peut vouloir changer. je vous laisse découvrir le fruit de mon accouchement nocturne et j'attends avec impatience vos (bon je l'espère)commentaires. Ps la fermeture en cas de mauvais code n'est pas un bug. Merci à tous pour les bouts de codes | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 16 Avr 2010 - 18:26 | |
| Eh, c'est sympa, ton programme ! Si je comprends bien, le but, c'est de s'échanger entre nous des messages codés par mail et de les décoder comme si on était des agents de bureaux provinciaux du FBI. (eh, tu aurais pu l'écrire dans un système d'aide, ça) C'est marrant ! (dommage que je n'ai pas de trucs vachement secrets à transmettre) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Ven 16 Avr 2010 - 18:57 | |
| Oui, je vois que tu as plein d'idées pour paufiner ton programme ! Il est intéressant, et pas seulement pour échanger des messages secrets par mail.
As-tu essayé de comparer l'exécution "ancienne version" avec la version actuelle au niveau des performances, mais avec un gros fichier genre photo qui pèserait quelques 5 Méga-octets ? Bon, ça dépend aussi du système, mais chez moi, je constate une nette amélioration !
Bravo, et continue comme ça ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque Sam 17 Avr 2010 - 17:43 | |
| @ jjn4 ,
c'était le but de départ mais tu peus aussi envisager des billets doux d'une jolie secretaire.
à une condition , que ta femme soit pas ingénieur informatique . Le codage ne tiendrait pas 2 minutes.
@ Klauss,
je n'ai pas fait de comparaisons sur de gros fichier du fait que cette petite application est plutôt destiné au mail et que malheureusement certain serveur bloque au niveau de la taille l'expédition des mails.
mais j'ai vu les chronos dans les posts précédent et ta méthode (que j'ai reprise) parait satisfaisante. maintenant il faudrait que je teste sa rapidité avec les éléments que j'ai ajouter/modifier pour l'affichage à l'écran.
Merci à tous les deux pour avoir pris le temps regarder ma petite création.
PS on peut supprimer la ligne qui clos l'application en cas de non re essai dans le digicode. | |
| | | Contenu sponsorisé
| Sujet: Re: Cryptage/décryptage d'un fichier quelconque | |
| |
| | | | Cryptage/décryptage d'un fichier quelconque | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |