0% ont trouvé ce document utile (0 vote)
87 vues6 pages

Serie 3 Python

Le document traite du chiffrement et déchiffrement de données à l'aide de méthodes de cryptage affine. Il décrit le processus de cryptage en utilisant une clé entière et fournit des exercices pratiques pour implémenter des fonctions de cryptage et décryptage en Python. Les exercices incluent des questions sur les propriétés des clés de cryptage et des exemples de chiffrement de mots spécifiques.

Transféré par

huaweiyuti9
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
87 vues6 pages

Serie 3 Python

Le document traite du chiffrement et déchiffrement de données à l'aide de méthodes de cryptage affine. Il décrit le processus de cryptage en utilisant une clé entière et fournit des exercices pratiques pour implémenter des fonctions de cryptage et décryptage en Python. Les exercices incluent des questions sur les propriétés des clés de cryptage et des exemples de chiffrement de mots spécifiques.

Transféré par

huaweiyuti9
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Série no 3 : Chiffrement et

Déchiffrement de Données

Exercice 1
Chacune des 26 lettres est associée à l’un des entiers de 0 à 25, selon le tableau de
correspondance suivant.

A B C D E F G H I J K L M
0 1 2 3 4 5 6 7 8 9 10 11 12

N O P Q R S T U V W X Y Z
13 14 15 16 17 18 19 20 21 22 23 24 25

Le cryptage affine se fait à l’aide d’une clé, qui est un nombre entier k fixé, compris entre 1 et
25. Pour crypter une lettre donnée on suit le processus ℘ suivant :
 on repère le nombre x associé à la lettre dans le tableau de correspondance précédent
 on multiplie ce nombre x par la clé k
 on calcule le reste r de la division euclidienne du nombre obtenu par 26
 on repère la lettre associée au nombre r dans le tableau de correspondance, qui devient
la lettre cryptée
Par exemple, pour crypter la lettre P avec la clé 𝑘=11 :
 le nombre x associé à la lettre P est le nombre 15
 on multiplie 15 par la clé k, ce qui donne 11×15=165
 on calcule le reste de la division euclidienne par 26 : on obtient 165 % 26 = 9
 on repère finalement la lettre associée à 9 dans le tableau, c’est-à-dire J
Ainsi avec la clé k = 11, la lettre P est cryptée en la lettre J.

Indications :

La fonction alphabet.index(‘P’) renvoie la position de la lettre P dans la liste alphabet qui est
15

alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',

'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

L’indice de la lettre codée = (11 x indice lettre à coder) mod 26

La lettre codée = alphabet [indice de la lettre codée]

Si le caractère à coder n'est pas dans l'alphabet, la fonction retourne simplement le même
caractère.

1. Que penser du cryptage obtenu lorsque la clé k est égale à 1 ?


2. En quoi la lettre A constitue-t-elle un cas particulier dans le processus de cryptage ?
3. Ecrire une fonction indice qui prend en paramètre une lettre de l’alphabet et qui renvoie
son indice dans la liste alphabet.
4. Ecrire une fonction crypterLettre qui prend en paramètre une chaîne de caractères
constituées d’une lettre majuscule de l’alphabet et une clé et qui renvoie la lettre cryptée.
Cette fonction utilisera la fonction indice précédente.
5. Ecrire une fonction crypterTexte qui prend en paramètre une chaîne de caractères dont
les éléments sont soit des lettres majuscules soit des espaces (qui ne seront pas
modifiés), et une clé. La fonction renvoie la chaîne de caractères cryptés.
6. Crypter le mot MIRO pour k=11
7. On admet qu’une clé k est une bonne clé de cryptage si et seulement si 𝑘≠1 et 𝑘∧26=1,
c’est-à-dire k est premier avec 26. Ou le PGCD(k,26)=1
Ecrire une fonction PGCD(a,b) qui renvoie l’entier a. Appliquer cette fonction pour
chercher toutes les valeurs de k premiers avec 26
Est-ce que k=11 est une bonne clé de cryptage ?
8. On dit qu’une clé est une bonne clé de cryptage si elle possède une clé associée k’, qui
est un nombre entier compris entre 1 et 25 tel qu’en appliquant le processus ℘ avec la
clé k’ à une lettre cryptée (avec la clé k) on obtient la lettre initiale. k’ est alors appelée
clé de décryptage associée à k tel que ( k*k’)mod26 = 1
Ecrire une fonction cleDecryptage qui prend en paramètre un entier k premier avec 26
et qui renvoie la clé de décryptage associée k’.
Quelle est la valeur de la clé de décryptage k’ associée à k=11 ?

Exercice 2

Un chiffrement affine consiste à utiliser comme clé de chiffrement une fonction affine :

0, 1, 2, . . . , 25 → 0, 1, 2, . . . , 25
𝒇:
𝑥 ⟼𝑓 𝑥 𝑎𝑥 𝑏 𝑚𝑜𝑑 26
(où a et b sont des entiers et x est la position de la caractère du message à chiffré donnée dans
le tableau ci-dessous ).

Dans cet exercice on chiffre les lettres de l’alphabet à l’aide de la clé de chiffrement :

0, 1, 2, . . . , 25 → 0, 1, 2, . . . , 25
𝒇:
𝑥 ⟼𝑓 𝑥 17𝑥 22 𝑚𝑜𝑑 26

Par exemple : pour crypter la lettre P avec la clé ci-dessus on suit le processus suivant :
o Le nombre associé à la lettre P est le nombre 15 selon le tableau de correspondance
suivant.

A B C D E F G H I J K L M
0 1 2 3 4 5 6 7 8 9 10 11 12

N O P Q R S T U V W X Y Z
13 14 15 16 17 18 19 20 21 22 23 24 25
Indications :

La fonction alphabet.index(‘P’) renvoie la position de la lettre P dans la liste alphabet qui est
15

alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',

'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

L’indice de la lettre codée = (17 x indice lettre à coder + 22 ) mod 26

La lettre codée = alphabet [indice de la lettre codée]

o On calcule (17 × 15+ 22 ) = 277


o On calcule le reste de la division euclidienne par 26 : on obtient 277 % 26 = 17
o On repère finalement la lettre associée à 17 dans le tableau, c’est-à-dire R

1. Ecrire une fonction python cryptage_affine qui prend deux arguments (le message
à crypter et la clé de cryptage a et b) et renvoie le message crypté.
Attention le message est une chaine qui peut contenir des sous chaines
Si le caractère à coder n'est pas dans l'alphabet, la fonction retourne simplement le caractère.

2. Chiffrer le message : TEST.


3. La clé de déchiffrement correspondante est :

0, 1, 2, . . . , 25 → 0, 1, 2, . . . , 25
𝑔:
𝑥 ⟼𝑔 𝑥 23𝑥 14 𝑚𝑜𝑑 26

Ecrire une fonction python decryptage_affine qui prend deux arguments (le message à
décrypter et la clé de cryptage a et b) et renvoie le message décrypté.
4. Déchiffrer le message : NZWPA.

Correction Exercice 1
def indice (lettre) :
return L.index(lettre)

# def indice (lettre) :


# i = 0
# while L[i] != lettre :
# i += 1
# return i

def crypterLettre (lettre, k) :


c = (indice(lettre)*k)%26
return L[c]

L = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z']

def crypterTexte (texte, k) :


T = ''
for lettre in texte :
if lettre in L :
T += crypterLettre(lettre,k)
else :
# tout ce qui n’est pas une majuscule
T += lettre
return T

texte='MIROa'

def pgcd(a, b):


while b:
a, b = b, a % b
return a
for k in range(26) :
if pgcd(k, 26) == 1 :
print(k, end=' ') # Output: 1 3 5 7 9 11 15 17 19 21
23 25

k=11
print(crypterTexte(texte, k)) # Output:

def cleDecryptage (k) :


# k est premier avec 26
for i in range(26) :
if (i*k) %26 == 1 :
return i

print(cleDecryptage(11)) # Output: 19

print(crypterTexte('CKFY', 19))

Correction Exercice 2

def affine_encrypt(message, a, b):

alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',


'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
encrypted_message = ''
print(f"Message: {message}")
for mot in message:
for char in mot:
if char in alphabet:
# Vérification de l'existence du caractère
dans l'alphabet
index = alphabet.index(char)
new_index = (index * a + b) % 26
encrypted_message += alphabet[new_index]
else:
# Si le caractère n'est pas dans
l'alphabet, on l'ajoute tel quel
encrypted_message += char
encrypted_message +=' '

return encrypted_message

# Example
message = ['TEST']
a = 17
b = 22
encrypted_message = affine_encrypt(message, a, b)
print(f"Encrypted message: {encrypted_message}")
a1=23
b1=14
message2 = ['NZWPA']
decrypted_message = affine_encrypt(message2, a1, b1)
print(f"Decrypted message: {decrypted_message}")

Vous aimerez peut-être aussi