
@++
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
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
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
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
Code : Tout sélectionner
% Len(Alphabet.s)