0

Crypter avec une fonction affine

affine

Le chiffrage affine utilise une fonction affine du type y = (ax + b) pour crypter des données; a et b sont des constantes que l’on nommera ici CleA et CleB et ou x et y sont des nombres correspondant aux lettres de l’alphabet en sachant que A=0, B=1, C=2…

On remarquera que si a=1, on se retrouve avec le chiffre de César et par conséquence « b » sera le décalage.
On remarquera également que si b=0 alors « a » sera toujours chiffré « A »

Les formules de chiffrement et de déchiffrement sont :
pour crypter :  C=c(x)= (ax + b) mod 26 ‘on travaille avec un modulo 26 pour que la lettre chiffré soit un nombre entre 0 et 25
pour décrypter : D=d(x)=(a^-1 * (x – b)) mod 26

La fonction crypeaffine va chercher la position de la lettre à crypter dans l’alphabet,
applique la formule de cryptage et retourne la lettre cryptée

Fonction crypeaffine (Entrée lettre : chaine; Entrée CleA : entier; _
Entrée CleB : entier; Sortie crypteaffine : chaine)
ENTIER X
X :=posalph(lettre)
X :=((CleA * X) + CleB ) Mod 26
crypteaffine := posnum(X)
Fin fonction

 

posalpha est une fonction qui retourne la position de la lettre dans l’alphabet en commençant par A=0

Fonction Posalpha (Entrée lettre : chaine; Sortie Posalpha : entier)
CHAINE alpha, tempo
alpha := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

pour i allant de 0 à longueur(alpha)
  tempo=alpha[i]
  si lettre = tempo alors
      Posalpha=i
      sort de pour
  Fin de si
prochain i

fin fonction

 

posnum est une fonction qui retourne la lettre de l’alphabet par rapport à une postion donnée

Fonction Posnum (Entrée position : entier; Sortie Posnum : chaine)
CHAINE alpha
alpha := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Posnum=alpha[position] -1 // A=0

fin fonction

La fonction decrypeaffine va chercher la position de la lettre à décrypter dans l’alphabet,
applique la formule de décryptage et retourne la lettre décryptée

fonction decrypteaffine (Entrée lettre : chaine; _
Entrée CleA : entier; Entrée CleB : entier; Sortie decrypteaffine : chaine)

ENTIER X

InvA=InvA(CleA)
X :=posalph(lettre)
X :=(InvA * (x - CleB)) Mod 26
decrypteaffine := posnum(X)

fin fonction

 

Cette fonction retourne l’inverse de CleA obligatoire pour pouvoir décrypter

fonction InvA (Entrée CleA : entier, Sortie InvA : entier
pour i allant de 1 à 26
   si (CleA * i ) mod 26 = 1 alors
      InvA=I
   sort de pour
   fin de si
fin de pour
fin fonction

 Code visual basic 6

Télécharger la source

Dim alphab As String 'alphabet
Dim tabsortie() As String 'contient la chaine de sortie
Dim cleA, cleB As Integer 'les clé de cryptage pour la fonction

Private Sub Form_Load()
alphab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
End Sub

Private Sub btcrypte_Click()
Dim chacrypter As String 'la chaine a crypter

'on sort de la procedure si l'user n'a pas choisi  de clé ou de texte a crypter
If T_a.Text = "" Or t_b.Text = "" Then MsgBox "Vous devez choisir les clés A et B de la fonction de cryptage", vbCritical, "erreur": Exit Sub
If tcrypte.Text = "" Then MsgBox "Veuillez entrez un texte à crypter", vbCritical, "erreur": Exit Sub
cleA = T_a.Text
cleB = t_b.Text
chacrypter = Replace(UCase(tcrypte.Text), " ", "") 'sans espace, en majuscule
ReDim tabsortie(Len(chacrypter))

'ETAPE//////////////////////
'on recupere lettre a lettre la chaine a crypter
'pour chaque lettre recuperé :
Dim ltrcrypter As Integer
Dim x As Integer 'position de la lettre
For i = 0 To Len(chacrypter) - 1
'on cherche sa correspondance lettre/chiffre en sachant que A=0
x = (InStr(1, alphab, Mid(chacrypter, (i + 1), 1))) - 1
'on crypte avec la fonction (ax + b) mod 26
ltrcrypter = ((cleA * x) + cleB)
ltrcrypter = modulo(ltrcrypter, 26)
'et on va chercher la lettre correspondante dans l'alphabet
tabsortie(i) = Mid(alphab, (ltrcrypter + 1), 1) '+1 car A=0
Next i

'on affiche le resultat
tdecrypte.Text = ""
For i = 0 To Len(chacrypter) - 1
If i Mod 4 = 0 Then esp = " " Else esp = ""
tdecrypte.Text = tdecrypte.Text & esp & tabsortie(i)
Next i

End Sub

Private Sub btdecrypte_Click()

'on sort de la procedure si l'user n'a pas choisi  de clé ou de texte a decrypter
If T_a.Text = "" Or t_b.Text = "" Then MsgBox "Vous devez choisir les clés A et B de la fonction de cryptage", vbCritical, "erreur": Exit Sub
If tdecrypte.Text = "" Then MsgBox "Veuillez entrez un texte à decrypter", vbCritical, "erreur": Exit Sub

Dim chadecrypter As String
chadecrypter = Replace(UCase(tdecrypte.Text), " ", "") 'sans espace, en majuscule
ReDim tabsortie(Len(chadecrypter))
cleA = T_a.Text
cleB = t_b.Text

'on cherche a^-1 'inverse de a
'soit quel est le chiffre qui multiplié par "a" mod 26 donne 1
Dim InvA As Integer
InvA = 0
For i = 1 To 26
If (cleA * i) Mod 26 = 1 Then
    InvA = i
    Exit For
End If
Next i

'Etape decryptage////////////
Dim x As Integer 'position de la lettre
Dim ltradecrypter As Integer
'on recupere lettre a lettre la chaine a decrypter
'pour chaque lettre recuperé :
For i = 0 To Len(chadecrypter) - 1
'on cherche sa correspondance lettre/chiffre en sachant que A=0
x = (InStr(1, alphab, Mid(chadecrypter, (i + 1), 1)) - 1) '-1 car A=0
'on decrypte avec (a^-1 * (x - b))mod 26
ltradecrypter = (InvA * (x - cleB))
ltradecrypter = modulo(ltradecrypter, 26)
'et on va chercher la lettre correspondante dans l'alphabet
tabsortie(i) = Mid(alphab, (ltradecrypter + 1), 1)
Next i

'on affiche le resultat
tcrypte.Text = ""
For i = 0 To Len(chadecrypter) - 1
tcrypte.Text = tcrypte.Text & tabsortie(i)
Next i
End Sub

'la fonction modulo de vb retourne un nombre erroné sur un modulo negatif
'cette fonction permet un bon calcul du modulo
Public Function modulo(x As Integer, k As Integer) As Integer
 Dim valeur As Integer
 valeur = x Mod k
  If (valeur < 0) Then
    modulo = valeur + k
  Else
    modulo = valeur
End If
End Function

You must be logged in to post a comment.