steganosorus

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

steganosorus

Message par Zorro »

j'ai vu que ça parlait de Steganographie sur le forum....

voici 2 procedures qui font cela

le principe utilisé ici est le suivant :

on prends une image Bmp
on prends chaque caractere du texte a encoder

un caractere = 8 bits
chacun des 8 bits du caractere est envoyé dans le dernier bit de droite de la composante rouge d'un pixel !

il faut donc 8 pixels pour encoder 1 caractere ... donc un huitieme de l'image est pris pour encoder un texte
si je ne me plante pas dans mes calculs ...
une image de 1920*1080 (fullHD) represente 2073600 pixels ce qui divisé par 8 donne 259 200‬ caracteres possible par image :)

ça laisse de la marge :)


voici le code :

Code : Tout sélectionner


;***********************************************
;Titre  :steganosorus
;Auteur  : Dobro
;Date  :30/06/2019
;Heure  :17:01:40
;Version Purebasic :  PureBasic 5.20 LTS (Windows - x86)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune 
;***********************************************

; encode/decode une image Bmp

Declare.s decode_steganosorus(name_image.s)
Declare encode_steganosorus(name_image.s,message.s)


Enumeration
		#Image 
EndEnumeration

; ************** encodage d'un message dans l'image *************
name_image.s=GetCurrentDirectory()+"testcrypte2.bmp"
message.s="il est beau mon lavabo !"+chr(10)+"et Tiens pendant qu'on y est, une deuxieme phrase"+chr(10)+"pour voir ...."
encode_steganosorus(name_image.s,message.s)
; ***********************************************************

CallDebugger
; *********** decodage du message dans l'image ************************
name_image.s=GetCurrentDirectory()+"testcrypte2.bmp"
message.s= decode_steganosorus(name_image.s)
MessageRequester("resultat", "Le message est :"+chr(10)+message.s)
; ***************************************************************



;-zone Procedures
Procedure.s decode_steganosorus(name_image.s)
		LoadImage(#image,name_image.s)
		largeur=ImageWidth(#Image)
		hauteur=ImageHeight(#image)
		StartDrawing(ImageOutput(#image))
				; By Dobro
				;decodeur
				longueur= point(largeur-1,hauteur-1) ; la longueur du message se trouve dans le dernier point de l'image
				For y=0 to hauteur-1
						For x=0 to largeur-1 step 8
								octet$=""
								for i=0 to 7
										coul=point(x+i,y)
										rouge=red(coul)
										; ici je ne me sert pas des composante verte et bleu
										;vert=green(coul) 
										;bleu=blue(coul)
										
										bit$=bin(rouge,#PB_Ascii  )
										bit$=RSet(bit$,8,"0")
										octet$=octet$+right(bit$,1)
								next i
								car=val("%"+octet$)							
								l$=l$+chr(car)								
						Next x			
				Next y
				ProcedureReturn left(L$,longueur)
		StopDrawing()
EndProcedure

;
Procedure encode_steganosorus(name_image.s,message.s)
		; By Dobro
		; encodeur
		LoadImage(#image,name_image.s)
		largeur=ImageWidth(#Image)
		hauteur=ImageHeight(#image)
		StartDrawing(ImageOutput(#image))
				compteur_pos=1
				; on encodera la longueur du text dans le dernier point de l'image
				longueur=len(message.s)			
				For y=0 to hauteur-1
						For x=0 to largeur-1 step 8
								octet$=""
								lettre.s=mid(message.s,compteur_pos,1)
								Letter=asc(lettre.s)			
								octet_lettre.s=bin(letter,#PB_Ascii)
								octet_lettre.s=RSet(octet_lettre.s,8,"0")
								if compteur_pos<=longueur
										For i=0 to 7 ; paquet de 8 bits pour encoder 1 lettre
												coul=point(x+i,y)
												rouge=red(coul)	
												vert=green(coul)
												bleu=blue(coul)
												octet_rouge$=bin(rouge,#PB_Ascii  )
												octet_rouge$=RSet(octet_rouge$,8,"0")
												bit$=mid(octet_lettre.s,i+1,1); prend l'extrait du bit de la lettre
												if bit$<>""
														octet_rouge_ap$=left(octet_rouge$,len(octet_rouge$)-1)+bit$ ; le colle a la fin de l'octet rouge en cours
												Endif
												plot(x+i,y,rgb(val("%"+octet_rouge_ap$),vert,bleu))
										next i
										compteur_pos=compteur_pos+1
								Else
										coul=point(x,y)
										rouge=red(coul)
										vert=green(coul)
										bleu=blue(coul)
										plot(x,y,rgb(rouge,vert,bleu))
								Endif
						Next x
				Next y
				plot(largeur-1,hauteur-1,longueur) ; on pose la longueur du message dans le dernier point de l'image
		StopDrawing()
		SaveImage(#image,name_image.s)
EndProcedure



; Epb


en faisant de meme avec la composante verte et bleu , on pourrai facilement multiplier par 3 le nombre de caracteres possible
vu qu'ici je n'utilise QUE la composante rouge ...

ps: la taille du text est la valeur RGB du dernier pixel de l'image
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: steganosorus

Message par venom »

Cool 8) Merci du partage Dobro, je vais regarder ça. J'étais justement entrain de me faire un petit GUI pour un encodage / décodage de ce type :lol:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: steganosorus

Message par Ar-S »

La technique du bit de poids faible à quelque chose prêt :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: steganosorus

Message par Zorro »

@venom

utilise plutot cette version , car elle utilise les 3 composantes d'un pixel
donc 1 pixel RGB encode 3 caracteres !!

pour un pixel on a

rouge = xxxxxxx1 <-- un bit pris du caratere 1
vert = xxxxxxx1 <-- un bit pris du caratere 2
bleu = xxxxxxx1 <-- un bit pris du caractere 3

au bout de 8 pixels on a encodé 3 caracteres !! :)

en reprenant mes calculs du premier code
une image de 1920*1080 (fullHD) represente 2073600 pixels ce qui divisé par 8 donne 259 200‬ caracteres possible par image :)
maintenant :

une image de 1920*1080 (FullHD) represente 2073600 pixels , et comme dans 8 pixels on a encodé 3 caracteres , on a donc
2073600/8=259 200 groupe de 3 caracteres .....donc 259 200*3=777 600‬ caracteres possible !!
3 fois plus que mon premier code :)

beaucoup plus efficace non ?


@ar-s oui c'est bien ça :)


le nouveau code :

Code : Tout sélectionner


;***********************************************
;Titre  :*steganosorus2
;Auteur  : Dobro
;Date  :02/07/2019
;Heure  :10:57:31
;Version Purebasic :  PureBasic 5.20 LTS (Windows - x86)
;Version de l'editeur :EPB PHOENIX V2.68
; Libairies necessaire : Aucune 
;***********************************************



; encode/decode une image Bmp

Declare.s decode_steganosorus2(name_image.s)
Declare encode_steganosorus2(name_image.s,message.s)


Enumeration
		#Image 
EndEnumeration


; ************** encodage d'un message dans l'image *************
name_image.s=GetCurrentDirectory()+"test100x100.bmp"
message.s="il est beau mon lavabo hé hé  !"+chr(10)+"et Tiens pendant qu'on y est, une deuxième phrase"+chr(10)+"pour voir ...."
encode_steganosorus2(name_image.s,message.s)
; ***********************************************************

CallDebugger
decode:
; *********** decodage du message dans l'image ************************
name_image.s=GetCurrentDirectory()+"test100x100.bmp"
message.s= decode_steganosorus2(name_image.s)
MessageRequester("resultat", "Le message est :"+chr(10)+message.s)
; ***************************************************************



;-zone Procedures
Procedure.s decode_steganosorus2(name_image.s)
		LoadImage(#image,name_image.s)
		largeur=ImageWidth(#Image)
		hauteur=ImageHeight(#image)
		StartDrawing(ImageOutput(#image))
				; By Dobro
				;decodeur
				longueur= point(largeur-1,hauteur-1)-1 ; la longueur du message se trouve dans le dernier point de l'image
			
				For y=0 to hauteur-1
						For x=0 to largeur-9 step 8
								octetrouge$="" :octetvert$="":octetbleu$=""
								for i=0 to 7
										coul=point(x+i,y)
										rouge=red(coul)										
										vert=green(coul) 
										bleu=blue(coul)
										;premiere lettre
										bit$=bin(rouge,#PB_Ascii  )
										bit$=RSet(bit$,8,"0") ; alignement
										octetrouge$=octetrouge$+right(bit$,1)
										;deuxieme lettre
										bit2$=bin(vert,#PB_Ascii  )
										bit2$=RSet(bit2$,8,"0") ; alignement
										octetvert$=octetvert$+right(bit2$,1)
										;troisieme lettre
										bit3$=bin(bleu,#PB_Ascii  )
										bit3$=RSet(bit3$,8,"0") ; alignement
										octetbleu$=octetbleu$+right(bit3$,1)										
								next i
								car=val("%"+octetrouge$)
								car2=val("%"+octetvert$)
								car3=val("%"+octetbleu$)							
								l$=l$+chr(car)+chr(car2)+chr(car3)	; pose 3 lettres d'un coup
						Next x			
				Next y
				ProcedureReturn left(L$,longueur)
		StopDrawing()
EndProcedure

;
Procedure encode_steganosorus2(name_image.s,message.s)
		; By Dobro
		; encodeur
		LoadImage(#image,name_image.s)
		largeur=ImageWidth(#Image)
		hauteur=ImageHeight(#image)
		StartDrawing(ImageOutput(#image))
				compteur_pos=1
				; on encodera la longueur du text dans le dernier point de l'image
				longueur=len(message.s)+1
				For y=0 to hauteur-1
						For x=0 to largeur-9 step 8
								octet_rouge$="":octet_vert$="":octet_bleu$=""
								lettre.s=mid(message.s,compteur_pos,1)
								lettre2.s=mid(message.s,compteur_pos+1,1)
								lettre3.s=mid(message.s,compteur_pos+2,1)
								Letter_rouge=asc(lettre.s)	:Letter_vert=asc(lettre2.s):Letter_bleu=asc(lettre3.s)		
								octet_lettre.s=bin(letter_rouge,#PB_Ascii)
								octet_lettre.s=RSet(octet_lettre.s,8,"0")
								octet_lettre2.s=bin(letter_vert,#PB_Ascii)
								octet_lettre2.s=RSet(octet_lettre2.s,8,"0")
								octet_lettre3.s=bin(letter_bleu,#PB_Ascii)
								octet_lettre3.s=RSet(octet_lettre3.s,8,"0")
								if compteur_pos<longueur
										For i=0 to 7 ; paquet de 8 bits pour encoder 1 lettre
												coul=point(x+i,y)
												rouge=red(coul)	
												vert=green(coul)
												bleu=blue(coul)
												octet_rouge$=bin(rouge,#PB_Ascii  )
												octet_rouge$=RSet(octet_rouge$,8,"0")
												;
												octet_vert$=bin(vert,#PB_Ascii  )
												octet_vert$=RSet(octet_vert$,8,"0")
												;
												octet_bleu$=bin(bleu,#PB_Ascii  )
												octet_bleu$=RSet(octet_bleu$,8,"0")
												;
												bit$=mid(octet_lettre.s,i+1,1); prend l'extrait du bit de la lettre
												bit2$=mid(octet_lettre2.s,i+1,1); prend l'extrait du bit de la lettre
												bit3$=mid(octet_lettre3.s,i+1,1); prend l'extrait du bit de la lettre
												;												
												if bit$<>""
														octet_rouge_ap$=left(octet_rouge$,len(octet_rouge$)-1)+bit$ ; le colle a la fin de l'octet rouge en cours
												Endif
												if bit2$<>""
														octet_vert_ap$=left(octet_vert$,len(octet_vert$)-1)+bit2$ ; le colle a la fin de l'octet rouge en cours
												Endif
												if bit3$<>""
														octet_bleu_ap$=left(octet_bleu$,len(octet_bleu$)-1)+bit3$ ; le colle a la fin de l'octet rouge en cours
												Endif
												plot(x+i,y,rgb(val("%"+octet_rouge_ap$),val("%"+octet_vert_ap$),val("%"+octet_bleu_ap$)))
										next i
										compteur_pos=compteur_pos+3
								Else ; si on est la, c'est que le message est fini et qu'il reste des pixel a dessiner
										coul=point(x,y)
										rouge=red(coul)
										vert=green(coul)
										bleu=blue(coul)
										plot(x,y,rgb(rouge,vert,bleu))
								Endif
						Next x
				Next y
				plot(largeur-1,hauteur-1,longueur) ; on pose la longueur du message dans le dernier point de l'image
		StopDrawing()
		SaveImage(#image,name_image.s)
EndProcedure

; Epb
Dernière modification par Zorro le jeu. 04/juil./2019 17:24, modifié 5 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: steganosorus

Message par Ar-S »

---SPOIL---
J'ai procédé un peu de la même manière pour mon épreuve, mais comme cette technique est "classique", je l'ai modifiée un poilou.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: steganosorus

Message par Zorro »

je suppose que tu as ajouté un offset ? (un decalage)
j'ai cherché pour voir si je trouvais ta technique, je n'y suis pas arrivé :mrgreen:

ps: j'ai corrigé mes cacul a la tonton mayonaise !

pour 8 pixels on encode en fait 3 caracteres et pas 24 ... comme je le disais tout a l'heure
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: steganosorus

Message par Ar-S »

Non, j'ai même pas rajouté d'offset. Pas de cryptage des caractères en plus du camouflage, pas de décalage à N car... sinon ça ne serait pas trouvable.
J'ai fait en sorte que ça le soit ici. Que ça reste ludique et réalisable.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: steganosorus

Message par venom »

Cool, merci 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: steganosorus

Message par Kwai chang caine »

Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: steganosorus

Message par venom »

Par contre il m'est arrivé sûrement avec certin type d'image. (Bitmap) d'avoir des erreurs de tableau hors limite. Peut être qu'il faut une image avec un minimum de pixel ? Je n'ai pas encore analyser tes procédures. :wink:

PS: on dit que les pixels sont codé sur 8bits mais sous paint et totoshop quand j'enregistre une image bmp je n'ai que le choix de 24bits ou + est-ce grave ? Ou ce paramètre n'a rien à voir dans notre cas ?





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: steganosorus

Message par Zorro »

venom a écrit :Par contre il m'est arrivé sûrement avec certin type d'image. (Bitmap) d'avoir des erreurs de tableau hors limite.



@++
le probleme c'est que je n'utilise pas de tableau LOL

mais je pense que ça doit venir de ça :

Code : Tout sélectionner

For x=0 to largeur-1 step 8


possible que le Step 8 fasse sortir de la zone.. mais c'est pas logique

dans ce cas essaye avec

Code : Tout sélectionner

For x=0 to largeur-9 step 8
Dernière modification par Zorro le mar. 02/juil./2019 18:16, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: steganosorus

Message par venom »

Oui j'avais bien vue que tu n'utilisait pas de tableau. Mais c'est bien cette ligne qui renvoyer une erreur plot hors limite une erreur du genre. (Je ne l'ai plus en tête)

Ok j'essaierai la modif merci.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: steganosorus

Message par Zorro »

sinon pose une image qui pose probleme ici , que je puisse tester dans les meme conditions :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: steganosorus

Message par venom »

J'avais eu le tour sur une image bmp 100x100 entièrement blanche créé sous photoshop. Mais j'en posterais une a l'occasion.
Edit :
Image







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: steganosorus

Message par Zorro »

oui c'est bien ça ,il faut mettre

Code : Tout sélectionner

For x=0 to largeur-9 step 8
j'ai corrigé le listings ci dessus Merci :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre