Procedure Vigenere

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Procedure Vigenere

Message par venom »

rooo.... "En tout cas on est paré avec toutes ces codes décryptage by ALL" :D






@++
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: Procedure Vigenere

Message par Zorro »

arf ..
je viens d'effectuer une toute petite modif mais essentiel

je m'en suis rendu compte en le mettant a l'epreuve :)
maintenant c'est du beton :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Procedure Vigenere

Message par PAPIPP »

Bravo Dobro pour ton code Vegener avec un mot de passe allongé

Remarque pour l’amélioration du mot de passe allongé ;
J'ai générer un randomseed(x) lié au mot de passe en effet
randomSeed(8) suivi de random(max,min) va générer quelque soit le mot de passe toujours la même suite d’indices pour aller chercher dans mot de passe le caractère à ajouter.
Afin d’améliorer cette suite d’indices semi-aléatoire on peut lier le départ de cette suite non pas d’une façon fixe RandomSeed(8) mais en la liant à la longueur du mot de passe et à la somme des caractères du mot de passe.

j'ai aussi généré une table alphabet mélangée à partir de ce randomseed(x)
et j'ai complété alphabet de tous les caractères que l'on trouve sur le clavier, j'espère n"en avoir pas oubliè.

Ce code n'est pas optimisé on peut encore l'améliorer.

Code : Tout sélectionner


; Vigenere Codec
Declare.s rallonge_password(pass.s,longueur_pass)
Declare.s vigenere(txt.s,pass.s,mode)
txt.s="il etait un petit navire, qui n'avait ja ja jamais navigué , qui n'avait ja ja jamais navigué hoé hoé !"
pass.s="hello , le soleil brille brille brille ."
; pass.s="au  claire  de la  lune mon ami pierrot."

;************************************************************
;**** génére un départ de random lié au mot de pâsse
; pour ne pas génerer les même indices pos avec des pw différents il suffit de lier le début du randomseed au mot de passe  exemple longueur + somme des caractères 
Global valsomme.l, alphabet.s
  long= Len(pass.s)
  valsomme=long
  For i=1 To long
    car.s=Mid(pass.s,i,1)
    valsomme+PeekC(@car) ;; valable en unicode et en ASCII
  Next 
  
    ;**************************************************************************************************************************
  ;;Partie permettant de générer un alphabet mélangé avec un randomseed(x) x est la valeur globale de valsomme
  Structure Alpha 
    StructureUnion 
      alphabet.s{200}
      carac.c[200]
    EndStructureUnion  
  EndStructure
  Define alph.alpha\alphabet="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,;:!<>?./§&é'(-è_çà)=~#{[|`\^@]}+°%ù*µ^$£"
  Debug alph\alphabet
  longalpha=Len(alph\alphabet)
;   Debug _s(longalpha)
  RandomSeed(valsomme) 
  For i=0 To longalpha-1
    rdll=Random(longalpha-1,1) 
    Swap alph\carac[i], alph\carac[rdll]
  Next 
;   Debug  _s(alph\alphabet) 
;   Alphabet.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  Alphabet.s=alph\alphabet; ce transfert permet de ne pas modifier le reste du programme mais le code n'est pas optimisé
  
  ;*******************************************************************************************************************************

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

Debug "Phrase en clair de depart :"+txt.s
Debug "mot de pass :"+pass.s
Debug ""
mode=1 ; encode
encode.s=Vigenere(txt.s,pass.s,mode)
Debug "phrase encodée :"+encode.s
Debug ""
mode=0 ;decode
decode.s=Vigenere(encode.s,pass.s,mode)
Debug "phrase décodée :"+decode.s

Procedure.s rallonge_password(pass.s,longueur_pass)
  ; By Zorro
  ; le but de cette procedure, est de rallonger un mot de pass en prenant des lettres de ce mot de pass
  ; de la sorte, on peut avoir un mot de pass aussi long que le truc qu'on encode/decode
  ; ce qui garantie un quasi inviolabilité du codage :o)
  Protected passwrd.s,long
  long= Len(pass.s)-1 
  RandomSeed(valsomme) ; <<<< ceci pour etre sur qu'avec des mots de passe différents  avoir des indices différents (un peu plus difficile à craker ..
  
  If long<longueur_pass            
    manque=(longueur_pass-long)-1
    passwrd.s=pass.s
    For y= 1 To manque
      pos=Random(long,1)  
;       Debug "pos="+Str(pos)
      passwrd.s=passwrd.s+Mid(pass.s,pos,1)               
    Next y
    ProcedureReturn passwrd.s
  Else
    ProcedureReturn pass.s
  EndIf
EndProcedure
Procedure.s Vigenere(txt.s,pass.s,mode)
         ; By Zorro
         ; ici j'utilise un alphabet tres classique, mais le mieux serai de melanger les lettres de l'alphabet
         ; pour ne pas rendre prévisible l'emplacement de telle ou telle lettre ;o)
         ; tout caractere n'etant pas dans l'alphabet , est utilisé telquel (je prends son code Ascii)
         ; j'ai Ajouté l'espace, pour  ne pas avoir une découpe des mots qui aparaitrait dans le resultat codé :o)
         Alphabet.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
         sortie.s=""
         If Len(pass.s)<Len(txt.s)
            pass.s=rallonge_password(pass.s,Len(txt.s))
         Else
            pass.s=Left(pass.s,Len(txt.s))
         EndIf
         Select mode
         Case 1 ; Action encodage            
            For p=1 To Len(txt.s)
               car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
               car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
               car_encode=(car_clair+car_pass)
               If car_encode >Len(Alphabet.s)
                  car_encode=car_encode-Len(Alphabet.s)
               EndIf
               If car_clair=0               
                  sortie.s=sortie.s+Mid(txt.s,p,1)
               Else
                  sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
               EndIf
               
            Next p
         Case 0 ; Action décodage
            For p=1 To Len(txt.s)
               car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
               car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))   
               
               car_decode=(car_clair-car_pass)
               If car_decode<1:car_decode=Len(Alphabet.s)+car_decode   :EndIf
               If car_clair=0                  
                  sortie.s=sortie.s+Mid(txt.s,p,1)
               Else
                  sortie.s=sortie.s+Mid(Alphabet.s,car_decode,1)
               EndIf
            Next p
            
         EndSelect
         
         ProcedureReturn sortie.s
      EndProcedure


Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Procedure Vigenere

Message par Zorro »

une belle amélioration en effet :)
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
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Procedure Vigenere

Message par JohnJohnsonSHERMAN »

Parfait ces améliorations... comme ca j'aurais pas a me casser la tête dessus plus tard :mrgreen:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Procedure Vigenere

Message par Zorro »

Attention , j'ai corrigé un bug sur la procedure Vigenere du premier message

dans certain cas ça ne marchait pas ...... :oops:

maintenant, c'est beton !! :)

@PAPIPP ou un modo
si vous pouviez remplacer la procedure Vigenere de Papipp par celle du premier message ou celle-ci

Code : Tout sélectionner

Procedure.s Vigenere(txt.s,pass.s,mode)
			; By Zorro
			; ici j'utilise un alphabet tres classique, mais le mieux serai de melanger les lettres de l'alphabet
			; pour ne pas rendre prévisible l'emplacement de telle ou telle lettre ;o)
			; tout caractere n'etant pas dans l'alphabet , est utilisé telquel (je prends son code Ascii)
			; j'ai Ajouté l'espace, pour  ne pas avoir une découpe des mots qui aparaitrait dans le resultat codé :o)
			Alphabet.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
			sortie.s=""
			If Len(pass.s)<Len(txt.s)
				pass.s=rallonge_password(pass.s,Len(txt.s))
			Else
				pass.s=Left(pass.s,Len(txt.s))
			EndIf
			Select mode
			Case 1 ; Action encodage				
				For p=1 To Len(txt.s)
					car_clair=FindString(Alphabet.s,Mid(txt.s,p,1)) 
					car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
					car_encode=(car_clair+car_pass)
					If car_encode >Len(Alphabet.s)
						car_encode=car_encode-Len(Alphabet.s)
					EndIf
					If car_clair=0					
						sortie.s=sortie.s+Mid(txt.s,p,1)
					Else
						sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
					EndIf
					
				Next p
			Case 0 ; Action décodage
				For p=1 To Len(txt.s)
					car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
					car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))	
					
					car_decode=(car_clair-car_pass) 
					If car_decode<1:car_decode=Len(Alphabet.s)+car_decode	:EndIf
					If car_clair=0						
						sortie.s=sortie.s+Mid(txt.s,p,1)
					Else
						sortie.s=sortie.s+Mid(Alphabet.s,car_decode,1)
					EndIf
				Next p
				
			EndSelect
			
			ProcedureReturn sortie.s
		EndProcedure

ma modification remplace en fait :

Code : Tout sélectionner

Case 1 ; Action encodage
     
      For p=1 To Len(txt.s)
        car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
        car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
        car_encode=(car_clair+car_pass)% Len(Alphabet.s)               
        If car_clair=0
          car_clair=Asc(Mid(txt.s,p,1))
          sortie.s=sortie.s+Chr(car_clair)
        Else
          sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
        EndIf
       
      Next p
par cela :

Code : Tout sélectionner

Case 1 ; Action encodage				
				For p=1 To Len(txt.s)
					car_clair=FindString(Alphabet.s,Mid(txt.s,p,1)) 
					car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
					car_encode=(car_clair+car_pass)
					If car_encode >Len(Alphabet.s)
						car_encode=car_encode-Len(Alphabet.s)
					EndIf
					If car_clair=0					
						sortie.s=sortie.s+Mid(txt.s,p,1)
					Else
						sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
					EndIf
					
				Next p

le

Code : Tout sélectionner

% Len(Alphabet.s) 
met la lose !!
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
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Procedure Vigenere

Message par JohnJohnsonSHERMAN »

Merci de la correction Dobro, j'ai plus trop le temps de me pencher sur les codes de Vigenére en ce moment, mais je vais tester tout ca :P
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Procedure Vigenere

Message par Zorro »

j'ai du apporter une correction, car je suis en train d'utiliser cette procedure avec EPB
et, du coup ça la met bien en epreuve :)

pour le moment, plus aucun problemes rencontrés ça roooooule :)
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 : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Procedure Vigenere

Message par Ar-S »

modif faite.
~~~~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: Procedure Vigenere

Message par Zorro »

Merci Ar-s :)
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