Procedure Vigenere
Publié : mer. 03/août/2016 9:53
toujours dans le cadre de mon EPB , je recherche un moyen de cryptage fiable
et rapide
voici ma version de l'algo de Vigenere qui consiste a encoder un texte avec un mot de pass
chaque lettre du texte en clair et chaque lettre du mot de pass sont recherché dans une table (un alphabet)
la position de ces lettres trouvé dans l'alphabet sont additionné
c'est la lettre a la position correspondante a ce resultat qui est ecrit ...
pour le decodage, il suffit de soustraire la position dans l'alphabet de la lettre codé avec la position de la lettre du pass
pour avoir la position de la lettre en clair ...
en clair :
alphabet.s = "abcdef"
dans cet alphabet a=1,b=2,c=3 ,d=4,e=5,f=6
mot_de_pass="b"
lettre_en_clair="c"
on va encoder "c" avec le pass "b"
"c" a la position 3 dans l'alphabet
"b" a la position 2
donc 3+2=5 , la lettre utiliser pour encoder c'est donc "e" --> "c"+"b"="e"
pour le decodage
nous avons "e" (5em lettre de notre alphabet )
on soustrait la position de la lettre du mot de pass "b" (2em lettre de notre alphabet )
donc 5-2=3
la troisieme lettre de notre alphabet c'est donc "c" ; on retrouve bien notre lettre de depart
voici mon code , qui en plus inclue un allongeur de mot de pass pour que le mot de pass soit aussi long que le truc qu'on encode
ça garantie une quasi inviolabilité du code
et rapide
voici ma version de l'algo de Vigenere qui consiste a encoder un texte avec un mot de pass
chaque lettre du texte en clair et chaque lettre du mot de pass sont recherché dans une table (un alphabet)
la position de ces lettres trouvé dans l'alphabet sont additionné
c'est la lettre a la position correspondante a ce resultat qui est ecrit ...
pour le decodage, il suffit de soustraire la position dans l'alphabet de la lettre codé avec la position de la lettre du pass
pour avoir la position de la lettre en clair ...
en clair :
alphabet.s = "abcdef"
dans cet alphabet a=1,b=2,c=3 ,d=4,e=5,f=6
mot_de_pass="b"
lettre_en_clair="c"
on va encoder "c" avec le pass "b"
"c" a la position 3 dans l'alphabet
"b" a la position 2
donc 3+2=5 , la lettre utiliser pour encoder c'est donc "e" --> "c"+"b"="e"

pour le decodage
nous avons "e" (5em lettre de notre alphabet )
on soustrait la position de la lettre du mot de pass "b" (2em lettre de notre alphabet )
donc 5-2=3
la troisieme lettre de notre alphabet c'est donc "c" ; on retrouve bien notre lettre de depart

voici mon code , qui en plus inclue un allongeur de mot de pass pour que le mot de pass soit aussi long que le truc qu'on encode
ça garantie une quasi inviolabilité du code

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ée , qui n'avait ja ja jamais naviguée hoé hoé !"
pass.s="hello , le soleil brille brille brille ."
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ée du codage :o)
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ée !! (pour le decodage c'est mieux LOL )
; par exemple avec le pass "Soleil" et la longueur 23 on aura toujours ceci de généré : "SoleilieoeSeiolollilieS" :o)
long= Len(pass.s)-1
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
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
; Epb