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 |
|
|
| CryptedText - outil pour crypter des textes à protéger | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: CryptedText - outil pour crypter des textes à protéger Jeu 15 Fév 2024 - 10:33 | |
| J'ai fait un petit outil permettant de crypter des textes, lisibles uniquement via ce même outil. Les textes sont écrits sur disque sous forme de chaînes de caractères contenant une représentation hexadécimale du texte crypté. Les textes peuvent être cryptés selon une clé spécifique et ne sont lisibles qu'en appliquant la même clé. L'outil crée automatiquement une clé lors de son premier démarrage. On peut ajouter autant de clés que nécessaire. Chaque clé est créée par un mécanisme aléatoire - il est statistiquement impossible de recréer plusieurs fois la même clé. Les clés sont identifiées par un nom (librement choisi) et mémorisés dans un fichier de configuration. Par défaut, le programme est en accès libre. Mais le menu Keys propose une ligne "Manage password". Cette ligne ouvre une page permettant de saisir un mot de passe qui sera requis au prochain lancement du programme. Ce programme montre plusieurs techniques de programmation. En particulier, l'utilisation de fenêtres pseudo-modale bloquant l"accès à la fenêtre principale lors de leur ouverture, et ce de manière élégante et efficace. Tout est écrit en 100 % Panoramic, sans aucune DLL et sans faire appel à des API's, sauf des appels à SendMessage de User32.dll pour mettre des EDIT de saisie de mot de passe en mode "mot de passe". Mais User32.dll est présente dans toutes les installations Windows. Voici le code: - Code:
-
' CryptedText.bas
' ******************************************************** ' * Ce programme crypte et décrypte des textes. ' * Le cryptage se fait selon une clé qui ' * permute tous les caractères de façon aléatoire. ' * Lors du oremier démarrage du programme, une ' * clé nommée Default sera créée automatiquement. ' * A chaque lancement, cette clé est sélectionnée. ' * On peut créer d'autres clés en leur donnant ' * des noms différents. Le nombre de clés n'est ' * pas limité. On peut supprimer des clés ajoutées; ' * mais la clé Default est protégée. On peut aussi ' * renommer une clée ajoutée (sauf la clé Default). ' * Les clés sont mémorisées en format hexadécimal. ' * Le cryptage se fait é=également en format ' * hexadécimal, avec 80 caractères hexa (40 caractères ' * encodés) par ligne. Le fichier crypté porte ' * l'extension *.ctx. Le fichier CryptedText.cnf ' * contient les clés avec leur nom. Un fichier est ' * crypté avec une des clés présentes (à choisir !). ' * Il ne peut être décodé qu'avec la même clé ayant ' * sa valeur d'origine ! ' * ' * On peut installer un mot de passe général pour l'accès ' * au programme. Ce mot de passe est mémorisé dans la ' * première ligne du fichier de configuration; ' * mais il est crypté par la clé Default. ' * ' * !!!!!!!!! ATTENTION DANGER !!!!!!!!! ' * ' * Supprimer une clé revient à perdre DEFINITIVEMENT ' * l'accès à TOUS les fichiers cryptés par cette clé ! ' * ' * NE JAMAIS SUPPRIMER UNE CLE ENCORE UTILISEE ! ' * ' *********************************************************
labels() constantes() variables() GUI() initialisations()
end
sub labels() label newtext, opentext, encryptedtext, savetext, savetextas, cleartext, closetext label exitprog, close0, selectkey1 label managekeys, close200, selectkey, addkey, removekey, renamekey label danger, close300, abandondelete, executedelete label close350, managepwd, setpassword, close500 label askpassword, validatepassword, close600 end_sub
sub constantes() dim title$ : title$ = "CryptedText" dim config$ : config$ = "CryptedText.cnf" dim crlf$ : crlf$ = chr$(13) + chr$(10) end_sub
sub variables() dim modif% : modif% = 0 : ' flag "le fichier e, mémoire a été modifié" dim doabort% : doabort% = 1 : ' flag "avorter l'action en cours" dim file$ : file$ = "" : ' nom du fichier chargé dabs le mémo dim folder$ : folder$ = file_extract_path$(param_value$(0)) : ' dossier initial, puis celui du fichier chargé dim i%, j%, k%, n%, s$, key$, p%, c$, cs$ dim keys$(256) : ' tableau recevant key$ éclaté en caractères hexa dim charset$ : ' liste des caractères autorisés dans le texte dim dopassword% : dopassword% = 0 : ' flag "mot de passe général est requis" dim pwd$ : pwd$ = "" : ' mot de passe décodé end_sub
sub GUI() ' form principale full_space 0 : caption 0,title$ : on_close 0,close0 memo 100 : top 100,40 : left 100,10 : width 100,width_client(0) - 20 height 100,height_client(0) - 50 : bar_both 100 alpha 110 : top 110,10 : left 110,10 : caption 110,"Encryption key:" combo 111 : top 111,10 : left 111,100 : width 111,290 : item_add 111,"Default" : ' noms des clés on_click 111,selectkey1 edit 112 : top 112,10 : left 112,400 : width 112,width_client(0) - 310 : inactive 112 : ' clé sélectionn"e dlist 113 : ' pour les clés dlist 114 : ' temporaire pour le texte crypté save_dialog 400 : file_dialog 400,"Nouveau.ctx" : dir_dialog 400,folder$ open_dialog 401 : file_dialog 401,"Nouveau.ctx" : dir_dialog 401,folder$ ' form de gestion des clés de cryptage form 200 : hide 200 : width 200,800 : height 200,600 : caption 200,"Encryption key maintenance" on_close 200,close200 left 200,(screen_x-width(200))/2 : top 200,(screen_y-height(200))/2 alpha 201 : parent 201,200 : top 201,10 : left 201,10 : caption 201,"Selected key:" edit 211 : parent 211,200 : top 211,10 : left 211,100 : width 211,290 : inactive 211 edit 212 : parent 212,200 : top 212,40 : left 212,100 : width 212,width_client(200)-110 : inactive 212 alpha 202 : parent 202,200 : top 202,70 : left 202,10 : caption 202,"Key list:" list 213 : parent 213,200 : top 213,100 : left 213,10 : width 213,290 : height 213,450 on_click 213,selectkey button 220 : parent 220,200 : top 220,120 : left 220,330 : caption 220,"Add..." : on_click 220,addkey button 221 : parent 221,200 : top 221,160 : left 221,330 : caption 221,"Remove" : on_click 221,removekey button 222 : parent 222,200 : top 222,200 : left 222,330 : caption 222,"Rename" : on_click 222,renamekey ' form de confirmation de suppression d'une clé de cryptage form 300 : hide 300 : width 300,800 : height 300,600 : caption 300,"ATTENTION - DANGER" on_close 300,close300 left 300,(screen_x-width(300))/2 : top 300,(screen_y-height(300))/2 alpha 301 : parent 301,300 : top 301,50 : left 301,40 : caption 301,"!!! CAUTION DANGER !!!" font_size 301,48 : font_color 301,255,0,0 alpha 302 : parent 302,300 : top 302,150 : left 302,150 caption 302,"Any file encrypted with this key will not longer be readable !" font_size 302,14 : font_color 302,255,0,0 alpha 303 : parent 303,300 : top 303,220 : left 303,170 caption 303,"There will be no way to recover this key !" font_size 303,14 : font_color 303,255,0,0 button 304 : parent 304,300 : top 304,300 : left 304,100 : width 304,450 caption 304,"Abandon" : font_bold 304 : font_size 304,12 : on_click 304,abandondelete button 305 : parent 305,300 : top 305,300 : left 305,680 caption 305,"Do it !" : font_bold 305 : font_size 305,12 : on_click 305,executedelete ' form d'affichage dutexte crypté form 350 : hide 350 : width 350,800 : height 350,600 : caption 350,"Encrypted current text" on_close 350,close350 left 350,(screen_x-width(350))/2 : top 350,(screen_y-height(350))/2 memo 351 : parent 351,350 : full_space 351 : bar_both 351 ' form de gestion du mot de passe général form 500 : hide 500 : width 500,800 : height 500,600 : caption 500,"Master password" on_close 500,close500 left 500,(screen_x-width(500))/2 : top 500,(screen_y-height(500))/2 alpha 501 : parent 501,500 : top 501,40 : left 501,40 : font_size 501,24 caption 501,"No password is actually required !" alpha 502 : parent 502,500 : top 502,140 : left 502,40 : caption 502,"Password:" edit 503 : parent 503,500 : top 503,140 : left 503,100 : width 503,300 secret_on 503 button 510 : parent 510,500 : top 510,190 : left 510,100 : width 510,150 font_size 510,12 : caption 510,"Install password" : on_click 510,setpassword button 511 : parent 511,500 : top 511,190 : left 511,300 : width 511,150 font_size 511,12 : caption 511,"Abandon" : on_click 511,close500
' form de gestion du mot de passe général form 600 : hide 600 : width 600,800 : height 600,600 : caption 600,"Master password" on_close 600,close600 left 600,(screen_x-width(600))/2 : top 600,(screen_y-height(600))/2 alpha 601 : parent 601,600 : top 601,40 : left 601,40 : font_size 601,16 caption 601,"Enter your master password !" alpha 602 : parent 602,600 : top 602,140 : left 602,40 : caption 602,"Your password:" edit 603 : parent 603,600 : top 603,140 : left 603,150 : width 603,300 secret_on 603 button 610 : parent 610,600 : top 610,190 : left 610,150 : width 610,150 font_size 610,12 : caption 610,"Validate password" : on_click 610,validatepassword button 611 : parent 611,500 : top 611,190 : left 611,350 : width 611,150 font_size 611,12 : caption 611,"Abandon" : on_click 611,close600
end_sub
sub initialisations() main_menu 1 sub_menu 2 : parent 2,1 : caption 2,"Files" sub_menu 21 : parent 21,2 : caption 21,"New" : on_click 21,newtext sub_menu 22 : parent 22,2 : caption 22,"Open" : on_click 22,opentext sub_menu 29 : parent 29,2 : caption 29,"Show encrypted" : on_click 29,encryptedtext sub_menu 23 : parent 23,2 : caption 23,"Save" : on_click 23,savetext sub_menu 24 : parent 24,2 : caption 24,"Save as..." : on_click 24,savetextas sub_menu 25 : parent 25,2 : caption 25,"Clear" : on_click 25,cleartext sub_menu 26 : parent 26,2 : caption 26,"Close" : on_click 26,closetext sub_menu 27 : parent 27,2 : caption 27,"-" sub_menu 28 : parent 28,2 : caption 28,"Exit" : on_click 28,exitprog sub_menu 3 : parent 3,1 : caption 3,"Keys" sub_menu 31 : parent 31,3 : caption 31,"Manage keys" : on_click 31,managekeys sub_menu 32 : parent 32,3 : caption 32,"Manage password" : on_click 32,managepwd charset$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" charset$ = charset$ + "àâéëêèïîôüûùçabcdefghijklmnopqrstuvwxyz" charset$ = charset$ + "&~"+chr$(34)+chr$(13)+chr$(10)+" #'{([`_\^@°)]+=}%*µ$£$<>,?;.:/!§" n% = len(charset$) dim tempkey$(n%) loadconfig() if dopassword%=1 end_if end_sub sub checkmodif() doabort% = 1 if modif%=1 doabort% = message_confirmation_yes_no("The text has been modified."+crlf$+"Discard le modifications ?") end_if end_sub
' générer une nouvelle clé sub generatekey() n% = len(charset$) : ' déterminer la longueur nécessaire for i%=1 to n% : ' précharger la clé tempkey$(i%) = "" next i% for i%=1 to n% : ' pour chaque caractère à crypter: p% = rnd(n%) + 0.5 : ' déterminer un emplacement aléatoire while tempkey$(p%)<>"" : ' emplacement déjà utilisé ? p% = rnd(n%) + 0.5 : ' en déterminer un autre... end_while c$ = mid$(charset$,i%,1) : ' prendre un caractère c$ = right$("0"+hex$(asc(c$)),2) : ' convertir en 2 digits hexa tempkey$(p%) = c$ : ' placer le caractère dans sa destination next i% key$ = "" for i%=1 to n% : ' construire la clé résultante key$ = key$ + tempkey$(i%) next i% end_sub
sub loadconfig() clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 if file_exists(folder$+config$)=1 : ' est-ce qu'il y a déjà une config ? file_open_read 1,folder$+config$ : ' alors ouvrir ce fichier if file_eof(1)=0 : ' fichier non vide ? file_readln 1,s$ if left$(s$,9)="xDefault=" : ' un mot de passe général est requis ? pwd$ = mid$(s$,10,len(s$)) : ' mémoriser le mot de passe pour décryptage ultérieur caption 501,"A password is actually required !" dopassword% = 1 file_readln 1,s$ end_if if s$="Default" : ' le premier élément doit s'appeler "default" ! item_add 111,s$ : ' ajouter le nom "Default" à la liste des noms file_readln 1,s$ item_add 113,s$ : ' et la clé de cryptage qui va avec while file_eof(1)=0 : ' est-ce qu'il y a d'autres clés ? file_readln 1,s$ item_add 111,s$ : ' alors charger les noms file_readln 1,s$ item_add 113,s$ : ' et les clés end_while item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur end_if file_close 1 if dopassword%=1 : ' la configuration requiert un mot de passe ? decryptstring(pwd$) : ' décrypter le mot de passe (résultat dans cs$) pwd$ = cs$ gosub askpassword end_if exit_sub : ' ici, la configuration existante a été chargée corrsctement end_if file_close 1 end_if clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 generatekey() : ' ici, générer la première clé "Default" item_add 111,"Default" : ' charger le nom imposé de la clé par défaut item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de la clé par défaut file_writeln 1,item_read$(113,1) : ' et sa valeur file_close 1 end_sub sub saveconfig() file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$) : ' crypter le mot de passe, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if for i%=1 to count(111) file_writeln 1,item_read$(111,i%) : ' sauvegarder les noms des clés file_writeln 1,item_read$(113,i%) : ' et de leurs valeurs next i% file_close 1 end_sub
sub encrypttext(act%) cs$ = "" : ' initialiser la chaîne cryptée if count(100)>0 : ' texte à crypter non vide ? s$ = text$(100) : ' prendre le texte complet key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée (hexa) : ' décoder la clé sélectionnée k% = len(key$)/2 for i%=1 to k% : ' éclater la clé sélectionnée keys$(i%) = mid$(key$,i%*2-1,2) next i% for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = instr(charset$,c$) if p%=0 then p% = instr(charset$,"?") cs$ = cs$ + keys$(p%) : ' le vrai cryptage est ICI ! next i% end_if if act%=0 : ' action 0: afficher le texte crypté ? clear 351 p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères item_add 351,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then item_add 351,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste end_if if act%=1 : ' action 1: sauvegarder le texte crypté ? file_open_write 1,folder$+file$ : ' écrire le texte encrypté dans cs$ p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères file_writeln 1,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then file_writeln 1,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste file_close 1 end_if end_sub
sub encryptstring(strng$) : ' résultat dans cs$ ! cs = "" s$ = strng$ : ' prendre le string complet key$ = item_read$(113,1) : ' prendre la clé Default (hexa) k% = len(key$)/2 for i%=1 to k% : ' éclater la clé sélectionnée keys$(i%) = mid$(key$,i%*2-1,2) next i% for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = instr(charset$,c$) if p%=0 then p% = instr(charset$,"?") cs$ = cs$ + keys$(p%) : ' le vrai cryptage est ICI ! next i% end_sub
sub decryptstring(strng$) : ' résultat dans cs$ ! cs$ = strng$ key$ = item_read$(113,1) : ' prendre la clé Default (hexa) k% = len(key$)/2 for i%=1 to k% : ' éclater la clé sélectionnée keys$(i%) = mid$(key$,i%*2-1,2) next i% n% = len(cs$)/2 s$ = "" for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to k% if keys$(j%)=c$ : ' trouvé ? retourner son indice p% = j% exit_for end_if next j% s$ = s$ + mid$(charset$,p%,1) : ' le vrai décryptage est ICI ! next i% cs$ = s$ end_sub sub decrypttext() clear 100 : ' effacer la zone de texte à l'écran key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée k% = len(key$)/2 for i%=1 to k% : ' éclater la clé sélectionnée keys$(i%) = mid$(key$,i%*2-1,2) next i% file_open_read 1,folder$+file$ s$ = "" : ' préparer le texte décrypté while file_eof(1)=0 : ' traiter le fichier ligne par ligne (80 caractères) file_readln 1,cs$ n% = len(cs$)/2 for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to k% if keys$(j%)=c$ : ' trouvé ? retourner son indice p% = j% exit_for end_if next j% s$ = s$ + mid$(charset$,p%,1) : ' le vrai décryptage est ICI ! next i% end_while file_close 1 text 100,s$ end_sub
newtext: checkmodif() if doabort%<>1 then return file$ = "" clear 100 caption 0,title$ modif% = 0 doabort% = 0 return opentext: checkmodif() if doabort%<>1 then return s$ = file_name$(401) if s$="_" then return if file_exists(s$)=0 message "Ce fichier n'existe pas:"+crlf$+s$ return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ decrypttext() modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return encryptedtext: encrypttext(0) inactive 0 show 350 return close350: hide 350 active 0 to_foreground 0 return managepwd: inactive 0 show 500 return setpassword: pwd$ = text$(503) if len(pwd$)=0 dopassword% = 0 caption 501,"No password is actually required !" else dopassword% = 1 caption 501,"A password is actually required !" end_if saveconfig() hide 500 active 0 to_foreground 0 return close500: hide 500 active 0 to_foreground 0 return askpassword: inactive 0 show 600 return validatepassword: s$ = text$(603) if s$<>pwd$ message "Your password is invalid !"+crlf$+crlf$+"Pleas try again..." terminate end_if gosub close600 return close600: hide 600 active 0 to_foreground 0 return savetext: if file$="" gosub savetextas return end_if encrypttext(1) return savetextas: s$ = file_name$(400) if s$="_" then return if file_exists(s$)=1 if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ encrypttext(1) modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return cleartext: checkmodif() if doabort%<>1 then return clear 100 caption 0,title$ modif% = 0 doabort% = 0 return closetext: checkmodif() if doabort%<>1 then return file$ = "" caption 0,title$ modif% = 0 doabort% = 0 return exitprog: checkmodif() if doabort%<>1 then return terminate close0: checkmodif() if doabort%<>1 then return : ' juste pour la forme - on ne peut pas arrêter cela return managekeys: text 211,text$(111) text 212,text$(112) clear 213 for i%=1 to count(111) item_add 213,item_read$(111,i%) next i% item_select 213,item_index(111) inactive 0 show 200 return close200: hide 200 active 0 to_foreground 0 return selectkey: text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) item_select 111,item_index(213) text 112,item_read$(113,item_index(213)) return selectkey1: text 112,item_read$(113,item_index(111)) return addkey: s$ = message_input$("Add new encryption key","Key name:","") if s$="" then return for i%=1 to count(111) if s$=item_read$(111,i%) message "This key name exists already !" return end_if next i% generatekey() : ' ici, générer ne nouvelle clé item_add 111,s$ : ' charger le nouveau nom item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,count(111) : ' sélectionner la nouvelle clé text 112,item_read$(113,count(111)) : ' et affichier sa valeur saveconfig() item_add 213,s$ : ' actualiser l'affichage de la form de maintenance item_select 213,count(213) text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) return removekey: if item_index(213)<2 message "Please select a key (other than Default)" return end_if s$ = "Do you really want to delete permanently the key "+item_read$(213,item_index(213)) if message_confirmation_yes_no(s$)=1 inactive 200 show 300 return renamekey: s$ = message_input$("Rename an encryption key","New Key name:","") if s$="" then return p% = item_index(213) : ' récupérer l'index de la clé à renommer item_delete 213,p% : ' changer le nom dans la fenêtre de maintenance item_insert 213,p%,s$ item_select 213,p% item_delete 111,p% : ' changer le nom dans la fenêtre principale item_insert 111,p%,s$ item_select 211,p% text 211,s$ : ' afficher le nouveau nom dans la fenêtre de maintenance text 112,s$ : ' et dans la fenêtre principale saveconfig() return danger: inactive 0 show 300 return close300: hide 300 active 200 to_foreground 200 return abandondelete: gosub close300 return executedelete: item_delete 111,item_index(213) : ' supprimer la clé sur la page principale item_delete 113,item_index(213) : ' et sa valeur item_select 111,1 : ' sélectionner la clé par défaut text 112,item_read$(111,1) : ' et l'afficher item_delete 213,item_index(213) : ' supprimer la clé dans la page de maintenance des clés item_select 213,1 : ' sélectionner la clé par défaut text 211,item_read$(111,item_index(213)) : ' et actualiser l'affichage text 212,item_read$(113,item_index(213)) end_if saveconfig() gosub close300 return
Question: je croyais me souvenir que Panoramic avait un moyen de declarer un EDIT en format "mot de passe". Est-ce que je me trompe ? Est-ce que quelqu'un connaîtrait ce moyen ?EDIT J'ai remplacé le source en utilisant secret_on. Merci jjn4.
Dernière édition par Klaus le Jeu 15 Fév 2024 - 23:53, édité 2 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Jeu 15 Fév 2024 - 18:56 | |
| Oui, je pense que tu veux parler des mots-clé : secret_on et secret_off. Ton programme secret a l'air intéressant. Je vais l'essayer dès demain... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Jeu 15 Fév 2024 - 22:56 | |
| Merci, jjn4 ! C'est exactement ce que je cherchais. Je vais pouvoir remplacer mes deux appels à User32.dll... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Jeu 15 Fév 2024 - 23:09 | |
| Le code est actualisé dans mon premier post. Plus de User32.dll... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 0:09 | |
| A tout hasard, voici quelques fichiers cohérents, pouvant servir d'exemple. Tout d'abord le fichier CryptedText.cnf. C'est le fichier qui contient le mot de passe et la ou les clés de cryptage. actuellement, il contient le mot de passe (klaus) tout en miniscules, la clé Default et une clé Courrier professionnel: - Code:
-
xDefault=5BA7FC403C Default 71B5E82F246F324D7B4E2C67353A25695F745344EE347D73540D684261EF7029F96D21FB4F432230643852F4376276E72BFC517257337E6E66565A5BA73E2A41EA46263C75400A4B7720273D5E3BE0E245606A497859B024394A5CA32E7A6547554823EB2863794C6BE950365D586C3F31 Courriers professionnels EE322958385D674B20332A3B37604D6968216356FB44EA7E55406A3143B574E94C496F5B47575C3D783A503F416123524F7664773E706B260A53FC465A347AF4B02424716EF9225F0D593573A72EEB4875363054E8286C277D7BA362425165452FE02C254A72666D394EE2EF2B793CE75E
Attention: la suite des codes hexadécimaux pour les deux clés DOIT se situer sur UNE SEULE ligne ! Et voici un fichier de texte crypté nommé doc.ctx. il contient les lignes de commentaires au début du présent programme, en version cryptée par la clé 2: - Code:
-
3075372459B06E703EB5700D6E2B647671EB48EB4830752C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2CEB 4830752C75757575377075B024F426247634347075772459B06E7075706E753E5C772459B06E7075 3E7071756E700D6E70712BEB4830752C75757575447075772459B06E762670757170756B76536E75 71705AF47A75F97A7075775A5C7524F953EB4830752C75757575B0702434F96E70756EF4F971755A 70717577762476776E3A247071753E70756B764FF47A75765A5C766EF45324702BEB4830752C7575 757544F42471753EF975F4247034537024753E5C34762424762670753EF975B024F4262476343470 4E75F97A70EB4830752C75757575775A5C757AF434345C707560706B76F95A6E7571702476757724 5C5C707576F96EF434766E5324F97034707A6E2BEB4830752C757575752A75770A7624F970755A76 7A777034707A6E4E7577706E6E7075775A5C7570716E75715C5A70776E53F47A7A5C702BEB483075 2C75757575557A75B070F96E7577245C7024753E3076F96E24707175775A5C7175707A755A70F924 753EF47A7A767A6E75EB4830752C757575753E7071757AF43471753E536B6B5C24707A6E712B7544 70757AF434642470753E7075775A5C71757A3070716EEB4830752C75757575B07671755A5334536E 5C2B75557A75B070F96E7571F9B0B02453347024753E707175775A5C717576FCF4F96E5C7071EFEB 4830752C7575757534765371755A7675775A5C7560706B76F95A6E7570716E75B024F46E5C265C70 2B75557A75B070F96E7576F9717153EB4830752C7575757524707AF43434702475F97A7075775A5C 707576FCF4F96E5C7075E87176F96B755A7675775A5C7560706B76F95A6E422BEB4830752C757575 7544707175775A5C717571F47A6E75345C34F42453715C707175707A756BF42434766E750A700D76 3E5C775334765A2BEB4830752C75757575447075772459B06E762670757170756B76536E755C455C 26765A7034707A6E75707A756BF42434766EEB4830752C757575750A700D763E5C775334765A4E75 762270777520EE7577762476776E3A247071750A700D7675E838EE7577762476776E3A247071EB48 30752C75757575707A77F43E5C714275B07624755A53267A702B754470756B53770A537024757724 59B06E5C75B0F4246E70EB4830752C757575755A30700D6E707A7153F47A752C2B776E0D2B754470 756B53770A53702475372459B06E703EB5700D6E2B777A6BEB4830752C7575757577F47A6E53707A 6E755A707175775A5C717576227077755A70F924757AF4342B75747A756B53770A5370247570716E EB4830752C75757575772459B06E5C757622707775F97A70753E707175775A5C7175B0245C71707A 6E707175E84775770AF45371532475E7422BEB4830752C75757575635A757A7075B070F96E75786E 2470753E5C77F43E5C7524F93076227077755A76753478347075775A5C757659767A6EEB4830752C 7575757571767522765A70F924753E30F4245326537A7075E7757575757575757575757575EB4830 752CEB4830752C75757575557A75B070F96E75537A716E765A5A702475F97A7534F46E753E7075B0 7671717075265C7A5C24765A75B0F4F924755A307677773A71EB4830752C7575757576F975B024F4 2624763434702B7537707534F46E753E7075B0767171707570716E75345C34F42453715C753E767A 71755A76EB4830752C75757575B0247034533A2470755A53267A70753EF9756B53770A537024753E 707577F47A6B5326F924766E53F47AEFEB4830752C757575753476537175535A7570716E75772459 B06E5C75B07624755A7675775A5C7560706B76F95A6E2BEB4830752CEB4830752C75757575E7E7E7 E7E7E7E7E7E7752AB5B54D7EB563557E75602A7E684D3175E7E7E7E7E7E7E7E7E7EB4830752CEB48 30752C7575757543F9B0B0245334702475F97A7075775A5C7524702253707A6E754775B070243E24 7075604D69637E63B563E94DEA4D7EB5EB4830752C757575755A307677773A71754775B555744375 5A7071756B53770A5370247175772459B06E5C7175B076247577706E6E7075775A5C75E7EB483075 2C75757575EB4830752C757575757E4D75562AEA2A634375437440403163EA4D3175747E4D753744 4D754D7E3755314D7574B5634463434D4D75E7EB4830752C75EB4830752C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C
Mode d'emploi: 1. copier ces deux fichiers dans dossier où se trouvera l'exécutable. 2. lancer le programme 3. le programme demande le mot de passe. Saisir: klaus tout en minuscules 4. par la combo en haut de l'écran, choisir la clé Courriers profressionnels 5. ouvrir le menu Files 6. choisir le sous-menu Open 7. choisir le fichier doc.ctx et valider 8. ==> les lignes de commentaire du début du programme apparaîtront ! A partir de là, on peut jouer avec les menus... Voilà. Avec ça, il y a de quoi jouer. On peut ajouter autant de clés que nécessaire... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 0:44 | |
| Waouh ! C'est du lourd ! Merci Klaus ! La lettre " r" n'est pas décodée correctement : elle est substituée par la lettre " q". - Capture d'écran:
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 0:59 | |
| Oups... je vais regarder cela demain - enfin, ce matin ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 1:16 | |
| @Klaus Le programme de cryptage / décryptage fonctionne bien. Je pense que c'est une partie d'un de tes fichiers (.cnf ou .ctx) qui s'est sauvée lors du copier-coller. Deux petites coquilles seraient à rectifier dans le code de démo : ligne 313 : il manque le " $" à la variable CS$. ligne 151: Le BUTTON 611 n'a pas son bon parent (500 au lieu de 600) : | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 12:29 | |
| il y avait un problème logique à la base, en fait, en plus de quelques négligences de programmation. Voici la version opérationnelle: - Code:
-
' CryptedText.bas
' ******************************************************** ' * Ce programme crypte et décrypte des textes. ' * Le cryptage se fait selon une clé qui ' * permute tous les caractères de façon aléatoire. ' * Lors du oremier démarrage du programme, une ' * clé nommée Default sera créée automatiquement. ' * A chaque lancement, cette clé est sélectionnée. ' * On peut créer d'autres clés en leur donnant ' * des noms différents. Le nombre de clés n'est ' * pas limité. On peut supprimer des clés ajoutées; ' * mais la clé Default est protégée. On peut aussi ' * renommer une clée ajoutée (sauf la clé Default). ' * Les clés sont mémorisées en format hexadécimal. ' * Le cryptage se fait é=également en format ' * hexadécimal, avec 80 caractères hexa (40 caractères ' * encodés) par ligne. Le fichier crypté porte ' * l'extension *.ctx. Le fichier CryptedText.cnf ' * contient les clés avec leur nom. Un fichier est ' * crypté avec une des clés présentes (à choisir !). ' * Il ne peut être décodé qu'avec la même clé ayant ' * sa valeur d'origine ! ' * ' * On peut installer un mot de passe général pour l'accès ' * au programme. Ce mot de passe est mémorisé dans la ' * première ligne du fichier de configuration; ' * mais il est crypté par la clé Default. ' * ' * !!!!!!!!! ATTENTION DANGER !!!!!!!!! ' * ' * Supprimer une clé revient à perdre DEFINITIVEMENT ' * l'accès à TOUS les fichiers cryptés par cette clé ! ' * ' * NE JAMAIS SUPPRIMER UNE CLE ENCORE UTILISEE ! ' * ' *********************************************************
labels() constantes() variables() GUI() initialisations()
end
sub labels() label newtext, opentext, encryptedtext, savetext, savetextas, cleartext, closetext label exitprog, close0, selectkey1 label managekeys, close200, selectkey, addkey, removekey, renamekey label danger, close300, abandondelete, executedelete label close350, managepwd, setpassword, close500 label askpassword, validatepassword, close600 end_sub
sub constantes() dim title$ : title$ = "CryptedText" dim config$ : config$ = "CryptedText.cnf" dim crlf$ : crlf$ = chr$(13) + chr$(10) end_sub
sub variables() dim modif% : modif% = 0 : ' flag "le fichier e, mémoire a été modifié" dim doabort% : doabort% = 1 : ' flag "avorter l'action en cours" dim file$ : file$ = "" : ' nom du fichier chargé dabs le mémo dim folder$ : folder$ = file_extract_path$(param_value$(0)) : ' dossier initial, puis celui du fichier chargé dim i%, j%, k%, n%, s$, p%, c$, cs$, car%, key$ dim keys$(256) : ' tableau recevant key$ éclaté en caractères hexa dim nkeys%(256) : ' tableau recevant les indices de permutation dim dopassword% : dopassword% = 0 : ' flag "mot de passe général est requis" dim pwd$ : pwd$ = "" : ' mot de passe décodé end_sub
sub GUI() ' form principale full_space 0 : caption 0,title$ : on_close 0,close0 memo 100 : top 100,40 : left 100,10 : width 100,width_client(0) - 20 height 100,height_client(0) - 50 : bar_both 100 alpha 110 : top 110,10 : left 110,10 : caption 110,"Encryption key:" combo 111 : top 111,10 : left 111,100 : width 111,290 : item_add 111,"Default" : ' noms des clés on_click 111,selectkey1 edit 112 : top 112,10 : left 112,400 : width 112,width_client(0) - 310 : inactive 112 : ' clé sélectionn"e dlist 113 : ' pour les clés dlist 114 : ' temporaire pour le texte crypté save_dialog 400 : file_dialog 400,"Nouveau.ctx" : dir_dialog 400,folder$ open_dialog 401 : file_dialog 401,"Nouveau.ctx" : dir_dialog 401,folder$ ' form de gestion des clés de cryptage form 200 : hide 200 : width 200,800 : height 200,600 : caption 200,"Encryption key maintenance" on_close 200,close200 left 200,(screen_x-width(200))/2 : top 200,(screen_y-height(200))/2 alpha 201 : parent 201,200 : top 201,10 : left 201,10 : caption 201,"Selected key:" edit 211 : parent 211,200 : top 211,10 : left 211,100 : width 211,290 : inactive 211 edit 212 : parent 212,200 : top 212,40 : left 212,100 : width 212,width_client(200)-110 : inactive 212 alpha 202 : parent 202,200 : top 202,70 : left 202,10 : caption 202,"Key list:" list 213 : parent 213,200 : top 213,100 : left 213,10 : width 213,290 : height 213,450 on_click 213,selectkey button 220 : parent 220,200 : top 220,120 : left 220,330 : caption 220,"Add..." : on_click 220,addkey button 221 : parent 221,200 : top 221,160 : left 221,330 : caption 221,"Remove" : on_click 221,removekey button 222 : parent 222,200 : top 222,200 : left 222,330 : caption 222,"Rename" : on_click 222,renamekey ' form de confirmation de suppression d'une clé de cryptage form 300 : hide 300 : width 300,800 : height 300,600 : caption 300,"ATTENTION - DANGER" on_close 300,close300 left 300,(screen_x-width(300))/2 : top 300,(screen_y-height(300))/2 alpha 301 : parent 301,300 : top 301,50 : left 301,40 : caption 301,"!!! CAUTION DANGER !!!" font_size 301,48 : font_color 301,255,0,0 alpha 302 : parent 302,300 : top 302,150 : left 302,150 caption 302,"Any file encrypted with this key will not longer be readable !" font_size 302,14 : font_color 302,255,0,0 alpha 303 : parent 303,300 : top 303,220 : left 303,170 caption 303,"There will be no way to recover this key !" font_size 303,14 : font_color 303,255,0,0 button 304 : parent 304,300 : top 304,300 : left 304,100 : width 304,450 caption 304,"Abandon" : font_bold 304 : font_size 304,12 : on_click 304,abandondelete button 305 : parent 305,300 : top 305,300 : left 305,680 caption 305,"Do it !" : font_bold 305 : font_size 305,12 : on_click 305,executedelete ' form d'affichage dutexte crypté form 350 : hide 350 : width 350,800 : height 350,600 : caption 350,"Encrypted current text" on_close 350,close350 left 350,(screen_x-width(350))/2 : top 350,(screen_y-height(350))/2 memo 351 : parent 351,350 : full_space 351 : bar_both 351 ' form de gestion du mot de passe général form 500 : hide 500 : width 500,800 : height 500,600 : caption 500,"Master password" on_close 500,close500 left 500,(screen_x-width(500))/2 : top 500,(screen_y-height(500))/2 alpha 501 : parent 501,500 : top 501,40 : left 501,40 : font_size 501,24 caption 501,"No password is actually required !" alpha 502 : parent 502,500 : top 502,140 : left 502,40 : caption 502,"Password:" edit 503 : parent 503,500 : top 503,140 : left 503,100 : width 503,300 secret_on 503 button 510 : parent 510,500 : top 510,190 : left 510,100 : width 510,150 font_size 510,12 : caption 510,"Install password" : on_click 510,setpassword button 511 : parent 511,500 : top 511,190 : left 511,300 : width 511,150 font_size 511,12 : caption 511,"Abandon" : on_click 511,close500
' form de saisie du mot de passe général form 600 : hide 600 : width 600,800 : height 600,600 : caption 600,"Master password" on_close 600,close600 left 600,(screen_x-width(600))/2 : top 600,(screen_y-height(600))/2 alpha 601 : parent 601,600 : top 601,40 : left 601,40 : font_size 601,16 caption 601,"Enter your master password !" alpha 602 : parent 602,600 : top 602,140 : left 602,40 : caption 602,"Your password:" edit 603 : parent 603,600 : top 603,140 : left 603,150 : width 603,300 secret_on 603 button 610 : parent 610,600 : top 610,190 : left 610,150 : width 610,150 font_size 610,12 : caption 610,"Validate password" : on_click 610,validatepassword button 611 : parent 611,500 : top 611,190 : left 611,350 : width 611,150 font_size 611,12 : caption 611,"Abandon" : on_click 611,close600
end_sub
sub initialisations() main_menu 1 sub_menu 2 : parent 2,1 : caption 2,"Files" sub_menu 21 : parent 21,2 : caption 21,"New" : on_click 21,newtext sub_menu 22 : parent 22,2 : caption 22,"Open" : on_click 22,opentext sub_menu 29 : parent 29,2 : caption 29,"Show encrypted" : on_click 29,encryptedtext sub_menu 23 : parent 23,2 : caption 23,"Save" : on_click 23,savetext sub_menu 24 : parent 24,2 : caption 24,"Save as..." : on_click 24,savetextas sub_menu 25 : parent 25,2 : caption 25,"Clear" : on_click 25,cleartext sub_menu 26 : parent 26,2 : caption 26,"Close" : on_click 26,closetext sub_menu 27 : parent 27,2 : caption 27,"-" sub_menu 28 : parent 28,2 : caption 28,"Exit" : on_click 28,exitprog sub_menu 3 : parent 3,1 : caption 3,"Keys" sub_menu 31 : parent 31,3 : caption 31,"Manage keys" : on_click 31,managekeys sub_menu 32 : parent 32,3 : caption 32,"Manage password" : on_click 32,managepwd loadconfig() if dopassword%=1 end_if end_sub sub checkmodif() doabort% = 1 if modif%=1 doabort% = message_confirmation_yes_no("The text has been modified."+crlf$+"Discard le modifications ?") end_if end_sub
' générer une nouvelle clé sub generatekey() for i%=0 to 255 : ' vider la clé générée nkeys%(i%) = -1 next i% for i%=0 to 255 : ' pour chaque caractère à crypter: p% = rnd(255) : ' déterminer un emplacement aléatoire while nkeys%(p%)<>-1 : ' emplacement déjà utilisé ? p% = rnd(255) : ' en déterminer un autre... end_while nkeys%(p%) = i% : ' placer l'indice du caractère dans sa destination next i% key$ = "" for i%=0 to 255 key$ = key$ + right$("0"+hex$(nkeys%(i%)),2) next i% end_sub
sub loadconfig() clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 if file_exists(folder$+config$)=1 : ' est-ce qu'il y a déjà une config ? file_open_read 1,folder$+config$ : ' alors ouvrir ce fichier if file_eof(1)=0 : ' fichier non vide ? file_readln 1,s$ if left$(s$,9)="xDefault=" : ' un mot de passe général est requis ? pwd$ = mid$(s$,10,len(s$)) : ' mémoriser le mot de passe pour décryptage ultérieur caption 501,"A password is actually required !" dopassword% = 1 file_readln 1,s$ end_if if s$="Default" : ' le premier élément doit s'appeler "default" ! item_add 111,s$ : ' ajouter le nom "Default" à la liste des noms file_readln 1,key$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et la clé de cryptage qui va avec ' lire les clés supplémentaires while file_eof(1)=0 : ' est-ce qu'il y a d'autres clés ? file_readln 1,s$ item_add 111,s$ : ' alors charger les noms file_readln 1,key$ file_readln 1,s$ : ' et les clés qui vont avec key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et les clés de cryptage qui vont avec end_while item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur end_if file_close 1 if dopassword%=1 : ' la configuration requiert un mot de passe ? decryptstring(pwd$,1) : ' décrypter le mot de passe avec Default(résultat dans cs$) pwd$ = cs$ gosub askpassword end_if exit_sub : ' ici, la configuration existante a été chargée corrsctement end_if file_close 1 end_if clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 generatekey() : ' ici, générer la première clé "Default" item_add 111,"Default" : ' charger le nom imposé de la clé par défaut item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de la clé par défaut file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) file_close 1 end_sub sub saveconfig() file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$,1) : ' crypter le mot de passe avec Default, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if for i%=1 to count(111) file_writeln 1,item_read$(111,i%) : ' sauvegarder les noms des clés s$ = item_read$(113,i%) file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) next i% file_close 1 end_sub
sub encrypttext(act%) cs$ = "" : ' initialiser la chaîne cryptée if count(100)>0 : ' texte à crypter non vide ? s$ = text$(100) : ' prendre le texte complet key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée (hexa) : ' décoder la clé sélectionnée for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_if ' choix des sorties de résultats: if act%=0 : ' action 0: afficher le texte crypté ? clear 351 p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères item_add 351,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then item_add 351,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste end_if if act%=1 : ' action 1: sauvegarder le texte crypté ? file_open_write 1,folder$+file$ : ' écrire le texte encrypté dans cs$ p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères file_writeln 1,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then file_writeln 1,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste file_close 1 end_if end_sub
sub encryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = "" s$ = strng$ : ' prendre le string complet key$ = item_read$(113,id%) : ' prendre la clé id% (hexa) for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_sub
sub decryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = strng$ key$ = item_read$(113,id%) : ' prendre la clé Default (hexa) for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% n% = len(cs$)/2 s$ = "" for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% cs$ = s$ end_sub sub decrypttext() clear 100 : ' effacer la zone de texte à l'écran key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% file_open_read 1,folder$+file$ s$ = "" : ' préparer le texte décrypté while file_eof(1)=0 : ' traiter le fichier ligne par ligne (80 caractères) file_readln 1,cs$ n% = len(cs$)/2 for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% end_while file_close 1 text 100,s$ end_sub
newtext: checkmodif() if doabort%<>1 then return file$ = "" clear 100 caption 0,title$ modif% = 0 doabort% = 0 return opentext: checkmodif() if doabort%<>1 then return s$ = file_name$(401) if s$="_" then return if file_exists(s$)=0 message "Ce fichier n'existe pas:"+crlf$+s$ return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ decrypttext() modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return encryptedtext: encrypttext(0) inactive 0 show 350 return close350: hide 350 active 0 to_foreground 0 return managepwd: inactive 0 show 500 return setpassword: pwd$ = text$(503) if len(pwd$)=0 dopassword% = 0 caption 501,"No password is actually required !" else dopassword% = 1 caption 501,"A password is actually required !" end_if saveconfig() hide 500 active 0 to_foreground 0 return close500: hide 500 active 0 to_foreground 0 return askpassword: inactive 0 show 600 return validatepassword: s$ = text$(603) if s$<>pwd$ message "Your password is invalid !"+crlf$+crlf$+"Please try again..." terminate end_if hide 600 active 0 to_foreground 0 return close600: terminate return savetext: if file$="" gosub savetextas return end_if encrypttext(1) return savetextas: s$ = file_name$(400) if s$="_" then return if file_exists(s$)=1 if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ encrypttext(1) modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return cleartext: checkmodif() if doabort%<>1 then return clear 100 caption 0,title$ modif% = 0 doabort% = 0 return closetext: checkmodif() if doabort%<>1 then return file$ = "" caption 0,title$ modif% = 0 doabort% = 0 return exitprog: checkmodif() if doabort%<>1 then return terminate close0: checkmodif() if doabort%<>1 then return : ' juste pour la forme - on ne peut pas arrêter cela return managekeys: text 211,text$(111) text 212,text$(112) clear 213 for i%=1 to count(111) item_add 213,item_read$(111,i%) next i% item_select 213,item_index(111) inactive 0 show 200 return close200: hide 200 active 0 to_foreground 0 return selectkey: text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) item_select 111,item_index(213) text 112,item_read$(113,item_index(213)) return selectkey1: text 112,item_read$(113,item_index(111)) return addkey: s$ = message_input$("Add new encryption key","Key name:","") if s$="" then return for i%=1 to count(111) if s$=item_read$(111,i%) message "This key name exists already !" return end_if next i% generatekey() : ' ici, générer ne nouvelle clé item_add 111,s$ : ' charger le nouveau nom item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,count(111) : ' sélectionner la nouvelle clé text 112,item_read$(113,count(111)) : ' et affichier sa valeur item_add 213,s$ : ' actualiser l'affichage de la form de maintenance item_select 213,count(213) text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) saveconfig() return removekey: if item_index(213)<2 message "Please select a key (other than Default)" return end_if s$ = "Do you really want to delete permanently the key "+item_read$(213,item_index(213)) if message_confirmation_yes_no(s$)=1 inactive 200 show 300 return renamekey: s$ = message_input$("Rename an encryption key","New Key name:","") if s$="" then return p% = item_index(213) : ' récupérer l'index de la clé à renommer item_delete 213,p% : ' changer le nom dans la fenêtre de maintenance item_insert 213,p%,s$ item_select 213,p% item_delete 111,p% : ' changer le nom dans la fenêtre principale item_insert 111,p%,s$ item_select 211,p% text 211,s$ : ' afficher le nouveau nom dans la fenêtre de maintenance text 112,s$ : ' et dans la fenêtre principale saveconfig() return danger: inactive 0 show 300 return close300: hide 300 active 200 to_foreground 200 return abandondelete: gosub close300 return executedelete: item_delete 111,item_index(213) : ' supprimer la clé sur la page principale item_delete 113,item_index(213) : ' et sa valeur item_select 111,1 : ' sélectionner la clé par défaut text 112,item_read$(111,1) : ' et l'afficher item_delete 213,item_index(213) : ' supprimer la clé dans la page de maintenance des clés item_select 213,1 : ' sélectionner la clé par défaut text 211,item_read$(111,item_index(213)) : ' et actualiser l'affichage text 212,item_read$(113,item_index(213)) end_if saveconfig() gosub close300 return Et voici le fichier de configuration CryptedText.cnf avec 2 clés et le mot de passe "klaus" (sans les guillemets !): - Code:
-
xDefault=E7FDFCA49A Default C2BE691B6A0C214EF51FBCA1033EFF0AD68DDA2D585D6D1E267477285005557B24707FEFB5A6AF0D04950EF2BA44091CF3B4A7916C424301CC676EA57D5F467E 4DC531921625060BA92C2EADDB981A73EC2F2ADC0F3439BFF8AAB2D927E4F6DEFC458C3AD25438A09F53E7FDE9D8192B79579AC0A43280834000A22237D388AC C151F71371E2499630F9A3DD7A9C489DD735B652B0DF15C685EA64B7293F075E20657C1D72789387605BCB08973B5A3DD4681456EE0281BB619E2376948FD08E E5EB59908275CA5CC862F4B83611FA186312C9F0A8664F86BD4BCFB3FBCEE6106BE3FE3CC447E13389EDC7B1AE4CE84ACD8B176F9B8AF1C38499B9ABE0D141D5 Courrier professionnel C2BE691B6A0C214EF51FBCA1033EFF0AD68DDA2D585D6D1E267477285005557B24707FEFB5A6AF0D04950EF2BA44091CF3B4A7916C424301CC676EA57D5F467E 4DC531921625060BA92C2EADDB981A73EC2F2ADC0F3439BFF8AAB2D927E4F6DEFC458C3AD25438A09F53E7FDE9D8192B79579AC0A43280834000A22237D388AC C151F71371E2499630F9A3DD7A9C489DD735B652B0DF15C685EA64B7293F075E20657C1D72789387605BCB08973B5A3DD4681456EE0281BB619E2376948FD08E E5EB59908275CA5CC862F4B83611FA186312C9F0A8664F86BD4BCFB3FBCEE6106BE3FE3CC447E13389EDC7B1AE4CE84ACD8B176F9B8AF1C38499B9ABE0D141D5
Et un fichier crypté nommé docx.ctx contenant les commentaires du début de ce programme: - Code:
-
AF7B9595959595959595959595959595959595959595959595959595959595959595959595959595 959595959595959595959595959595959595031FAF7B957B7B7B7B31D27B2B57193857FCE9E9D27B 8C57402BC0D27BD2C07B3A898C57402BC0D27B3AD29A7BC0D283C0D29A44031FAF7B957B7B7B7BAD D27B8C57402BC0FC38D27B9AD27B54FC9FC07B9AD2FD19D87BA4D8D27B8CFD897B79A49F031FAF7B 957B7B7B7B2BD257E9A4C0D27BC019A49A7BFDD29A7B8CFC57FC8CC03357D29A7B3AD27B54FCE119 D87BFCFD89FCC0199F57D244031FAF7B957B7B7B7BAD19579A7B3AA47B1957D2E99FD2577B3A89E9 FC5757FC38D27B3AA47B2B57193857FCE9E9D2F27BA4D8D2031FAF7B957B7B7B7B8CFD897BD819E9 E989D27B92D254FCA4FDC07B9AD257FC7B8C578989D27BFCA4C019E9FCC09F79A4D2E9D2D8C04403 1FAF7B957B7B7B7B4D7B8CA0FC79A4D27BFDFCD88CD2E9D2D8C0F27B8CD2C0C0D27B8CFD897BD29A C07B9A89FDD28CC09F19D8D889D244031FAF7B957B7B7B7B1AD87B2BD2A4C07B8C5789D2577B3AAF FCA4C057D29A7B8CFD899A7BD2D87BFDD2A4577B3A19D8D8FCD8C07B031FAF7B957B7B7B7B3AD29A 7BD819E99A7B3A9F54548957D2D8C09A447BADD27BD819E94557D27B3AD27B8CFD899A7BD8AFD29A C0031FAF7B957B7B7B7B2BFC9A7BFD9FE99FC089447B1AD87B2BD2A4C07B9AA42B2B579FE9D2577B 3AD29A7B8CFD899A7BFC5319A4C089D29A6E031FAF7B957B7B7B7BE9FC9F9A7BFDFC7B8CFD897B92 D254FCA4FDC07BD29AC07B2B5719C0893889D2447B1AD87B2BD2A4C07BFCA49A9A9F031FAF7B957B 7B7B7B57D2D819E9E9D2577BA4D8D27B8CFD89D27BFC5319A4C089D27B0D9AFCA4547BFDFC7B8CFD 897B92D254FCA4FDC00444031FAF7B957B7B7B7BADD29A7B8CFD899A7B9A19D8C07BE989E919579F 9A89D29A7BD2D87B541957E9FCC07BA0D283FC3A898C9FE9FCFD44031FAF7B957B7B7B7BADD27B8C 57402BC0FC38D27B9AD27B54FC9FC07B897D8938FCFDD2E9D2D8C07BD2D87B541957E9FCC0031FAF 7B957B7B7B7BA0D283FC3A898C9FE9FCFDF27BFC32D28C7B011C7B8CFC57FC8CC03357D29A7BA0D2 83FC7B0D911C7B8CFC57FC8CC03357D29A031FAF7B957B7B7B7BD2D88C193A899A047B2BFC577BFD 9F38D8D2447BADD27B549F8CA09FD2577B8C57402BC0897B2B1957C0D2031FAF7B957B7B7B7BFDAF D283C0D2D89A9F19D87B95448CC083447BADD27B549F8CA09FD2577B3157402BC0D23ADCD283C044 8CD854031FAF7B957B7B7B7B8C19D8C09FD2D8C07BFDD29A7B8CFD899A7BFC32D28C7BFDD2A4577B D819E9447B0FD87B549F8CA09FD2577BD29AC0031FAF7B957B7B7B7B8C57402BC0897BFC32D28C7B A4D8D27B3AD29A7B8CFD899A7B2B57899AD2D8C0D29A7B0D107B8CA0199F9A9F577B240444031FAF 7B957B7B7B7BA9FD7BD8D27B2BD2A4C07BEDC057D27B3A898C193A897B79A4AFFC32D28C7BFDFC7B E9EDE9D27B8CFD897BFC40FCD8C0031FAF7B957B7B7B7B9AFC7B32FCFDD2A4577B3AAF19579F389F D8D27B247B7B7B7B7B7B7B7B7B7B7B7B031FAF7B95031FAF7B957B7B7B7B1AD87B2BD2A4C07B9FD8 9AC0FCFDFDD2577BA4D87BE919C07B3AD27B2BFC9A9AD27B3889D88957FCFD7B2B19A4577BFDAFFC 8C8C339A031FAF7B957B7B7B7BFCA47B2B57193857FCE9E9D2447B31D27BE919C07B3AD27B2BFC9A 9AD27BD29AC07BE989E919579F9A897B3AFCD89A7BFDFC031FAF7B957B7B7B7B2B57D2E99F3357D2 7BFD9F38D8D27B3AA47B549F8CA09FD2577B3AD27B8C19D8549F38A457FCC09F19D86E031FAF7B95 7B7B7B7BE9FC9F9A7B9FFD7BD29AC07B8C57402BC0897B2BFC577BFDFC7B8CFD897B92D254FCA4FD C044031FAF7B95031FAF7B957B7B7B7B2424242424242424247B4DDCDC1698DCA91A987B924D9806 162F7B242424242424242424031FAF7B95031FAF7B957B7B7B7B2AA42B2B579FE9D2577BA4D8D27B 8CFD897B57D2329FD2D8C07B107B2BD2573A57D27B921625A998A9DCA93416DB1698DC031FAF7B95 7B7B7B7BFDAFFC8C8C339A7B107BDC1A0F2A7BFDD29A7B549F8CA09FD2579A7B8C57402BC0899A7B 2BFC577B8CD2C0C0D27B8CFD897B24031FAF7B957B7B7B7B031FAF7B957B7B7B7B98167B2C4DDB4D A92A7B2A0F73732FA9DB162F7B0F98167B31AD167B1698311A2F167B0FDCA9ADA92A16167B24031F AF7B957B031FAF7B9595959595959595959595959595959595959595959595959595959595959595 95959595959595959595959595959595959595959595959595
| |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| | | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Ven 16 Fév 2024 - 16:00 | |
| Mode d'emploi:
A. démarrage sans données prélables: 1. choisir un dossier pour y copier le source ci-dessus 2. exécuter ce source ==> le programme crée automatiquement un fichier CryptedText.cnf avec une clé de cryptage nommée Default Un grand mémo s'affiche dans lequel on peut taper du texte ou copier du texte par copier/coller Au-dessus, un menu propose deux fonctions principales: Files et Keys Le menu Files donne accès aux fonctions habituelles (Open, Save, Save as, ...) Le menu Keys permet de gérer des clés de cryptage supplémentaires et et d'installer le mot de passe optionnel. 3. choisir le menu Manage Keys 4. cliquer sur le bouton Add ==> le programme demande un nom pour la nouvelle clé (une chaîne de caractères quelconque, non limitée) En validant le nom, une nouvelle clé est créée et ajoutée à la liste des clés. Elle est d'ores et déjà écrite dans le fichier de configuration. 5. Fermer cette fenêtre par la croix rouge 6. choisir la nouvelle clé par la combo tout en haut de l'écran (elle est peut-être déjà sélectionnée) 7. constituer un texte quelconque dans le grand mémo 8. ouvrir le menu Files 9. choisir l'option Save as... 10. naviguer dans le dossier de destination, saisir un nom de fichier en laissant l'extension *.ctx qui est obligatoire 11. valider le chois ==> le fichier est crypté et déposé dans le dossier choisi. 12. sortir du programme par le menu Files/Exit ou par la croix rouge 13. relancer le programme, choisir la clé comme auparavant 14. ouvrir le menu Files, choisir l'option Open 15 naviguer jusqu'au fichier créé et valider ==> suivant la taille du fichier, cela peut durer quelques secondes, mais les données décryptées s'afficheront dans le mémo
Supplément optionnel: mot de passe 1. lancer le programme 2. ouvrir le menu Keys 3. choisir l'option Manage Passord 4. saisir un mot de passe dans le champ approprié - ATTENTON - faire cela soigneusement ! 5. valider par le bouton "Install password" 6. sortir du programme par ma croix rouge ou le menu Files/exit
Lors du prochain lancement, le programme demandera le mot de passe avant de donner accès à ces fonctions.
B. Lancement avec un jeu d'essai préexistant 1. après l'installation du programme dans un dossier, y installer les fichiers supplémentaires, en provenance de mon post précédent. 2. ceci concerne le fichier CryptedText.cnf qui contient deux clés de cryptage et le mot de passe "klaus" (sans les guillemets !) 3. le fichier crypté doc.ctx qui contient la version cryptée des commentaires au début de ce programme. 4. lancer le programme, rentrer le mot de passe klaus 5. sélectionner la clé "Courrier professionnel" par la combo tout en haut de l'écran 6. ouvrir le menu Files et choisir l'option Open 7. naviguer jusqu'à doc.cts et valider ==> après quelques secondes d'attente, ces commentaires s'affichent ans le mémo
Le reste est laissé à l'imagination de l'utilisateur...
Petite info supplémentaire: Le menu Manage password permet de changer un mot de passe simplement en saisissant un nouveau dans le champ concerné puis valider par Install password. Pas d'autre contrôle... Idem pour supprimer le mot de passe: vider le champ de saisie et valider par Install password - il n'y a plus de mot de passe au prochain lancement. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Sam 17 Fév 2024 - 15:50 | |
| Ok ! Eh, serait-ce un cryptage que les services secrets eux-mêmes auraient bien du mal à déchiffrer ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Sam 17 Fév 2024 - 16:43 | |
| Non, je n'ai pas cette prétention... Il s'agit d'une simple substitution de caractères, de sorte qu'aucun ne soit à sa place nromale. Cependant, il ne s'agit pas d'un simple décalage - s'est une répartition aléatoire, différente pour chaque clé, générée par la fonction RND de Panoramic. Puis, le résultat est écrit sur disque sous forme hexadécimale. Evidemment, si l'on s'amuse à crypter à nouveau ce texte crypté, de préférence avec une autre clé, cela devient vraiment compliqué à craquer... si l'on ne dispose pas des clés. Cependant, il n'y a aucun moyen de retrouver ces clés. Même si l'on dispose de l'exécutable, et même du source, de ce programme, ce n'est pas possible. Seul point faible: le fichier CryptedText.cnf qui contient les clés. Si la CIA met la main sur ce fichier... Corollaire: ne jamais perdre ce fichier, car il est totalement impossible de reconstruire des clés perdues. Et donc, les textes cryptés par des clés perdues resteront définitivement du charabia... Autre corollaire: Si l'on veut transmettre des fichiers cryptés à un tiers et lui donner accès au contenu, il faut procéder comme suit: 1. créer une clé spécifique pour ce destinataire 2. crypter les fichiers pour ce destinataire uniquement avec cette clé 3. envoyer ces fichiers au destinataire (par mil, par exemple) 4. créer une copie de CryptedText.cnf 5. dans cette copie, laisser la ligne xDefault= (elle contient le mot de passe crypté) laisser également la ligne Default et les 4 lignes de code hexa suivantes laisser également la ligne pour la clé spécifique du destinataire avec ses 4 lignes hexa suivantes supprimer toutes les autres lignes 6. faire parvenir une copie de CryptedText.exe ainsi ue cet extrait du fichier cnf au destinataire 7. maintenant, il pourra lire les fichiers qui lui sont envoyés, créer des réponses cryptées par la même clé et les envoyer par mail en toute sécurité. Il serait facile d'ajouter une fonction "Export key" dans le menu Files qui fasse exactement cela...
Dernière édition par Klaus le Sam 17 Fév 2024 - 16:53, édité 1 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Sam 17 Fév 2024 - 16:50 | |
| Aïe, aïe, aïe, sacrée CIA ! Suggestion (si je puis me permettre) : Lorsqu'on crée un nouveau mot de passe (invisible), ce serait bien qu'on ait à le faire 2 fois, car si on fait une coquille en le tapant, sans s'en apercevoir, ce sera dur-dur de le retrouver... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Sam 17 Fév 2024 - 16:54 | |
| Bonne idée, celle double saisie : Je vais faire cela ainsi que la fonction "Export key"... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Sam 17 Fév 2024 - 17:54 | |
| Voici une nouvelle version du programme CryptedText, avec les ajouts suivants: 1. dans la fenêtre de définition du mot de passe, il faut le saisir dans deux champs distincts, et le contenu doit être identique 2 dans le menu Files, il y a une nouvelle ligne "Export key". Elle demande le nom d'une clé à exporter. La clé Default ne peut pas être exportée explicitement. Cette option crée un fichier CryptedText_xxx.cnf avec xxx = nom de la clé exportée. Il faut que la clé demandée existe dans la liste des clés. Le fichier CNF ainsi créé contient: - le mot de passe si un mot de passe est actif - la clé Default (utilisée pour crypter/décrypter le mot de passe) - la clé à exporter Toutes les autres clés sont ignorées. Voici le code: - Code:
-
' CryptedText.bas
' ******************************************************** ' * Ce programme crypte et décrypte des textes. ' * Le cryptage se fait selon une clé qui ' * permute tous les caractères de façon aléatoire. ' * Lors du oremier démarrage du programme, une ' * clé nommée Default sera créée automatiquement. ' * A chaque lancement, cette clé est sélectionnée. ' * On peut créer d'autres clés en leur donnant ' * des noms différents. Le nombre de clés n'est ' * pas limité. On peut supprimer des clés ajoutées; ' * mais la clé Default est protégée. On peut aussi ' * renommer une clé ajoutée (sauf la clé Default). ' * Les clés sont mémorisées en format hexadécimal. ' * Le cryptage se fait é=également en format ' * hexadécimal, avec 80 caractères hexa (40 caractères ' * encodés) par ligne. Le fichier crypté porte ' * l'extension *.ctx. Le fichier CryptedText.cnf ' * contient les clés avec leur nom. Un fichier est ' * crypté avec une des clés présentes (à choisir !). ' * Il ne peut être décodé qu'avec la même clé ayant ' * sa valeur d'origine ! ' * ' * On peut installer un mot de passe général pour l'accès ' * au programme. Ce mot de passe est mémorisé dans la ' * première ligne du fichier de configuration; ' * mais il est crypté par la clé Default. ' * ' * !!!!!!!!! ATTENTION DANGER !!!!!!!!! ' * ' * Supprimer une clé revient à perdre DEFINITIVEMENT ' * l'accès à TOUS les fichiers cryptés par cette clé ! ' * ' * NE JAMAIS SUPPRIMER UNE CLE ENCORE UTILISEE ! ' * ' *********************************************************
labels() constantes() variables() GUI() initialisations()
end
sub labels() label newtext, opentext, encryptedtext, savetext, savetextas, cleartext, closetext label exportkey, exitprog, close0, selectkey1 label managekeys, close200, selectkey, addkey, removekey, renamekey label danger, close300, abandondelete, executedelete label close350, managepwd, setpassword, close500 label askpassword, validatepassword, close600 end_sub
sub constantes() dim title$ : title$ = "CryptedText" dim config$ : config$ = "CryptedText.cnf" dim crlf$ : crlf$ = chr$(13) + chr$(10) end_sub
sub variables() dim modif% : modif% = 0 : ' flag "le fichier e, mémoire a été modifié" dim doabort% : doabort% = 1 : ' flag "avorter l'action en cours" dim file$ : file$ = "" : ' nom du fichier chargé dabs le mémo dim folder$ : folder$ = file_extract_path$(param_value$(0)) : ' dossier initial, puis celui du fichier chargé dim i%, j%, k%, n%, s$, p%, c$, cs$, car%, key$, k$ dim keys$(256) : ' tableau recevant key$ éclaté en caractères hexa dim nkeys%(256) : ' tableau recevant les indices de permutation dim dopassword% : dopassword% = 0 : ' flag "mot de passe général est requis" dim pwd$ : pwd$ = "" : ' mot de passe décodé end_sub
sub GUI() ' form principale full_space 0 : caption 0,title$ : on_close 0,close0 memo 100 : top 100,40 : left 100,10 : width 100,width_client(0) - 20 height 100,height_client(0) - 50 : bar_both 100 alpha 110 : top 110,10 : left 110,10 : caption 110,"Encryption key:" combo 111 : top 111,10 : left 111,100 : width 111,290 : item_add 111,"Default" : ' noms des clés on_click 111,selectkey1 edit 112 : top 112,10 : left 112,400 : width 112,width_client(0) - 310 : inactive 112 : ' clé sélectionn"e dlist 113 : ' pour les clés dlist 114 : ' temporaire pour le texte crypté save_dialog 400 : file_dialog 400,"Nouveau.ctx" : dir_dialog 400,folder$ open_dialog 401 : file_dialog 401,"Nouveau.ctx" : dir_dialog 401,folder$ ' form de gestion des clés de cryptage form 200 : hide 200 : width 200,800 : height 200,600 : caption 200,"Encryption key maintenance" on_close 200,close200 left 200,(screen_x-width(200))/2 : top 200,(screen_y-height(200))/2 alpha 201 : parent 201,200 : top 201,10 : left 201,10 : caption 201,"Selected key:" edit 211 : parent 211,200 : top 211,10 : left 211,100 : width 211,290 : inactive 211 edit 212 : parent 212,200 : top 212,40 : left 212,100 : width 212,width_client(200)-110 : inactive 212 alpha 202 : parent 202,200 : top 202,70 : left 202,10 : caption 202,"Key list:" list 213 : parent 213,200 : top 213,100 : left 213,10 : width 213,290 : height 213,450 on_click 213,selectkey button 220 : parent 220,200 : top 220,120 : left 220,330 : caption 220,"Add..." : on_click 220,addkey button 221 : parent 221,200 : top 221,160 : left 221,330 : caption 221,"Remove" : on_click 221,removekey button 222 : parent 222,200 : top 222,200 : left 222,330 : caption 222,"Rename" : on_click 222,renamekey ' form de confirmation de suppression d'une clé de cryptage form 300 : hide 300 : width 300,800 : height 300,600 : caption 300,"ATTENTION - DANGER" on_close 300,close300 left 300,(screen_x-width(300))/2 : top 300,(screen_y-height(300))/2 alpha 301 : parent 301,300 : top 301,50 : left 301,40 : caption 301,"!!! CAUTION DANGER !!!" font_size 301,48 : font_color 301,255,0,0 alpha 302 : parent 302,300 : top 302,150 : left 302,150 caption 302,"Any file encrypted with this key will not longer be readable !" font_size 302,14 : font_color 302,255,0,0 alpha 303 : parent 303,300 : top 303,220 : left 303,170 caption 303,"There will be no way to recover this key !" font_size 303,14 : font_color 303,255,0,0 button 304 : parent 304,300 : top 304,300 : left 304,100 : width 304,450 caption 304,"Abandon" : font_bold 304 : font_size 304,12 : on_click 304,abandondelete button 305 : parent 305,300 : top 305,300 : left 305,680 caption 305,"Do it !" : font_bold 305 : font_size 305,12 : on_click 305,executedelete ' form d'affichage du texte crypté form 350 : hide 350 : width 350,800 : height 350,600 : caption 350,"Encrypted current text" on_close 350,close350 left 350,(screen_x-width(350))/2 : top 350,(screen_y-height(350))/2 memo 351 : parent 351,350 : full_space 351 : bar_both 351 ' form de gestion du mot de passe général form 500 : hide 500 : width 500,800 : height 500,600 : caption 500,"Master password" on_close 500,close500 left 500,(screen_x-width(500))/2 : top 500,(screen_y-height(500))/2 alpha 501 : parent 501,500 : top 501,40 : left 501,40 : font_size 501,24 caption 501,"No password is actually required !" alpha 502 : parent 502,500 : top 502,140 : left 502,40 : caption 502,"Password:" edit 503 : parent 503,500 : top 503,140 : left 503,100 : width 503,300 secret_on 503 alpha 504 : parent 504,500 : top 504,170 : left 504,40 : caption 504,"Password:" edit 505 : parent 505,500 : top 505,170 : left 505,100 : width 505,300 secret_on 505 button 510 : parent 510,500 : top 510,220 : left 510,100 : width 510,150 font_size 510,12 : caption 510,"Install password" : on_click 510,setpassword button 511 : parent 511,500 : top 511,220 : left 511,300 : width 511,150 font_size 511,12 : caption 511,"Abandon" : on_click 511,close500
' form de saisie du mot de passe général form 600 : hide 600 : width 600,800 : height 600,600 : caption 600,"Master password" on_close 600,close600 left 600,(screen_x-width(600))/2 : top 600,(screen_y-height(600))/2 alpha 601 : parent 601,600 : top 601,40 : left 601,40 : font_size 601,16 caption 601,"Enter your master password !" alpha 602 : parent 602,600 : top 602,140 : left 602,40 : caption 602,"Your password:" edit 603 : parent 603,600 : top 603,140 : left 603,150 : width 603,300 secret_on 603 button 610 : parent 610,600 : top 610,190 : left 610,150 : width 610,150 font_size 610,12 : caption 610,"Validate password" : on_click 610,validatepassword button 611 : parent 611,500 : top 611,190 : left 611,350 : width 611,150 font_size 611,12 : caption 611,"Abandon" : on_click 611,close600
end_sub
sub initialisations() main_menu 1 sub_menu 2 : parent 2,1 : caption 2,"Files" sub_menu 21 : parent 21,2 : caption 21,"New" : on_click 21,newtext sub_menu 22 : parent 22,2 : caption 22,"Open" : on_click 22,opentext sub_menu 31 : parent 31,2 : caption 31,"Show encrypted" : on_click 31,encryptedtext sub_menu 23 : parent 23,2 : caption 23,"Save" : on_click 23,savetext sub_menu 24 : parent 24,2 : caption 24,"Save as..." : on_click 24,savetextas sub_menu 25 : parent 25,2 : caption 25,"Clear" : on_click 25,cleartext sub_menu 26 : parent 26,2 : caption 26,"Close" : on_click 26,closetext sub_menu 27 : parent 27,2 : caption 27,"-" sub_menu 28 : parent 28,2 : caption 28,"Export key" : on_click 28,exportkey sub_menu 29 : parent 29,2 : caption 29,"-" sub_menu 30 : parent 30,2 : caption 30,"Exit" : on_click 30,exitprog sub_menu 4 : parent 4,1 : caption 4,"Keys" sub_menu 41 : parent 41,4 : caption 41,"Manage keys" : on_click 41,managekeys sub_menu 42 : parent 42,4 : caption 42,"Manage password" : on_click 42,managepwd loadconfig() if dopassword%=1 end_if end_sub sub checkmodif() doabort% = 1 if modif%=1 doabort% = message_confirmation_yes_no("The text has been modified."+crlf$+"Discard le modifications ?") end_if end_sub
' générer une nouvelle clé sub generatekey() for i%=0 to 255 : ' vider la clé générée nkeys%(i%) = -1 next i% for i%=0 to 255 : ' pour chaque caractère à crypter: p% = rnd(255) : ' déterminer un emplacement aléatoire while nkeys%(p%)<>-1 : ' emplacement déjà utilisé ? p% = rnd(255) : ' en déterminer un autre... end_while nkeys%(p%) = i% : ' placer l'indice du caractère dans sa destination next i% key$ = "" for i%=0 to 255 key$ = key$ + right$("0"+hex$(nkeys%(i%)),2) next i% end_sub
sub loadconfig() clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 if file_exists(folder$+config$)=1 : ' est-ce qu'il y a déjà une config ? file_open_read 1,folder$+config$ : ' alors ouvrir ce fichier if file_eof(1)=0 : ' fichier non vide ? file_readln 1,s$ if left$(s$,9)="xDefault=" : ' un mot de passe général est requis ? pwd$ = mid$(s$,10,len(s$)) : ' mémoriser le mot de passe pour décryptage ultérieur caption 501,"A password is actually required !" dopassword% = 1 file_readln 1,s$ end_if if s$="Default" : ' le premier élément doit s'appeler "default" ! item_add 111,s$ : ' ajouter le nom "Default" à la liste des noms file_readln 1,key$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et la clé de cryptage qui va avec ' lire les clés supplémentaires while file_eof(1)=0 : ' est-ce qu'il y a d'autres clés ? file_readln 1,s$ item_add 111,s$ : ' alors charger les noms file_readln 1,key$ file_readln 1,s$ : ' et les clés qui vont avec key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et les clés de cryptage qui vont avec end_while item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur end_if file_close 1 if dopassword%=1 : ' la configuration requiert un mot de passe ? decryptstring(pwd$,1) : ' décrypter le mot de passe avec Default(résultat dans cs$) pwd$ = cs$ gosub askpassword end_if exit_sub : ' ici, la configuration existante a été chargée corrsctement end_if file_close 1 end_if clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 generatekey() : ' ici, générer la première clé "Default" item_add 111,"Default" : ' charger le nom imposé de la clé par défaut item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de la clé par défaut file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) file_close 1 end_sub sub saveconfig() file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$,1) : ' crypter le mot de passe avec Default, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if for i%=1 to count(111) file_writeln 1,item_read$(111,i%) : ' sauvegarder les noms des clés s$ = item_read$(113,i%) file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) next i% file_close 1 end_sub
sub doexportkey() k$ = message_input$("Export a key","Name of the key to export:","") if k$="" then exit_sub if k$="Default" message "This key cannot be exported ! " exit_sub end_if n% = 0 for i%=1 to count(111) : ' chercher la clé demandée if k$=item_read$(111,i%) n% = i% exit_for end_if next i% if n%=0 message "This key does not exist !" exit_sub end_if file_open_write 1,folder$+"CryptedText_"+k$+".cnf" : ' créer le fichier de configuration d'extraction if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$,1) : ' crypter le mot de passe avec Default, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de a clé Default s$ = item_read$(113,1) file_writeln 1,mid$(s$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(s$,129,128) file_writeln 1,mid$(s$,257,128) file_writeln 1,mid$(s$,385,128) file_writeln 1,item_read$(111,n%) : ' sauvegarder le nom de a clé à exporter s$ = item_read$(113,n%) file_writeln 1,mid$(s$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(s$,129,128) file_writeln 1,mid$(s$,257,128) file_writeln 1,mid$(s$,385,128) file_close 1 message "The key "+k$+" has been exported into:"+crlf$+folder$+"CryptedText_"+k$+".cnf" end_sub
sub encrypttext(act%) cs$ = "" : ' initialiser la chaîne cryptée if count(100)>0 : ' texte à crypter non vide ? s$ = text$(100) : ' prendre le texte complet key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée (hexa) : ' décoder la clé sélectionnée for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_if ' choix des sorties de résultats: if act%=0 : ' action 0: afficher le texte crypté ? clear 351 p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères item_add 351,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then item_add 351,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste end_if if act%=1 : ' action 1: sauvegarder le texte crypté ? file_open_write 1,folder$+file$ : ' écrire le texte encrypté dans cs$ p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères file_writeln 1,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then file_writeln 1,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste file_close 1 end_if end_sub
sub encryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = "" s$ = strng$ : ' prendre le string complet key$ = item_read$(113,id%) : ' prendre la clé id% (hexa) for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_sub
sub decryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = strng$ key$ = item_read$(113,id%) : ' prendre la clé Default (hexa) for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% n% = len(cs$)/2 s$ = "" for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% cs$ = s$ end_sub sub decrypttext() clear 100 : ' effacer la zone de texte à l'écran key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% file_open_read 1,folder$+file$ s$ = "" : ' préparer le texte décrypté while file_eof(1)=0 : ' traiter le fichier ligne par ligne (80 caractères) file_readln 1,cs$ n% = len(cs$)/2 for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% end_while file_close 1 text 100,s$ end_sub
newtext: checkmodif() if doabort%<>1 then return file$ = "" clear 100 caption 0,title$ modif% = 0 doabort% = 0 return opentext: checkmodif() if doabort%<>1 then return s$ = file_name$(401) if s$="_" then return if file_exists(s$)=0 message "Ce fichier n'existe pas:"+crlf$+s$ return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ decrypttext() modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return encryptedtext: encrypttext(0) inactive 0 show 350 return close350: hide 350 active 0 to_foreground 0 return managepwd: inactive 0 text 503,pwd$ text 505,pwd$ show 500 return setpassword: if text$(503)<>text$(505) message "The 2 passwords must be identical !" gosub close500 return end_if pwd$ = text$(503) if len(pwd$)=0 dopassword% = 0 caption 501,"No password is actually required !" else dopassword% = 1 caption 501,"A password is actually required !" end_if saveconfig() hide 500 active 0 to_foreground 0 return close500: hide 500 active 0 to_foreground 0 return askpassword: inactive 0 show 600 return validatepassword: s$ = text$(603) if s$<>pwd$ message "Your password is invalid !"+crlf$+crlf$+"Please try again..." terminate end_if hide 600 active 0 to_foreground 0 return close600: terminate return savetext: if file$="" gosub savetextas return end_if encrypttext(1) return savetextas: s$ = file_name$(400) if s$="_" then return if file_exists(s$)=1 if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ encrypttext(1) modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return cleartext: checkmodif() if doabort%<>1 then return clear 100 caption 0,title$ modif% = 0 doabort% = 0 return closetext: checkmodif() if doabort%<>1 then return file$ = "" caption 0,title$ modif% = 0 doabort% = 0 return exportkey: doexportkey() return exitprog: checkmodif() if doabort%<>1 then return terminate close0: checkmodif() if doabort%<>1 then return : ' juste pour la forme - on ne peut pas arrêter cela return managekeys: text 211,text$(111) text 212,text$(112) clear 213 for i%=1 to count(111) item_add 213,item_read$(111,i%) next i% item_select 213,item_index(111) inactive 0 show 200 return close200: hide 200 active 0 to_foreground 0 return selectkey: text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) item_select 111,item_index(213) text 112,item_read$(113,item_index(213)) return selectkey1: text 112,item_read$(113,item_index(111)) return addkey: s$ = message_input$("Add new encryption key","Key name:","") if s$="" then return for i%=1 to count(111) if s$=item_read$(111,i%) message "This key name exists already !" return end_if next i% generatekey() : ' ici, générer ne nouvelle clé item_add 111,s$ : ' charger le nouveau nom item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,count(111) : ' sélectionner la nouvelle clé text 112,item_read$(113,count(111)) : ' et affichier sa valeur item_add 213,s$ : ' actualiser l'affichage de la form de maintenance item_select 213,count(213) text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) saveconfig() return removekey: if item_index(213)<2 message "Please select a key (other than Default)" return end_if s$ = "Do you really want to delete permanently the key "+item_read$(213,item_index(213)) if message_confirmation_yes_no(s$)=1 inactive 200 show 300 return renamekey: s$ = message_input$("Rename an encryption key","New Key name:","") if s$="" then return p% = item_index(213) : ' récupérer l'index de la clé à renommer item_delete 213,p% : ' changer le nom dans la fenêtre de maintenance item_insert 213,p%,s$ item_select 213,p% item_delete 111,p% : ' changer le nom dans la fenêtre principale item_insert 111,p%,s$ item_select 211,p% text 211,s$ : ' afficher le nouveau nom dans la fenêtre de maintenance text 112,s$ : ' et dans la fenêtre principale saveconfig() return danger: inactive 0 show 300 return close300: hide 300 active 200 to_foreground 200 return abandondelete: gosub close300 return executedelete: item_delete 111,item_index(213) : ' supprimer la clé sur la page principale item_delete 113,item_index(213) : ' et sa valeur item_select 111,1 : ' sélectionner la clé par défaut text 112,item_read$(111,1) : ' et l'afficher item_delete 213,item_index(213) : ' supprimer la clé dans la page de maintenance des clés item_select 213,1 : ' sélectionner la clé par défaut text 211,item_read$(111,item_index(213)) : ' et actualiser l'affichage text 212,item_read$(113,item_index(213)) end_if saveconfig() gosub close300 return | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 16:14 | |
| Voici une nouvelle version du programme CryptedText. Les fonctions restent inchangées, mais j'ai ajouté un écran Apropos ainsi d'un écran d'aide. L'aide s'affiche via un fichier HTML pour une mise en page plus agréable. Il y a aussi une navigation à travers le fichier d'aide, via des liens et menus HTML. Ce fichier nommé CryptedTextHelp.html est affiché via Edge (MicroSoft). S'il vous faut un autre browser, changez la ligne 201: - Code:
-
file_writeln 1, "start msedge.exe "+chr$(34)+"File:///"+progfolder$+"CryptedText.html"+chr$(34) Voici le code Panoramic: - Code:
-
' CryptedText.bas
' ******************************************************** ' * Ce programme crypte et décrypte des textes. ' * Le cryptage se fait selon une clé qui ' * permute tous les caractères de façon aléatoire. ' * Lors du oremier démarrage du programme, une ' * clé nommée Default sera créée automatiquement. ' * A chaque lancement, cette clé est sélectionnée. ' * On peut créer d'autres clés en leur donnant ' * des noms différents. Le nombre de clés n'est ' * pas limité. On peut supprimer des clés ajoutées; ' * mais la clé Default est protégée. On peut aussi ' * renommer une clé ajoutée (sauf la clé Default). ' * Les clés sont mémorisées en format hexadécimal. ' * Le cryptage se fait é=également en format ' * hexadécimal, avec 80 caractères hexa (40 caractères ' * encodés) par ligne. Le fichier crypté porte ' * l'extension *.ctx. Le fichier CryptedText.cnf ' * contient les clés avec leur nom. Un fichier est ' * crypté avec une des clés présentes (à choisir !). ' * Il ne peut être décodé qu'avec la même clé ayant ' * sa valeur d'origine ! ' * ' * On peut installer un mot de passe général pour l'accès ' * au programme. Ce mot de passe est mémorisé dans la ' * première ligne du fichier de configuration; ' * mais il est crypté par la clé Default. ' * ' * !!!!!!!!! ATTENTION DANGER !!!!!!!!! ' * ' * Supprimer une clé revient à perdre DEFINITIVEMENT ' * l'accès à TOUS les fichiers cryptés par cette clé ! ' * ' * NE JAMAIS SUPPRIMER UNE CLE ENCORE UTILISEE ! ' * ' *********************************************************
labels() constantes() variables() GUI() initialisations()
end
sub labels() label newtext, opentext, encryptedtext, savetext, savetextas, cleartext, closetext label exportkey, exitprog, close0, selectkey1, help, about label managekeys, close200, selectkey, addkey, removekey, renamekey label danger, close300, abandondelete, executedelete label close350, managepwd, setpassword, close500 label askpassword, validatepassword, close600, close700, close800 end_sub
sub constantes() dim title$ : title$ = "CryptedText" dim config$ : config$ = "CryptedText.cnf" dim crlf$ : crlf$ = chr$(13) + chr$(10) dim progfolder$ : progfolder$ = file_extract_path$(param_value$(0)) : ' dossier de CryptedText.exe dim helpfile$ : helpfile$ = progfolder$ + title$ + "Help.bat" end_sub
sub variables() dim modif% : modif% = 0 : ' flag "le fichier e, mémoire a été modifié" dim doabort% : doabort% = 1 : ' flag "avorter l'action en cours" dim file$ : file$ = "" : ' nom du fichier chargé dabs le mémo dim folder$ : folder$ = file_extract_path$(param_value$(0)) : ' dossier initial, puis celui du fichier chargé dim i%, j%, k%, n%, s$, p%, c$, cs$, car%, key$, k$ dim keys$(256) : ' tableau recevant key$ éclaté en caractères hexa dim nkeys%(256) : ' tableau recevant les indices de permutation dim dopassword% : dopassword% = 0 : ' flag "mot de passe général est requis" dim pwd$ : pwd$ = "" : ' mot de passe décodé end_sub
sub GUI() ' form principale full_space 0 : caption 0,title$ : on_close 0,close0 memo 100 : top 100,40 : left 100,10 : width 100,width_client(0) - 20 height 100,height_client(0) - 50 : bar_both 100 alpha 110 : top 110,10 : left 110,10 : caption 110,"Encryption key:" combo 111 : top 111,10 : left 111,100 : width 111,290 : item_add 111,"Default" : ' noms des clés on_click 111,selectkey1 edit 112 : top 112,10 : left 112,400 : width 112,width_client(0) - 310 : inactive 112 : ' clé sélectionn"e dlist 113 : ' pour les clés dlist 114 : ' temporaire pour le texte crypté save_dialog 400 : file_dialog 400,"Nouveau.ctx" : dir_dialog 400,folder$ open_dialog 401 : file_dialog 401,"Nouveau.ctx" : dir_dialog 401,folder$ ' form de gestion des clés de cryptage form 200 : hide 200 : width 200,800 : height 200,600 : caption 200,"Encryption key maintenance" on_close 200,close200 left 200,(screen_x-width(200))/2 : top 200,(screen_y-height(200))/2 alpha 201 : parent 201,200 : top 201,10 : left 201,10 : caption 201,"Selected key:" edit 211 : parent 211,200 : top 211,10 : left 211,100 : width 211,290 : inactive 211 edit 212 : parent 212,200 : top 212,40 : left 212,100 : width 212,width_client(200)-110 : inactive 212 alpha 202 : parent 202,200 : top 202,70 : left 202,10 : caption 202,"Key list:" list 213 : parent 213,200 : top 213,100 : left 213,10 : width 213,290 : height 213,450 on_click 213,selectkey button 220 : parent 220,200 : top 220,120 : left 220,330 : caption 220,"Add..." : on_click 220,addkey button 221 : parent 221,200 : top 221,160 : left 221,330 : caption 221,"Remove" : on_click 221,removekey button 222 : parent 222,200 : top 222,200 : left 222,330 : caption 222,"Rename" : on_click 222,renamekey ' form de confirmation de suppression d'une clé de cryptage form 300 : hide 300 : width 300,800 : height 300,600 : caption 300,"ATTENTION - DANGER" on_close 300,close300 left 300,(screen_x-width(300))/2 : top 300,(screen_y-height(300))/2 alpha 301 : parent 301,300 : top 301,50 : left 301,40 : caption 301,"!!! CAUTION DANGER !!!" font_size 301,48 : font_color 301,255,0,0 alpha 302 : parent 302,300 : top 302,150 : left 302,150 caption 302,"Any file encrypted with this key will not longer be readable !" font_size 302,14 : font_color 302,255,0,0 alpha 303 : parent 303,300 : top 303,220 : left 303,170 caption 303,"There will be no way to recover this key !" font_size 303,14 : font_color 303,255,0,0 button 304 : parent 304,300 : top 304,300 : left 304,100 : width 304,450 caption 304,"Abandon" : font_bold 304 : font_size 304,12 : on_click 304,abandondelete button 305 : parent 305,300 : top 305,300 : left 305,680 caption 305,"Do it !" : font_bold 305 : font_size 305,12 : on_click 305,executedelete ' form d'affichage du texte crypté form 350 : hide 350 : width 350,800 : height 350,600 : caption 350,"Encrypted current text" on_close 350,close350 left 350,(screen_x-width(350))/2 : top 350,(screen_y-height(350))/2 memo 351 : parent 351,350 : full_space 351 : bar_both 351 ' form de gestion du mot de passe général form 500 : hide 500 : width 500,800 : height 500,600 : caption 500,"Master password" on_close 500,close500 left 500,(screen_x-width(500))/2 : top 500,(screen_y-height(500))/2 alpha 501 : parent 501,500 : top 501,40 : left 501,40 : font_size 501,24 caption 501,"No password is actually required !" alpha 502 : parent 502,500 : top 502,140 : left 502,40 : caption 502,"Password:" edit 503 : parent 503,500 : top 503,140 : left 503,100 : width 503,300 secret_on 503 alpha 504 : parent 504,500 : top 504,170 : left 504,40 : caption 504,"Password:" edit 505 : parent 505,500 : top 505,170 : left 505,100 : width 505,300 secret_on 505 button 510 : parent 510,500 : top 510,220 : left 510,100 : width 510,150 font_size 510,12 : caption 510,"Install password" : on_click 510,setpassword button 511 : parent 511,500 : top 511,220 : left 511,300 : width 511,150 font_size 511,12 : caption 511,"Abandon" : on_click 511,close500
' form de saisie du mot de passe général form 600 : hide 600 : width 600,800 : height 600,600 : caption 600,"Master password" on_close 600,close600 left 600,(screen_x-width(600))/2 : top 600,(screen_y-height(600))/2 alpha 601 : parent 601,600 : top 601,40 : left 601,40 : font_size 601,16 caption 601,"Enter your master password !" alpha 602 : parent 602,600 : top 602,140 : left 602,40 : caption 602,"Your password:" edit 603 : parent 603,600 : top 603,140 : left 603,150 : width 603,300 secret_on 603 button 610 : parent 610,600 : top 610,190 : left 610,150 : width 610,150 font_size 610,12 : caption 610,"Validate password" : on_click 610,validatepassword button 611 : parent 611,500 : top 611,190 : left 611,350 : width 611,150 font_size 611,12 : caption 611,"Abandon" : on_click 611,close600
' form apropos form 700 : hide 700 : width 700,800 : height 700,600 : caption 700,"About this program" on_close 700,close700 left 700,(screen_x-width(700))/2 : top 700,(screen_y-height(700))/2 alpha 701 : parent 701,700 : top 701,40 : left 701,40 : caption 701,"Author:" alpha 702 : parent 702,700 : top 702,40 : left 702,150 : caption 702,"Klaus" font_bold 702 : font_size 702,12 alpha 703 : parent 703,700 : top 703,80 : left 703,40 : caption 703,"Date:" alpha 704 : parent 704,700 : top 704,80 : left 704,150 : caption 704,"17 / 02 / 2023" font_bold 704 : font_size 704,12 alpha 705 : parent 705,700 : top 705,120 : left 705,40 : caption 705,"Licence:" alpha 706 : parent 706,700 : top 706,120 : left 706,150 : caption 706,"Freeware for any usage" font_bold 706 : font_size 706,12 alpha 707 : parent 707,700 : top 707,160 : left 707,40 : caption 707,"Written in:" alpha 708 : parent 708,700 : top 708,160 : left 708,150 : caption 708,"Pure Panoramic" font_bold 708 : font_size 708,12
end_sub
sub initialisations() main_menu 1 sub_menu 2 : parent 2,1 : caption 2,"Files" sub_menu 21 : parent 21,2 : caption 21,"New" : on_click 21,newtext sub_menu 22 : parent 22,2 : caption 22,"Open" : on_click 22,opentext sub_menu 31 : parent 31,2 : caption 31,"Show encrypted" : on_click 31,encryptedtext sub_menu 23 : parent 23,2 : caption 23,"Save" : on_click 23,savetext sub_menu 24 : parent 24,2 : caption 24,"Save as..." : on_click 24,savetextas sub_menu 25 : parent 25,2 : caption 25,"Clear" : on_click 25,cleartext sub_menu 26 : parent 26,2 : caption 26,"Close" : on_click 26,closetext sub_menu 27 : parent 27,2 : caption 27,"-" sub_menu 28 : parent 28,2 : caption 28,"Export key" : on_click 28,exportkey sub_menu 29 : parent 29,2 : caption 29,"-" sub_menu 30 : parent 30,2 : caption 30,"Exit" : on_click 30,exitprog sub_menu 4 : parent 4,1 : caption 4,"Keys" sub_menu 41 : parent 41,4 : caption 41,"Manage keys" : on_click 41,managekeys sub_menu 42 : parent 42,4 : caption 42,"Manage password" : on_click 42,managepwd sub_menu 5 : parent 5,1 : caption 5,"?" sub_menu 51 : parent 51,5 : caption 51,"Help" : on_click 51,help sub_menu 52 : parent 52,5 : caption 52,"About" : on_click 52,about loadconfig() if file_exists(helpfile$)=0 file_open_write 1,helpfile$ file_writeln 1, "start msedge.exe "+chr$(34)+"File:///"+progfolder$+"CryptedText.html"+chr$(34) file_close 1 end_if end_sub sub checkmodif() doabort% = 1 if modif%=1 doabort% = message_confirmation_yes_no("The text has been modified."+crlf$+"Discard le modifications ?") end_if end_sub
' générer une nouvelle clé sub generatekey() for i%=0 to 255 : ' vider la clé générée nkeys%(i%) = -1 next i% for i%=0 to 255 : ' pour chaque caractère à crypter: p% = rnd(255) : ' déterminer un emplacement aléatoire while nkeys%(p%)<>-1 : ' emplacement déjà utilisé ? p% = rnd(255) : ' en déterminer un autre... end_while nkeys%(p%) = i% : ' placer l'indice du caractère dans sa destination next i% key$ = "" for i%=0 to 255 key$ = key$ + right$("0"+hex$(nkeys%(i%)),2) next i% end_sub
sub loadconfig() clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 if file_exists(folder$+config$)=1 : ' est-ce qu'il y a déjà une config ? file_open_read 1,folder$+config$ : ' alors ouvrir ce fichier if file_eof(1)=0 : ' fichier non vide ? file_readln 1,s$ if left$(s$,9)="xDefault=" : ' un mot de passe général est requis ? pwd$ = mid$(s$,10,len(s$)) : ' mémoriser le mot de passe pour décryptage ultérieur caption 501,"A password is actually required !" dopassword% = 1 file_readln 1,s$ end_if if s$="Default" : ' le premier élément doit s'appeler "default" ! item_add 111,s$ : ' ajouter le nom "Default" à la liste des noms file_readln 1,key$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et la clé de cryptage qui va avec ' lire les clés supplémentaires while file_eof(1)=0 : ' est-ce qu'il y a d'autres clés ? file_readln 1,s$ item_add 111,s$ : ' alors charger les noms file_readln 1,key$ file_readln 1,s$ : ' et les clés qui vont avec key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ file_readln 1,s$ key$ = key$ + s$ item_add 113,key$ : ' et les clés de cryptage qui vont avec end_while item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur end_if file_close 1 if dopassword%=1 : ' la configuration requiert un mot de passe ? decryptstring(pwd$,1) : ' décrypter le mot de passe avec Default(résultat dans cs$) pwd$ = cs$ gosub askpassword end_if exit_sub : ' ici, la configuration existante a été chargée corrsctement end_if file_close 1 end_if clear 111 : ' vider la liste des noms et des cles de cryptage clear 113 generatekey() : ' ici, générer la première clé "Default" item_add 111,"Default" : ' charger le nom imposé de la clé par défaut item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,1 : ' par défaut, sélectionner la clé "Default" text 112,item_read$(113,1) : ' et affichier sa valeur file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de la clé par défaut file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) file_close 1 end_sub sub saveconfig() file_open_write 1,folder$+config$ : ' créer ou recréer le fichier de configuration if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$,1) : ' crypter le mot de passe avec Default, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if for i%=1 to count(111) file_writeln 1,item_read$(111,i%) : ' sauvegarder les noms des clés s$ = item_read$(113,i%) file_writeln 1,mid$(key$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(key$,129,128) file_writeln 1,mid$(key$,257,128) file_writeln 1,mid$(key$,385,128) next i% file_close 1 end_sub
sub doexportkey() k$ = message_input$("Export a key","Name of the key to export:","") if k$="" then exit_sub if k$="Default" message "This key cannot be exported ! " exit_sub end_if n% = 0 for i%=1 to count(111) : ' chercher la clé demandée if k$=item_read$(111,i%) n% = i% exit_for end_if next i% if n%=0 message "This key does not exist !" exit_sub end_if file_open_write 1,folder$+"CryptedText_"+k$+".cnf" : ' créer le fichier de configuration d'extraction if dopassword%=1 : ' écrire le mot de passe si nécessaire encryptstring(pwd$,1) : ' crypter le mot de passe avec Default, résultat dans cs$ file_writeln 1,"xDefault="+cs$ end_if file_writeln 1,item_read$(111,1) : ' sauvegarder le nom de a clé Default s$ = item_read$(113,1) file_writeln 1,mid$(s$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(s$,129,128) file_writeln 1,mid$(s$,257,128) file_writeln 1,mid$(s$,385,128) file_writeln 1,item_read$(111,n%) : ' sauvegarder le nom de a clé à exporter s$ = item_read$(113,n%) file_writeln 1,mid$(s$,1,128) : ' et sa valeur en 4 lignes (64 car *2 car hexa !) file_writeln 1,mid$(s$,129,128) file_writeln 1,mid$(s$,257,128) file_writeln 1,mid$(s$,385,128) file_close 1 message "The key "+k$+" has been exported into:"+crlf$+folder$+"CryptedText_"+k$+".cnf" end_sub
sub encrypttext(act%) cs$ = "" : ' initialiser la chaîne cryptée if count(100)>0 : ' texte à crypter non vide ? s$ = text$(100) : ' prendre le texte complet key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée (hexa) : ' décoder la clé sélectionnée for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_if ' choix des sorties de résultats: if act%=0 : ' action 0: afficher le texte crypté ? clear 351 p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères item_add 351,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then item_add 351,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste end_if if act%=1 : ' action 1: sauvegarder le texte crypté ? file_open_write 1,folder$+file$ : ' écrire le texte encrypté dans cs$ p% = 1 n% = len(cs$) while (p%+79)<=n% : ' écrire par paquets de 80 caractères file_writeln 1,mid$(cs$,p%,80) p% = p% + 80 end_while if p%<n% then file_writeln 1,mid$(cs$,p%,len(cs$)+1-p%) : ' écrire l'éventuel reste file_close 1 end_if end_sub
sub encryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = "" s$ = strng$ : ' prendre le string complet key$ = item_read$(113,id%) : ' prendre la clé id% (hexa) for i%=1 to len(s$) c$ = mid$(s$,i%,1) p% = asc(c$) if p%=0 then p% = asc("?") cs$ = cs$ + mid$(key$,p%*2-1,2) : ' le vrai cryptage est ICI ! next i% end_sub
sub decryptstring(strng$,id%) : ' résultat dans cs$ ! cs$ = strng$ key$ = item_read$(113,id%) : ' prendre la clé Default (hexa) for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% n% = len(cs$)/2 s$ = "" for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% cs$ = s$ end_sub sub decrypttext() clear 100 : ' effacer la zone de texte à l'écran key$ = item_read$(113,item_index(111)) : ' prendre la clé sélectionnée for i%=1 to 256 : ' éclater la clé sélectionnée nkeys%(i%-1) = hex(mid$(key$,i%*2-1,2)) next i% file_open_read 1,folder$+file$ s$ = "" : ' préparer le texte décrypté while file_eof(1)=0 : ' traiter le fichier ligne par ligne (80 caractères) file_readln 1,cs$ n% = len(cs$)/2 for i%=1 to n% : ' chercher le caractère hexa dans la clé hexa c$ = mid$(cs$,i%*2-1,2) for j%=1 to 256 if c$=mid$(key$,j%*2-1,2) : ' trouvé ? retourner son indice s$ = s$ + chr$(j%) : ' le vrai décryptage est ICI ! exit_for end_if next j% next i% end_while file_close 1 text 100,s$ end_sub
newtext: checkmodif() if doabort%<>1 then return file$ = "" clear 100 caption 0,title$ modif% = 0 doabort% = 0 return opentext: checkmodif() if doabort%<>1 then return s$ = file_name$(401) if s$="_" then return if file_exists(s$)=0 message "Ce fichier n'existe pas:"+crlf$+s$ return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ decrypttext() modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return encryptedtext: encrypttext(0) inactive 0 show 350 return close350: hide 350 active 0 to_foreground 0 return managepwd: inactive 0 text 503,pwd$ text 505,pwd$ show 500 return setpassword: if text$(503)<>text$(505) message "The 2 passwords must be identical !" gosub close500 return end_if pwd$ = text$(503) if len(pwd$)=0 dopassword% = 0 caption 501,"No password is actually required !" else dopassword% = 1 caption 501,"A password is actually required !" end_if saveconfig() hide 500 active 0 to_foreground 0 return close500: hide 500 active 0 to_foreground 0 return askpassword: inactive 0 show 600 return validatepassword: s$ = text$(603) if s$<>pwd$ message "Your password is invalid !"+crlf$+crlf$+"Please try again..." terminate end_if hide 600 active 0 to_foreground 0 return close600: terminate return savetext: if file$="" gosub savetextas return end_if encrypttext(1) return savetextas: s$ = file_name$(400) if s$="_" then return if file_exists(s$)=1 if message_confirmation_yes_no("Ce fichier existe déjà. Remplacer ?")<>1 then return end_if folder$ = file_extract_path$(s$) file$ = file_extract_name$(s$) dir_dialog 400,folder$ dir_dialog 401,folder$ file_dialog 400,file$ file_dialog 401,file$ encrypttext(1) modif% = 0 doabort% = 0 caption 0,title$+" - "+folder$+file$ return cleartext: checkmodif() if doabort%<>1 then return clear 100 caption 0,title$ modif% = 0 doabort% = 0 return closetext: checkmodif() if doabort%<>1 then return file$ = "" caption 0,title$ modif% = 0 doabort% = 0 return exportkey: doexportkey() return exitprog: checkmodif() if doabort%<>1 then return terminate close0: checkmodif() if doabort%<>1 then return : ' juste pour la forme - on ne peut pas arrêter cela return help: execute progfolder$+"CryptedTextHelp.bat" return
about: inactive 0 show 700 return close700: hide 700 active 0 to_foreground 0 return close800: hide 800 active 0 to_foreground 0 return managekeys: text 211,text$(111) text 212,text$(112) clear 213 for i%=1 to count(111) item_add 213,item_read$(111,i%) next i% item_select 213,item_index(111) inactive 0 show 200 return close200: hide 200 active 0 to_foreground 0 return selectkey: text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) item_select 111,item_index(213) text 112,item_read$(113,item_index(213)) return selectkey1: text 112,item_read$(113,item_index(111)) return addkey: s$ = message_input$("Add new encryption key","Key name:","") if s$="" then return for i%=1 to count(111) if s$=item_read$(111,i%) message "This key name exists already !" return end_if next i% generatekey() : ' ici, générer ne nouvelle clé item_add 111,s$ : ' charger le nouveau nom item_add 113,key$ : ' et la valeur de la clé qui va avec item_select 111,count(111) : ' sélectionner la nouvelle clé text 112,item_read$(113,count(111)) : ' et affichier sa valeur item_add 213,s$ : ' actualiser l'affichage de la form de maintenance item_select 213,count(213) text 211,item_read$(111,item_index(213)) text 212,item_read$(113,item_index(213)) saveconfig() return removekey: if item_index(213)<2 message "Please select a key (other than Default)" return end_if s$ = "Do you really want to delete permanently the key "+item_read$(213,item_index(213)) if message_confirmation_yes_no(s$)=1 inactive 200 show 300 return renamekey: s$ = message_input$("Rename an encryption key","New Key name:","") if s$="" then return p% = item_index(213) : ' récupérer l'index de la clé à renommer item_delete 213,p% : ' changer le nom dans la fenêtre de maintenance item_insert 213,p%,s$ item_select 213,p% item_delete 111,p% : ' changer le nom dans la fenêtre principale item_insert 111,p%,s$ item_select 211,p% text 211,s$ : ' afficher le nouveau nom dans la fenêtre de maintenance text 112,s$ : ' et dans la fenêtre principale saveconfig() return danger: inactive 0 show 300 return close300: hide 300 active 200 to_foreground 200 return abandondelete: gosub close300 return executedelete: item_delete 111,item_index(213) : ' supprimer la clé sur la page principale item_delete 113,item_index(213) : ' et sa valeur item_select 111,1 : ' sélectionner la clé par défaut text 112,item_read$(111,1) : ' et l'afficher item_delete 213,item_index(213) : ' supprimer la clé dans la page de maintenance des clés item_select 213,1 : ' sélectionner la clé par défaut text 211,item_read$(111,item_index(213)) : ' et actualiser l'affichage text 212,item_read$(113,item_index(213)) end_if saveconfig() gosub close300 return et voici le fichier CryptedTextHelp.html: - Code:
-
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8"> <title>CryptedPage - Operation instructions</title> </head> <body> <nav class="menu"> <ul> <li><a href="#GettingStarted">Getting started</a></li> <li><a href="#FilesMenu">Files menu</a></li> <li><a href="#KeysMenu">Keys menu</a></li> </ul> </nav>
<h1 style="font-size:46px;">CryptedText - Operation instructions</h1>
<h2 style="font-size:24px;">General informations</h2> <p> This utility is designed to produce <b>crypted text files</b> and to read and write them.<br> Text files are protected using <b>encryption keys</b>. The result is a standard ANSI text file, but made unreadable using an encryption key.<br> Such an ecrypted file must be read using the <b>same key</b> to decrypt it.<br> Encryption keys have unique names and can be selected by their name, via a combo box at the top of the main window.<br> A default key is generated the first time the program starts up. It is named <b>Default</b>.<br> The user may add as many keys as required, giving them user choosen names which are simple ANSI strings.<br><br>
The program is menu-driven. There are 3 menus : <ol> The <b>Files</b> menu gives access to all file manipulation functions<br> The <b>Keys</b> menu gives access to the keys and password managment functions<br> The <b>?</b> menu gives access to the present help text and to the about window<br> </ol> <br> The program offers an optional password protection. Best practice would be to define a password and at least one additional key.<br> </p> <a href="#">Back to top</a><br>
<h2 style="font-size:24px;">Getting started</h2> <p id="GettingStarted"> After first startup, choose the <b>Keys</b> menu, than the <b>Manage keys</b> function.<br> A key management window will open, showing the list of all defined keys. Initially, there is only the <b>Default</b> key.<br> Use the <b>Add</b> button to create a new encryption key. The program will ask for the name of the new key, than generate it.<br> There are also buttons to remove or rename a key.<br><br> </p> <p style="color:red;font-size:24px; font-weight: bolder"> Tip : be very cautious !<br> There is no way to revover a deleted key or to decrypt a file whose key is lost !<br><br> </p> Next, create a password. This password wil be required at program startup before any other action.<br> Choose the <b>Keys</b> menu, than the <b>Manage Password</b> function.<br> A password form will show up where the new password must be entered. Both password fields must be filled and be identical.<br> The <b>Insert password</b> button will check the password fields, than apply the password to the current configuration.<br> </p> <a href="#">Back to top</a><br> <br><br><br><br><br><br> <p id="FilesMenu"> <h2 style="font-size:24px;">Files menu</h2> The Files menu hosts the main functions of this program. Here they are:<br> <nav class="menu"> <ul> <li><a href="#New">New</a></li> <li><a href="#Open">Open</a></li> <li><a href="#ShowEncrypted">Show encrypted</a></li> <li><a href="#Save">Save</a></li> <li><a href="#SaveAs">SaveAs</a></li> <li><a href="#Clear">Clear</a></li> <li><a href="#Close">Close</a></li> <li><a href="#ExportKey">Export key</a></li> <li><a href="#Exit">Exit</a></li> </ul> </nav>
<h2 style="font-size:24px;">New - Create new text file</h2> <p id="New"> This function empties the text buffer and prepares the creation of a new encrypted file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Open existing text file</h2> <p id="Open"> This function opens an existing file, decrypts it and places its content into the text buffer.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Show encrypted text</h2> <p id="ShowEncrypted"> </p> This function encrypts the current contents of the text buffer and shows it in a special window.<br> The current text is not altered and nothing is written into any file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p> <h2 style="font-size:24px;">Save to open file</h2> <p id="Save"> This function encrypts the current text and writes it to an existing file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Save to enother file</h2> <p id="SaveAs"> This function encrypts the current text and writes it to a new file.<br> The user will be asked to navigate to the desired location and file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Clear current text</h2> <p id="Clear"> This function clears the current text. Nothing is written to a file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Close open file</h2> <p id="Close"> This function closes the current file.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Export a key</h2> <p id="ExportKey"> This function creates a key export file.<br> The user will be asked for an existing key name.<br> The program will than create a key export file containing the followong information:<br> <ol> optionnally, the current password if any<br> the key named Default<br> the specified key<br> </ol> <br> This feature is usefull if crypted files must be sent to another recipient.<br> As an example, imagine an information exchange between companies about some<br> confidential issues (commercial negociations, technical secrets or<br> unpublished research data. These texts shoukd never fall unter unauthorized eyes.<br><br> Now, it is easy to encrypt a text file and to send the encrypted file by mail.<br> But the recipient will never be able to read it !<br><br> Yet, the solution is simple: let the recipient have the same CryptedText.exe<br> (no dange no security break !), then let him have the encryption key.<br><br> One could easily transmit the whole configuration file, but there is a risk:<br> the configuration file contains <b>ALL</b> the defined keys !<br><br> So, simply create a specific encryption key for all sensitive recipients,<br> extract cpecifically these keys for each of these recipients, and then send thzm<br> these keys changing their name di CryptedText.cnf. From then on, the recipient<br> can decrypt and read any text encrypted specifically for him, no other recipient<br> ever can read these files, and the recipients never can read files they should not.<br> And they can send encrypted answers back tothe original sender who can read ann Files<br> from whatever recicient they will come. Compléte privacy !<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p>
<h2 style="font-size:24px;">Terminate program</h2> <p id="Exit"> This function exites the program.<br> <a href="#FilesMenu">Files menu</a><br> <a href="#">Back to top</a><br> </p> </p> <br><br><br><br><br><br> <p id="KeysMenu"> <h2 style="font-size:24px;">Keys menu</h2> The Files menu hosts the main functions of this program. Here they are:<br> <nav class="menu"> <ul> <li><a href="#ManagePasswords">Manage passwords</a></li> <li><a href="#ManageKeys">Manage keys</a></li> </ul> </nav> <h2 style="font-size:24px;">Manage passwords</h2> <p id="ManagePasswords"> This function creates, changes or removes the password.<br><br> The program uses a single password. It is checked on program startup.<br> If the password is invalid, the stertup is and the program terminates.<br><br> The Keys managment menu option opens a password window, containing 2 password fields.<br> Initially, they are filled with the current password, only displayed as "*".<br><br> A new password can be entered, but it must be filled into the 2 fields; identically.<br> The <b>Insert password</b> button checks identity of the 2 fields. If there is any difference,<br> the operation is rejected. Otherwise, the password is installed into the current configuration.<br><br> If the new password is empty (in the 2 fields !), the current password will be removed.<br> From then on, the program wil start up without password check, until a new password is defined.<br> <a href="#KeysMenu">Keys menu</a><br> <a href="#">Back to top</a><br> </p> <p id="ManageKeys"> <h2 style="font-size:24px;">Manage keys</h2> This function creates, renames or removes the keys.<br><br> <ul> <li><a href="#CreateKeys">Create a key</a></li> <li><a href="#DeleteKeys">Delete a key</a></li> <li><a href="#RenameKeys">Rename a key</a></li> </ul>, Encryption keys are a way to obfuscate the text contained in the current buffer,<br> but only when it is written into a file. In the same way, a file loaded from disk<br> will be decrypted by one of the keys.<br><br> On initial startup, the program automatically creates a special key named Default.<br> This key is used to encrypt the password (if any), and can be used to encryt user data.<br> However, it is strongly recommanded to add supplementary keys, one key for each special use.<br> Professionnal and private keys may be imagined, or a key for each specific mail recipient,<br> or any other usefull distinction. There is no limit for the total number of keys.<br><br> <b>All keys are automatically and randomly generated by the program. There is no way neither to<br> generate the same key twice, nor regenerate a lost key.</b> <p id="CreateKeys"> <h2 style="font-size:24px;">Create a key</h2> A new key can be created any time. Keys have names which must ne unique throughout the<br> collection of keys. The names are simple character strings, not limited in length.<br><br> To create a key, click the <b>Add</b> button. The programm will then ask for the key name.<br> If the name already exists, the creatio n will be rejected. Otherwise, a new key<br> will be created and added to the configuration, along with its name.<br> <a href="#KeysMenu">Keys menu</a><br> <a href="#">Back to top</a><br> </p> <p id="DeleteKeys"> <h2 style="font-size:24px;">Delete a key</h2> A key can be deleted. But from that moment on, any file encrypted with the deleted key<br> will be totally unreadable. So watch your actions !<br><br> To delete a key, select a key from the list on the left, then click the <b>Rename</b> button.<br> The program will then ask a double confirmation, trying to warn against accidental removal<br> of keys which might still be usefull. If all is confirmed, the key will be removed from<br> the configuration, along with its name. No backup copy of the key will be done.<br><br>
<b>Special note: the Default key cannot be deleted !</b><br><br>
<b>CAUTION ! Key deletion is definitive ! No deleted key can ever be restaured.<br> Any file encrypted by a deleted key will forever be unreadable !</b/<br><br> <a href="#KeysMenu">Keys menu</a><br> <a href="#">Back to top</a><br> </p>
<p id="RenameKeys"> <h2 style="font-size:24px;">Rename a key</h2> The name of a key can be changed without affecting the key value itself. Again,<br> the new name nust be unique.<br><br> To rename a key, select a key from the list on the left, then click the <b>Rename</b> button.<br> The program will then ask for a new key name which must not yet exist in the list.<br> The key name will then be replaced and the configiuration is updated.<br><br> <b>Special note: the Default key cannot be renamed !</b><br> <a href="#KeysMenu">Keys menu</a><br> <a href="#">Back to top</a><br> </p> </p>
</p> </body> </html>
Dernière édition par Klaus le Dim 18 Fév 2024 - 16:53, édité 1 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 16:27 | |
| Ouh, ça va devenir joli ! Au fait, qu'est-ce que tu entends par : « exporter une clé » ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 16:30 | |
| Oups tu as raison ! J'&ai décrit le mode d'emploi, pas son utilité. Je vais ajouter cela dans le fichier d'aide. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 16:55 | |
| J'ai ajouté l'explication dans le fichier HTML de mon post ci-dessus, dans la rubrique concernant l'exportation d'une clé. Voici cet ajout: - Code:
-
This feature is usefull if crypted files must be sent to another recipient. As an example, imagine an information exchange between companies about some confidential issues (commercial negociations, technical secrets or unpublished research data. These texts shoukd never fall unter unauthorized eyes.
Now, it is easy to encrypt a text file and to send the encrypted file by mail. But the recipient will never be able to read it !
Yet, the solution is simple: let the recipient have the same CryptedText.exe (no dange no security break !), then let him have the encryption key.
One could easily transmit the whole configuration file, but there is a risk: the configuration file contains ALL the defined keys !
So, simply create a specific encryption key for all sensitive recipients, extract cpecifically these keys for each of these recipients, and then send thzm these keys changing their name di CryptedText.cnf. From then on, the recipient can decrypt and read any text encrypted specifically for him, no other recipient ever can read these files, and the recipients never can read files they should not. And they can send encrypted answers back tothe original sender who can read ann Files from whatever recicient they will come. Compléte privacy ! Je sais, tout est en anglais, comme tout le programme. Si ça pose un problème, je peux traduire... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 17:00 | |
| Ah ok, c'est super ! (oh, pour la traduction, google fait ça très bien ) Non, mon problème, c'est que quand je clique sur Help, Edge me répond : Fichier introuvable Ceci dit, ça fait un super programme pour les données confidentielles ! Bravo ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 17:22 | |
| - Citation :
- Non, mon problème, c'est que quand je clique sur Help, Edge me répond :
Fichier introuvable Comme tu peux le voir dans un de mes posts ci-dessus, ou dans le source ligne 201, le fichier CryptedText.html doit se trouver dans le dossier dans lequel est l'exécutable, pas forcément là ou est se source. Mais j'y pense - je crois que je t'avais induit en erreur sue le nom du fichier ! J'avais écrit CryptedTextHelp.html ? C'est faux ! Regarde la ligne 201 ! Le fichier DOIT s'appeler CryptedTexct.html ! Et ça marchera. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: RE Dim 18 Fév 2024 - 21:52 | |
| Bonsoir Klaus.
Voilà un sujet plus qu'intéressant. Penses tu que cette méthode soit plus sécurisée que la fonction de KGF.dll ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger Dim 18 Fév 2024 - 22:44 | |
| Oui. Beaucoup plus !
Cependant, étant écrite en 100 % Panoramic, elle est nettement plus lente. On ne peut pas tout avoir...
On peut toujours imaginer de convertir l'algorithme proprement-dit e, fonction de DLL. Alors, on passerait en vitesse TGV...
Maie pour le moment, je réfléchis à adapter ma méthode à des fichiers binaires quelconques. Images, documents Word ou Excel, exécutables... tout sera possible.
D'ailleurs, pour un supplément de sécurité, as-tu imaginer de crypter un fichier crypté par une autr clé ? Un sur-cryptage eu quelque sorte. Un fichier crypté étant un fichier texte banal ne contenant que des lettres et chiffres, rien de plus facile... et alorfs là, la CIA pourra toujours courir ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 19 Fév 2024 - 0:13 | |
| Heu...si la CIA veut payer mes dettes, elle peut lire ce qu'elle veut. et le FSB aussi. Mais avant de reprendre la cryptographie, je vais me faire la section pdf de kgf et là, c'est pas gagné. | |
| | | Contenu sponsorisé
| Sujet: Re: CryptedText - outil pour crypter des textes à protéger | |
| |
| | | | CryptedText - outil pour crypter des textes à protéger | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |