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

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
CryptedText - outil pour crypter des textes à protéger Emptypar papydall Aujourd'hui à 16:57

» PANORAMIC V 1
CryptedText - outil pour crypter des textes à protéger Emptypar papydall Aujourd'hui à 3:22

» select intégrés [résolu]
CryptedText - outil pour crypter des textes à protéger Emptypar jjn4 Hier à 17:00

» number_mouse_up
CryptedText - outil pour crypter des textes à protéger Emptypar jjn4 Hier à 11:59

» Aide de PANORAMIC
CryptedText - outil pour crypter des textes à protéger Emptypar jjn4 Hier à 11:16

» trop de fichiers en cours
CryptedText - outil pour crypter des textes à protéger Emptypar lepetitmarocain Hier à 10:43

» Je teste PANORAMIC V 1 beta 1
CryptedText - outil pour crypter des textes à protéger Emptypar papydall Hier à 4:17

» bouton dans autre form que 0
CryptedText - outil pour crypter des textes à protéger Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
CryptedText - outil pour crypter des textes à protéger Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
CryptedText - outil pour crypter des textes à protéger Emptypar Klaus Lun 6 Mai 2024 - 10:23

» @Jack
CryptedText - outil pour crypter des textes à protéger Emptypar Jack Mar 30 Avr 2024 - 20:40

» Une calculatrice en une ligne de programme
CryptedText - outil pour crypter des textes à protéger Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
CryptedText - outil pour crypter des textes à protéger Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
CryptedText - outil pour crypter des textes à protéger Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
CryptedText - outil pour crypter des textes à protéger Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-20%
Le deal à ne pas rater :
-20% Récupérateur à eau mural 300 litres (Anthracite)
79 € 99 €
Voir le deal

 

 CryptedText - outil pour crypter des textes à protéger

Aller en bas 
4 participants
AuteurMessage
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyJeu 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyJeu 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...
santa
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyJeu 15 Fév 2024 - 22:56

Merci, jjn4 ! C'est exactement ce que je cherchais. Je vais pouvoir remplacer mes deux appels à User32.dll...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyJeu 15 Fév 2024 - 23:09

Le code est actualisé dans mon premier post. Plus de User32.dll...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2392
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 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:
Revenir en haut Aller en bas
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 16 Fév 2024 - 0:59

Oups... je vais regarder cela demain - enfin, ce matin !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2392
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 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$. 

CryptedText - outil pour crypter des textes à protéger Klaus225


ligne 151: Le BUTTON 611 n'a pas son bon parent (500 au lieu de 600) : 

CryptedText - outil pour crypter des textes à protéger Kgf23_10
Revenir en haut Aller en bas
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 16 Fév 2024 - 14:34

Bon, je ne suis pas arrivé à le faire fonctionner,
mais en tout cas, ça a l'air d'être un truc très calé !
affraid alien drunken
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyVen 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptySam 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 ?
scratch affraid afro
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptySam 17 Fév 2024 - 16:43

Smile Smile Smile   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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptySam 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...
scratch rendeer
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptySam 17 Fév 2024 - 16:54

Bonne idée, celle double saisie : Je vais faire cela ainsi que la fonction "Export key"...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptySam 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 18 Fév 2024 - 16:27

Ouh, ça va devenir joli !
cheers
Au fait, qu'est-ce que tu entends par :
« exporter une clé » ?
scratch
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jjn4

jjn4


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 18 Fév 2024 - 17:00

Ah ok, c'est super !
(oh, pour la traduction, google fait ça très bien Laughing Laughing )
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 !
cheers
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: RE   CryptedText - outil pour crypter des textes à protéger EmptyDim 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 ?
Revenir en haut Aller en bas
Klaus

Klaus


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

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger EmptyDim 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 !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: re   CryptedText - outil pour crypter des textes à protéger EmptyLun 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.
lol!

Mais avant de reprendre la cryptographie, je vais me faire la section pdf de kgf
et là, c'est pas gagné.
Revenir en haut Aller en bas
Contenu sponsorisé





CryptedText - outil pour crypter des textes à protéger Empty
MessageSujet: Re: CryptedText - outil pour crypter des textes à protéger   CryptedText - outil pour crypter des textes à protéger Empty

Revenir en haut Aller en bas
 
CryptedText - outil pour crypter des textes à protéger
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Cadre pour vos textes
» Un petit outil pour les sprites
» Outil interactif pour gérer un fichier ILB
» Outil pour déterminer le nom court d'un fichier
» Un outil pour créer et maintenir des plateaux de jeux 2D

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