Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: PanoCrypt Lite Dim 10 Oct 2021 - 18:03 | |
| . Abandon de cette version "Lite". Pour la version complète de PanoCrypt, merci de suivre ce lien : https://panoramic.1fr1.net/t6673-panocryptBonjour à tous ! Je vous propose un programme (farfelu) de "cryptage" et stockage de fichiers texte sous forme d’images bitmap. Commençons par une démonstration. Je crypte l’expression "PanoCrypt". C’est le nom de baptême du programme. Voici le rendu sous forme d’image : L’image est le petit point au milieu de la fenêtre. Bon, ok, je vous fais un zoom pour mieux voir : Nous distinguons un ensemble de 4 pixels. Et bien, je vous l’assure, ces quatre pixels représentent bien l’expression "PanoCrypt" ! Autre démonstration, voici le fichier-image du code-source du programme PanoCrypt Lite: L’interface utilisateur du programme PanoCrypt Lite : Son code-source : - Code:
-
' PanoCrypt Lite ' Marc - octobre 2021
dim nomFichier$, Modif$, reponseUtilisateur%
label nouveau, ouvrir, enregistrer, renduVisuel, modification, fermerRenduVisuel, redim, quitter
interfaceUtilisateur()
end
nouveau: subNouveau() return
sub subNouveau() hide 20 if modif$ = "*" and text$(10) <> "" reponseUtilisateur% = message_warning_yes_no("Voulez-vous enregistrer le travail en cours ?") if reponseUtilisateur% = 0 exit_sub else if reponseUtilisateur% = 1 subEnregistrer() end_if end_if end_if off_change 10 modif$ = "" nomFichier$ = "Fichier sans nom" caption 30,nomFichier$ + modif$ clear 10 color 21,255,255,255 on_change 10,modification end_sub
ouvrir: subOuvrir() return
sub subOuvrir() dim_local enteteFichier%(25), l%, h% hide 20
if modif$ = "*" and text$(10) <> "" reponseUtilisateur% = message_warning_yes_no("Voulez-vous enregistrer le travail en cours ?") if reponseUtilisateur% = 0 exit_sub else if reponseUtilisateur% = 1 subEnregistrer() end_if end_if end_if
off_change 10 clear 10 modif$ = "" nomFichier$ = "Fichier sans nom" caption 30,nomFichier$ + modif$ if object_exists(7) = 0 open_dialog 7 end_if filter 7,"Fichier PanoCrypt|*.bmp" nomFichier$ = file_name$(7) IF nomFichier$ = "_" exit_sub end_if
' lecture entête fichier filebin_open_read 8,nomFichier$ filebin_block_read 8,25,enteteFichier%(0) filebin_close 8
' vérification de la conformité du fichier if enteteFichier%(0) <> 66 and enteteFichier%(1) <> 77 MessageFichierCorrompu() exit_sub end_if
l% = hex(hex$(enteteFichier%(21)) + hex$(enteteFichier%(20)) + hex$(enteteFichier%(19)) + hex$(enteteFichier%(18))) h% = hex(hex$(enteteFichier%(25)) + hex$(enteteFichier%(24)) + hex$(enteteFichier%(23)) + hex$(enteteFichier%(22)))
if l% <> h% MessageFichierCorrompu() exit_sub end_if
width 21,l% height 21,h% file_load 21,nomFichier$ decryptage(l%) caption 30,nomFichier$ + modif$ on_change 10,modification end_sub
sub decryptage(largeur%) dim_local x%, y%, caractere$, texte$
for y% = 0 to largeur% - 1 for x% = 0 to largeur% - 1 texte$ = texte$ + chr$(color_pixel_red(21,x%,y%)) texte$ = texte$ + chr$(color_pixel_green(21,x%,y%)) texte$ = texte$ + chr$(color_pixel_blue(21,x%,y%)) next x% next y%
text 10,texte$ end_sub
sub MessageFichierCorrompu() if message_error_ok("PanoCrypt ne peut pas ouvrir ce fichier !") < 3 end_if end_sub
enregistrer: subEnregistrer() return
sub subEnregistrer() dim_local b$, longueurnomFichier%, pos%, n% hide 20
if text$(10) = "" exit_sub end_if
if object_exists(6) = 0 save_dialog 6 end_if
filter 6,"Fichier PanoCrypt|*.bmp" ' dir_dialog 6, ' file_dialog 6, nomFichier$ = file_name$(6)
if nomFichier$ = "_" or nomFichier$ = "" exit_sub end_if
if file_exists(nomFichier$) = 1 if message_confirmation_yes_no("Le fichier existe. Le remplacer ?") <> 1 THEN EXIT_SUB end_if b$=upper$(nomFichier$) if file_extract_extension$(b$) <> ".BMP" if file_extract_extension$(b$) <> "" longueurnomFichier% = len(nomFichier$) pos% = instr_right(nomFichier$,".") n% = longueurnomFichier% - pos% nomFichier$ = left$(nomFichier$,n%) end_if nomFichier$ = nomFichier$ + ".bmp" end_if
encryptage()
file_save 21,nomFichier$ modif$ = "" caption 30,nomFichier$ + modif$ end_sub
sub encryptage() dim_local texte$, longueurTexte%, carre%, complement%, x%,y%, r%,v%,b%,n%, caractere$ inactive 0 texte$ = text$(10) ' longueur du texte à chiffrer longueurTexte% = len(texte$) carre% = int(sqr(longueurTexte%/3)) if (carre%*carre%) <> longueurTexte%/3 carre% = carre% + 1 complement% = (carre%*carre%*3)-longueurTexte% texte$ = texte$ + string$(complement%,chr$(32)) end_if height 21,carre% width 21,carre%
if carre% < width_client(20) top 21,(height_client(20) - carre%) / 2 left 21,(width_client(20) - carre%) / 2 end_if
2d_target_is 21 n% = 1 for y% = 0 to carre% - 1 for x% = 0 to carre% - 1 caractere$ = mid$(texte$,n%,1) r% = asc(caractere$) n% = n% + 1 caractere$ = mid$(texte$,n%,1) v% = asc(caractere$) n% = n% + 1 caractere$ = mid$(texte$,n%,1) b% = asc(caractere$) n% = n% + 1 2d_pen_color r%,v%,b% 2d_point x%,y% next x% next y% active 0 end_sub
modification: hide 20 if modif$ = "*" return else modif$ = "*" end_if if nomFichier$ = "" nomFichier$ = "Fichier sans nom" end_if
caption 30,nomFichier$ + modif$ return
sub interfaceUtilisateur() creerFenetrePrincipale() creerBarreIcones() creerMemo() creerBarreEtat() creerFenetreRenduVisuel() end_sub
sub creerFenetrePrincipale() width 0,width(0) - width_client(0) + 900 height 0,height(0) - height_client(0) + 665 left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 color 0,30,30,30 font_size 0,12 caption 0,"PanoCrypt Lite" on_resize 0,redim on_close 0,quitter on_click 0,fermerRenduVisuel end_sub
sub creerMemo() memo_rich 10 top 10,44 left 10,8 width 10,884 height 10,595 bar_both 10 color 10,248,238,208 font_color 10,0,0,80 on_change 10,modification end_sub
sub creerBarreIcones() creerIconeNouveauProjet(8,8) creerIconeOuvrir(44,8) creerIconeSauvegarderProjet(80,8) creerIconeRenduVisuel(116,8) end_sub
sub creerIconeNouveauProjet(x%,y%) dim_local i% picture 2 height 2,28 width 2,28 top 2,y% left 2,x% hint 2,"Nouveau cryptage" on_click 2,nouveau 2d_target_is 2 dessinerFondIcone() 2d_pen_color 0,0,0 2d_line 7,5,7,23 2d_line 7,22,21,22 2d_line 7,5,16,5 2d_line 15,5,21,11 2d_line 20,10,20,23 for i% = 6 to 21 2d_flood 8,i%,255,255,255 next i% 2d_line 15,5,15,11 2d_line 15,10,21,10 end_sub
sub creerIconeOuvrir(x%,y%) dim_local i% picture 3 height 3,28 width 3,28 top 3,y% left 3,x% hint 3,"Ouvrir un fichier PanoCrypt" on_click 3,ouvrir 2d_target_is 3 dessinerFondIcone() 2d_pen_color 0,0,0 2d_line 16,4,20,4 2d_point 15,5 2d_point 20,5 2d_point 21,6 2d_line 20,7,23,7 2d_line 22,5,22,8 2d_line 5,9,11,9 2d_line 10,11,21,11 2d_line 11,16,25,16 2d_line 5,22,19,22 2d_line 5,9,5,23 2d_line 10,9,10,12 2d_line 20,11,20,17 2d_line 5,22,12,15 2d_line 18,22,25,15 for i% = 10 to 20 2d_flood 6,i%,255,255,255 next i% for i% = 17 to 21 2d_flood 11,i%,250,250,0 next i% end_sub
sub creerIconeSauvegarderProjet(x%,y%) dim_local i% picture 4 height 4,28 width 4,28 top 4,y% left 4,x% hint 4,"Enregistrer" ON_CLICK 4,enregistrer 2d_target_is 4 dessinerFondIcone() 2d_pen_color 0,0,0 2d_line 7,5,20,5 2d_line 19,6,21,6 2d_line 20,7,22,7 2d_line 7,22,21,22 2d_line 6,6,6,22 2d_line 21,7,21,22 for i% = 6 to 21 2d_flood 8,i%,0,255,0 next i% 2d_rectangle 8,14,20,21 2d_line 10,16,18,16 2d_line 10,18,18,18 2d_rectangle 9,5,18,10 2d_line 9,6,15,6 2d_line 9,7,15,7 2d_line 9,8,15,8 end_sub
sub creerIconeRenduVisuel(x%,y%) picture 5 height 5,28 width 5,28 top 5,y% left 5,x% hint 5,"Rendu visuel" ON_CLICK 5,renduVisuel 2d_target_is 5 dessinerFondIcone() 2d_pen_color 77,62,35 2d_line 10,4,0,23 2d_line 10,4,20,23 2d_line 18,9,15,14 2d_line 18,9,26,23 2d_rectangle 22,4,24,8 2d_rectangle 21,5,25,7 2d_pen_color 255,255,255 2d_line 18,10,18,13 2d_line 17,12,20,12 2d_fill_color 255,255,255 2d_rectangle 9,7,12,13 2d_line 8,9,8,13 2d_line 10,5,10,7 2d_point 7,11 2d_point 13,11 2d_line 12,9,12,13 2d_pen_color 0,200,0 2d_point 7,12 2d_point 13,12 2d_line 6,13,15,13 2d_line 6,14,15,14 2d_line 5,15,16,15 2d_line 5,16,16,16 2d_line 4,17,17,17 2d_line 4,18,17,18 2d_line 3,19,18,19 2d_line 3,20,18,20 2d_line 2,21,19,21 2d_line 2,22,19,22 2d_pen_color 0,150,0 2d_line 17,13,20,13 2d_line 16,14,21,14 2d_line 17,15,21,15 2d_line 17,16,22,16 2d_line 18,17,23,17 2d_line 18,18,23,18 2d_line 19,19,24,19 2d_line 19,20,24,20 2d_line 20,21,25,21 2d_line 20,22,25,22 end_sub
sub dessinerFondIcone() dim_local i%,r%,v%,b% for i% = 0 to 27 r%=255-(5*i%) v%=255-(5*i%) b%=255-(5*i%) 2d_pen_color r%,v%,b% 2d_line 0,i%,28,i% next i% end_sub
sub creerBarreEtat() ALPHA 30 FONT_SIZE 30,10 font_color 30,240,240,240 top 30,HEIGHT_CLIENT(0)-20 left 30,3 caption 30," Réalisé en langage Panoramic par Marc - https://panoramic.1fr1.net/" end_sub
sub creerFenetreRenduVisuel() form 20 width 20,width(20) - width_client(20) + 300 height 20,height(20) - height_client(20) + 300 caption 20,"PanoCrypt : Rendu visuel" command_target_is 20 picture 21 full_space 21 command_target_is 0 hide 20 end_sub
renduVisuel: if show(20) = 0 show 20 encryptage() else hide 20 end_if return
fermerRenduVisuel: hide 20 return
redim: off_resize 0 width 0,width(0)-width_client(0) + 900 height 0,height(0)-height_client(0) + 665 on_resize 0,redim return
quitter: close_inactive if modif$ = "*" and text$(10) <> "" reponseUtilisateur% = message_warning_yes_no("Voulez-vous enregistrer le travail en cours ?") if reponseUtilisateur% = 0 return else if reponseUtilisateur% = 1 subEnregistrer() end_if end_if end_if close_active return
Utilisation : - La première icône, "Nouveau", permet d’effacer le travail en cours pour débuter un nouveau cryptage. - La deuxième icône, "Ouvrir", ouvre un fichier image issue d’un précédent cryptage. - La troisième icône, "Enregistrer", permet de sauvegarder un nouveau cryptage. - La quatrième icône, "Rendu visuel", sert à afficher l’image créée. Cette icône n’a aucune utilité dans le processus de fonctionnement du programme. Vous n’êtes pas obligé de l’utiliser. - Tapez ou copier-coller un texte dans la zone texte (C’est un MEMO_RICH). - Sauvegardez-le sur le disque dur en cliquant sur l’icône Enregistrer. Il apparaitra sous la forme de fichier .bmp. - Pour le relire, à l’aide de l’icône Ouvrir, chargez le fichier .bmp. Il sera automatiquement décodé et le texte s’affichera dans le mémo. Le cœur du programme :
A l’instar du QRcode, le principe est de créer une image carrée. Si le nombre de caractères composant le texte à crypter n’est pas suffisant pour créer un carré, alors le texte sera complété par des caractères chr$(32). Lors du chargement d’une image, le programme vérifiera que le fichier est bien un BMP et que cette image est bien carrée. Si ce n’est pas le cas, le fichier-image ne sera pas chargé. Le codage : La caractéristique d’un pixel est qu’il est composé de 3 couleurs. Le rouge, le vert et le bleu. Chaque couleur est quantifiée par une valeur entre 0 et 255. Nous avons donc pour un pixel : rouge 0 à 255, vert 0 à 255 et bleu 0 à 255. 0 à 255 ? Ça tombe bien, c’est un octet et c’est l’amplitude de la table ASCII étendue ! Donc un pixel va pouvoir représenter 3 caractères ASCII, 2 pixels pour 6 caractères etc. Je vous laisse tester ce prototype. Ne compressez pas vos fichiers-image, en jpg par exemple, vous altéreriez les données internes d’une manière irréversible ! Merci de vos retour d'expérience. Prochaine version éventuellement : J’ai qualifié cette version de "lite" pour laisser place à une hypothétique autre version plus complète qui permettrait d’ajouter un mot de passe pour coder les valeur R,V,B de chaque pixel. Le principe serait de laisser libre choix à l’utilisateur de compléter un champ "Mot de passe" avant de créer le fichier-image. A partir de ce mot de passe, je calculerai le CRC-24 qui me donnera 3 octets. Ces trois octets seront appliqués par l’intermédiaire d’un XOR aux trois valeurs R,V et B de chaque pixel avant de créer le fichier-image. Pour le décodage, il suffira de saisir le même mot de passe pour que le programme recalcule le CRC-24, puis refaire un XOR sur les valeurs R,V et B pour revenir à l’état initial. Avantages : - Liberté à l’utilisateur d’utiliser ou pas un mot de passe ; - Un mot de passe différent peut être utilisé pour chaque création de fichier-image ; - Sécurité : 16 777 216 de combinaison différentes. - Discrétion : (valable également pour la version lite) Il n’est pas facile de savoir qu’en réalité ce fichier-image représente un fichier texte. IMPORTANT : PanoCrypt est un programme expérimental sans garantie. Son auteur, Marc, ainsi que Jack, le créateur du langage Panoramic, ne seraient en aucun cas responsables des dommages ou des pertes de données résultant de son utilisation. Prenez toutes les précautions nécessaires pour éviter la perte de vos données !
Dernière édition par Marc le Jeu 14 Oct 2021 - 21:09, édité 9 fois | |
|