Page 1 sur 2

procedure XOR

Publié : mar. 02/août/2016 15:52
par Zorro
revision de ma procedure de XOR :)

Code : Tout sélectionner


;***********************************************
;Titre  :*codec_xor_xor_procedure
;Auteur  : Zorro
;Date  :02/08/2016
;Heure  :16:03:24
;Version Purebasic :  PureBasic 5.50 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune 
;***********************************************


Declare.s codec_xor(sortie$, password.s)


;  ***************** l'encodeur  qui peut etre un prg a part que tu garde pour toi *********************
textacoder$="les Potirons sont ronds" ; le mot a coder
Password$="Le soleil brille" ; le mot de pass 

Debug "le Password est :" +Password$
Debug "le mot avant codage :"+textacoder$ ; avant codage
; 
coder$=codec_xor(textacoder$,Password$) ; on code le text avec la librairie
; 
Debug "le mot codé : "+coder$ ; apres codage

; **************************************************************************************


; ********************le decodeur  a mettre dans ton code (avec la procedure) ***************************** 

decoder$=codec_xor(coder$,"Le soleil brille") ; on decode le text encodé avec la librairie 
Debug "voici le mot decodé par la procedure :  "+decoder$ ; apres décodage 

;- *** Zone Procedures

Procedure.s codec_xor(sortie$, Password.s) 
		;by Dobro (Zorro)
		; Code Xor simple
		Text.s=sortie$
		Password.s=UCase(Password.s)
		P=0
		long_or = Len(Text.s)
		long_pass = Len(Password.s) 
		For i=1 To long_or
				P=P+1 : If P= long_pass:P=1:EndIf ; fait tourner le mot de pass
				car_pass.l=Asc( Mid(Password.s, P, 1))  ; recupere une lettre (son code ascii)du mot de pass
				car_text.l= Asc(Mid(Text.s, i, 1)) ; recupere une lettre (son code ascii) du text a coder
				If car_text.l=car_pass.l ; le caractere du text et le caractere du passwrd sont pareille !!									
						car_text.l=255 ; pour eviter de se retrouver avec un zero , on remplace le caractere du text par 255 ! 
						sorti.l=car_text.l;et on prends le code 255 a la place du caractere !!
						text_sorti.s=text_sorti.s+Chr(sorti)  ; on l'ajoute a la chaine de sortie
						Flag_xor=1 ; ce flag nous permet d'eviter une section de code plus bas (evite un Goto )
				ElseIF car_text.l=255 ; la on tombe sur le caractere special 255 , qui nous indique qu'il faut remplacer celui ci par la lettre du mot de pass
						car_text.l=car_pass.l ; c'est ce qu'on fait ici
						sorti.l=car_text.l;
						text_sorti.s=text_sorti.s+Chr(sorti) ; on l'ajoute
						Flag_xor=1 ; ; ce flag nous permet d'eviter une section de code plus bas (evite un Goto )
				EndIf  
				if Flag_xor=0 ; la fameuse partie de code a eviter en cas de caractere special (lettre du message = lettre du mot de pass)
						sorti.l= car_pass ! car_text ; un petit XOR  .... ici on fait un Xor simple sans avoir a bidouiller .... les caracteres message et mot de pass sont different						
						text_sorti.s=text_sorti.s+Chr(sorti)  ; on ajoute notre resultat a la chaine de sortie
				Endif
				Flag_xor=0 ; on remet le flag a zero au cas ou ...
		Next i ; on continu au caractere suivant :o)
		Text.s= text_sorti.s
		text_sorti.s=""
		ProcedureReturn Text.s  ; renvoi le resultat de notre opération
EndProcedure


Re: procedure XOR

Publié : mar. 02/août/2016 16:38
par JohnJohnsonSHERMAN
Joli... ca code bien aussi 8) Et en plus il n'y a qu'une seule procédure, fallait y penser (c'est un codage réversible en quelque sorte?).

Tiens dans le même genre un algo de codage en code de Vigenère (que j'ai fait en 15 min):

Code : Tout sélectionner

Declare Code()
Declare Decode()

OpenWindow(0,0,0,200,50,"Code de Vigenère",#PB_Window_Tool | #PB_Window_ScreenCentered)
ButtonGadget(1,10,10,80,35,"Coder")
ButtonGadget(2,110,10,80,35,"Décoder")

Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Code()
          End
        Case 2
          Decode()
          End
      EndSelect
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

      
Procedure Code()
  Define.s TexteCode,CharCle,CharClair,CharCode

Alphabet.s = "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN,;:!?./§0123456789&é(-è_çà)=ù*$^%£² +\|[]#@"
TexteClair.s=InputRequester("Vigenere 1.0","Entrez le texte en clair à coder.","")
Cle.s=InputRequester("Vigenere 1.0","Entrez la clé de code.","",#PB_InputRequester_Password)
While Len(Cle) < Len(TexteClair)
  Cle=Cle+Cle
Wend

For i=1 To Len(TexteClair)
  CharClair = Mid(TexteClair,i,1)
  CharCle = Mid(Cle,i,1)
  PosCle = FindString(Alphabet,CharCle)
  PosClair = FindString(Alphabet,CharClair)
  PosCode = PosCle + PosClair
  If PosCode > Len(Alphabet)
    PosCode - Len(Alphabet)
  EndIf
  
  CharCode = Mid(Alphabet,PosCode,1)
  TexteCode = TexteCode + CharCode
Next
MessageRequester("Texte codé",TexteCode)
EndProcedure

Procedure Decode()
  Define.s TexteCode,CharCle,CharClair,CharCode,TexteClair

Alphabet.s = "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN,;:!?./§0123456789&é(-è_çà)=ù*$^%£² +\|[]#@"
TexteCode=InputRequester("Vigenere 1.0","Entrez le texte codé.","")
Cle.s=InputRequester("Vigenere 1.0","Entrez la clé de code.","",#PB_InputRequester_Password)
While Len(Cle) < Len(TexteCode)
  Cle=Cle+Cle
Wend

For i=1 To Len(TexteCode)
  CharCode = Mid(TexteCode,i,1)
  CharCle = Mid(Cle,i,1)
  PosCle = FindString(Alphabet,CharCle)
  PosCode = FindString(Alphabet,CharCode)
  PosClair = PosCode - PosCle
  If PosClair < 0
    PosClair + Len(Alphabet)
  EndIf
  
  CharClair = Mid(Alphabet,PosClair,1)
  TexteClair = TexteClair + CharClair
Next
MessageRequester("Texte en clair",TexteClair)
EndProcedure
Exemple :
Texte en clair:

Code : Tout sélectionner

Le code de Vigenere est simple et pratique.
Clé : "Sherman"
Texte codé :

Code : Tout sélectionner

*j|;ZhE3luudrIDl|vczlXcEsdzl.l|xw+PWHs1
A noter qu'en Vigenére, si la clé est aussi longue ou plus longue que le texte à coder, le texte codé ne pourra pas être cracké ! 8) C'est toujours bon a savoir... (en pratique, sur un texte court, une clé égale aux 2/3 du texte a coder est largement suffisante).

Je réflechis aussi a un moyen de faire en sorte de faire d'une clé coutre (genre un mot) un clé aussi longue que le texte, sans pour autant qu'il n'y ait de répétition dans la clé... Dur dur

Re: procedure XOR

Publié : mar. 02/août/2016 17:21
par Zorro
A noter qu'en Vigenére, si la clé est aussi longue ou plus longue que le texte à coder, le texte codé ne pourra pas être cracké
l'attaque par statistique , semble pouvoir faire tomber un Vigenére ,

par contre pas le XOR ( a condition qu'il soit bien utilisé ) , il ne fait pas appel a une table ....
pour le XOR , je dirai a la seule condition que le pass soit aussi long que le truc a encoder !!
pas faire l'erreur des magasines info (j'ai oublié le nom) qui proposaient sur un CD rom des images x , ils encodaient ces images X en encodant seulement avec un pass de la longueur de l'entete des images repeté tout au long du fichier !!
probleme, les octets de l'entete des images Jpg est connu comme le loup blanc

or le XOR a un leger probleme :

A XOR passw = Crypté

mais ....
A XOR Crypté = Passw :)

comme on connaissait A (les octets de l'entete jpg , c'etait facile de faire apparaitre le pass , au lieu d'appeler le 3615 code xxxx a pleins de sous la minutes :lol:

JohnJohnsonSHERMAN a écrit : Je réflechis aussi a un moyen de faire en sorte de faire d'une clé courte (genre un mot) un clé aussi longue que le texte, sans pour autant qu'il n'y ait de répétition dans la clé... Dur dur
non non :) (j'adore jouer avec les lettres )

Code : Tout sélectionner

Declare.s rallonge_password(pass.s,longueur_pass)
longueur_pass=23 ; la longueur voulue ... par exemple la longueur du text a encrypter
pass.s="Soleil" ; le mot de pass visiblement trop court 
debug rallonge_password(pass.s,longueur_pass) ; la procedure qui va rallonger le mot de pass de la longeur voulue, avec les lettres du mot de pass prises au hasard

Procedure.s rallonge_password(pass.s,longueur_pass)
		; By Zorro
		Protected passwrd.s,long
		RandomSeed(8) ; <<<< ceci pour etre sur qu'avec un mot de pass precis, on est toujours le meme résultat une fois rallongé !! (pour le decodage c'est mieux LOL )
		; par exemple avec le pass "Soleil" et la longueur 23 on aura toujours ceci de genréré : "SoleilieoeSeiolollilieS"  :o)
		long= len(pass.s)-1
		if longueur_pass <long
				MessageRequester("erreur", "la longueur  demandée,doit etre superieur a la longueur du mot de pass")
				; note qu'on aurai pu reduire le mot de pass dans ce cas avec un simple
				;if longueur_pass<1:longueur_pass=1:endif
				;pass.s=left(pass.s,longueur_pass)
				ProcedureReturn "erreur"
		Endif
		If long<longueur_pass				
				manque=(longueur_pass-long)-1
				passwrd.s=pass.s
				For y= 1 to manque
						pos=random(long,1)						
						passwrd.s=passwrd.s+mid(pass.s,pos,1)					
				Next y
				ProcedureReturn passwrd.s
		Else
				ProcedureReturn pass.s
		Endif
EndProcedure

Re: procedure XOR

Publié : mer. 03/août/2016 9:50
par Kwai chang caine
Cool ces modes de cryptage, jamais entendu parler du "vigneron" 8)
Par contre le XOR on voit ça de partout....alors je me dit que ce doit être éfficace
Merci à vous deux du partage 8)
au lieu d'appeler le 3615 code xxxx a pleins de sous la minutes
Bah je comprend pas...moi j'ai jamais eu à payer quoi que ce soit pour regarder des belles images de filles dans mon lit 8O

Image

Re: procedure XOR

Publié : mer. 03/août/2016 10:29
par Zorro
Image

j'ai bien ris , merci Image


bonne explication ici :
http://www.dcode.fr/chiffre-vigenere#q1

Re: procedure XOR

Publié : mer. 03/août/2016 10:30
par JohnJohnsonSHERMAN
Dobro a écrit :l'attaque par statistique , semble pouvoir faire tomber un Vigenére ,
L'attaque par statistique repose justement sur la répétition de la clé, et vise a trouver un motif régulier dans le texte pour tenter de connaitre la longueur de la clé. Une fois la longueur de la clé connue, on segmente le texte en morceaux de la longueur de cette clé, et on procéde par analyse de fréquences. C'est la méthode du Test de Kasiski. Le fait d'avoir une clé aussi longue que le texte rend impossible sa répétition 8) , et donc le décryptage par cette méthode. L'inconvénient reste la répétition de cette clé, sur de longs textes (remarque sur un long texte ou peut aussi le coder avec une longue clé, genre le dico ou la Bible, mais dans ce cas faut aussi que le correspondant posséde un de ces ouvrages et sache sur quelles pages se trouve la clé...). Article de Wiki trés intéressant sur le code de Vigenère. (en bas de page, Chiffre de Vernam, vous verrez bien... :mrgreen: )

Pas mal ton répétiteur de clé Dobro, merci !

Re: procedure XOR

Publié : mer. 03/août/2016 10:35
par Zorro
Le fait d'avoir une clé aussi longue que le texte rend impossible sa répétition 8) , et donc le décryptage par cette méthode.
oui j'ai lu ça apres avoir ecrit :)
du coup j'ai fait ma propre procedure Vigenere, avec rallongeur de password :)
j'ai inclu le tout dans mon EPB

avant la methode de codage que j'utilisai etait trop simple , un simple decalage d'une lettre (methode Romaine :) )

Re: procedure XOR

Publié : mer. 03/août/2016 11:29
par JohnJohnsonSHERMAN
Méthode romaine : le code César :mrgreen: :mrgreen: Environ quelques minutes d'éspérance de vie....

Au fait, l'idée de rallonger le pass, ca vient de :idea: Un Sherman :idea: , donc ce sera 999.99€ pour le copyright... :mrgreen: :mrgreen:
(c) JohnJohnsonSherman, 2016. Patent no : 5953652. 8)

Re: procedure XOR

Publié : mer. 03/août/2016 11:34
par Zorro
JohnJohnsonSHERMAN a écrit :Méthode romaine : le code César :mrgreen: :mrgreen: Environ quelques minutes d'éspérance de vie....

Au fait, l'idée de rallonger le pass, ca vient de :idea: Un Sherman :idea: , donc ce sera 999.99€ pour le copyright... :mrgreen: :mrgreen:
(c) JohnJohnsonSherman, 2016. Patent no : 5953652. 8)
qui te dis, que ma procedure n'est pas anterieur a l'ecriture de ton idée sur le forum ?? :mrgreen:

que dalle ! t'aura que dalle ! :lol:

Re: procedure XOR

Publié : mer. 03/août/2016 11:47
par JohnJohnsonSHERMAN
Qui te dis que l'apparition de mon idée dans mon cerveau n'est pas antérieure a son écriture sur le forum??
Un optimiste a écrit :que dalle ! t'aura que dalle ! :lol:
J'aurais TOUTE ta fortune, je te ferais des procés, et tu finiras tout moisi en tole :mrgreen: :mrgreen:

Re: procedure XOR

Publié : mer. 03/août/2016 12:37
par Ar-S
Et qui te dit que l'apparition de cette idée dans ton cerveau n'est pas le fruit de ma puissance cérébrale aidée de mon pote Charles Xavier et du Cerebro ? :mrgreen:

Re: procedure XOR

Publié : mer. 03/août/2016 12:45
par JohnJohnsonSHERMAN
Tout simplement : Charles Xavier est controlé par mon cerveau... et ma puissance vient des illuminati et aussi un peu d'une réincarnation de Staline dans une tasse de café, mélangé a un zeste de café fabriqué par Napoléon lui même quand il a conquis la polynésie avec des Panzers bleus... C'est tout simple non? :mrgreen: :mrgreen: :mrgreen:

Re: procedure XOR

Publié : mer. 03/août/2016 12:49
par Zorro
JohnJohnsonSHERMAN a écrit : par Napoléon lui même quand il a conquis la polynésie
ha? il a fait ça napo Leon ?
je croyais que c'etait Cook ...puis bougainville .. :)

Re: procedure XOR

Publié : mer. 03/août/2016 13:23
par Kwai chang caine
Put...alors là.....on a quitté le niveau de Récré A2, on est carrément chez POLAC à 2h du mat 8O
Vos explications et la cryptographie en général ne m'a jamais laissé de glace....
Je pourrais même dire, qu'en lisant ce genre d'explications, je "Crie au génie" (Putain celle là.. je la note) :mrgreen:

@Qui s'en va hors de la nuit
http://www.dcode.fr
Cool ce lien, justement une fois j'avais visité ce genre de site, ou peut etre carrément celui la, et j'etais tombé sur le cul de la complexité et des tronches de ces mecs 8O
Moi aussi il y a une dizaine d'année, j'ai créé des clefs de cryptage perso, avec mon niveau en math de 4e :oops:
J'ai opté pour le mélange des methodes (Inversion de phrase, complementation decimale, etc...) et créé plusieurs clefs de cryptage dont je me sert tous les jours pour bloquer mes giciels.
Mais un jour, le geek de mon boulot, m'a dit que j'avais tout faux, car la premiere chose à faire, c'est de deplacer les caracteres du début, c'est à dire que le A ne soit pas à sa place etc...sinon le cryptage est facile à trouver ...

J'étais fier comme bar tabac, et du coup ce p'tit con, il m'a fait débandé en quelques secondes...
Je hais les jeunes geeks !!!!!! :?

Re: procedure XOR

Publié : mer. 03/août/2016 15:10
par JohnJohnsonSHERMAN
Moi a écrit :Tout simplement : Charles Xavier est controlé par mon cerveau... et ma puissance vient des illuminati et aussi un peu d'une réincarnation de Staline dans une tasse de café, mélangé a un zeste de café fabriqué par Napoléon lui même quand il a conquis la polynésie avec des Panzers bleus... C'est tout simple non? :mrgreen: :mrgreen: :mrgreen:
Zorro (qui apprend son histoire de France) a écrit : ha? il a fait ça napo Leon ?
je croyais que c'etait Cook ...puis bougainville .. :)
Ben oui : la preuve par l'image : (prise sur l'Iphone du Général Troudukoët, second de Napoléon)
Image

On y voit bien le Panzer bleu de l'Empeureur :mrgreen: :mrgreen: