madamasterclass.com

📔 Sécurisation des communications

Comprendre le fonctionnement de la sécurisation des communications

𝐿𝑎 𝑠𝑒́𝑐𝑢𝑟𝑖𝑠𝑎𝑡𝑖𝑜𝑛 𝑑𝑒𝑠 𝑐𝑜𝑚𝑚𝑢𝑛𝑖𝑐𝑎𝑡𝑖𝑜𝑛𝑠 𝑒𝑠𝑡 𝑢𝑛 𝑑𝑜𝑚𝑎𝑖𝑛𝑒 𝑒𝑠𝑠𝑒𝑛𝑡𝑖𝑒𝑙 𝑝𝑜𝑢𝑟 𝑝𝑟𝑜𝑡𝑒́𝑔𝑒𝑟 𝑙'𝑖𝑛𝑡𝑒́𝑔𝑟𝑖𝑡𝑒́, 𝑙𝑎 𝑐𝑜𝑛𝑓𝑖𝑑𝑒𝑛𝑡𝑖𝑎𝑙𝑖𝑡𝑒́ 𝑒𝑡 𝑙'𝑎𝑢𝑡ℎ𝑒𝑛𝑡𝑖𝑐𝑖𝑡𝑒́ 𝑑𝑒𝑠 𝑖𝑛𝑓𝑜𝑟𝑚𝑎𝑡𝑖𝑜𝑛𝑠 𝑒́𝑐ℎ𝑎𝑛𝑔𝑒́𝑒𝑠 𝑒𝑛𝑡𝑟𝑒 𝑙𝑒𝑠 𝑝𝑎𝑟𝑡𝑖𝑒𝑠. 𝑉𝑜𝑖𝑐𝑖 𝑞𝑢𝑒𝑙𝑞𝑢𝑒𝑠 𝑐𝑜𝑛𝑐𝑒𝑝𝑡𝑠 𝑓𝑜𝑛𝑑𝑎𝑚𝑒𝑛𝑡𝑎𝑢𝑥 𝑑𝑒 𝑙𝑎 𝑠𝑒́𝑐𝑢𝑟𝑖𝑠𝑎𝑡𝑖𝑜𝑛 𝑑𝑒𝑠 𝑐𝑜𝑚𝑚𝑢𝑛𝑖𝑐𝑎𝑡𝑖𝑜𝑛𝑠 :

1. Cryptographie
La cryptographie est la science de la communication sécurisée, qui implique le chiffrement et le déchiffrement des données. Voici quelques termes couramment utilisés :
  •         1️⃣ Chiffrement : le processus de conversion de données claires en données chiffrées à l'aide d'un algorithme et d'une clé.
  •         2️⃣ Déchiffrement : le processus inverse du chiffrement, qui consiste à convertir les données chiffrées en données claires à l'aide de la clé appropriée.
  •         3️⃣ Clé : une valeur utilisée par l'algorithme de chiffrement pour transformer les données claires en données chiffrées et vice versa.
  •         4️⃣ Cryptographie symétrique : un système de chiffrement où la même clé est utilisée pour le chiffrement et le déchiffrement.
  •         5️⃣ Cryptographie asymétrique : un système de chiffrement où une paire de clés distinctes (clé publique et clé privée) est utilisée pour le chiffrement et le déchiffrement.

2. Chiffrement de César

Le chiffrement de César est une méthode de chiffrement par substitution simple, où chaque lettre du texte clair est décalée d'un certain nombre de positions dans l'alphabet. Voici un exemple d'implémentation en Python du chiffrement de César :

def encrypt_caesar(plain_text, shift):
encrypted_text = ""

for char in plain_text:
if char.isalpha():
if char.isupper():
encrypted_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
else:
encrypted_char = chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
encrypted_text += encrypted_char
else:
encrypted_text += char

return encrypted_text

# Exemple d'utilisation
text = "Bonjour, comment ça va ?"
shift = 3

encrypted_text = encrypt_caesar(text, shift)
print("Texte chiffré :", encrypted_text)
3. Cryptographie à Clé symétrique avec AES

L'AES (Advanced Encryption Standard) est un algorithme de chiffrement symétrique largement utilisé. Il utilise une clé secrète pour chiffrer et déchiffrer les données. Voici un exemple d'implémentation en Python utilisant la bibliothèque cryptography pour AES :

# AES Simplifié (non complet, juste à des fins éducatives)

# S-Box pour SubBytes
s_box = [
# (0, 1, 2, ..., 15)
[0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5],
[0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76],
# ...
]

# Fonction SubBytes
def sub_bytes(state):
for i in range(4):
for j in range(4):
state[i][j] = s_box[state[i][j] // 16][state[i][j] % 16]

# Fonction ShiftRows
def shift_rows(state):
state[1] = state[1][1:] + state[1][:1]
state[2] = state[2][2:] + state[2][:2]
state[3] = state[3][3:] + state[3][:3]

# Fonction AddRoundKey (simplifiée)
def add_round_key(state, key):
for i in range(4):
for j in range(4):
state[i][j] ^= key[i][j]

# Fonction de chiffrement AES simplifiée
def aes_encrypt(plaintext, key):
state = [[plaintext[i][j] for j in range(4)] for i in range(4)]
add_round_key(state, key)

for _ in range(9): # 9 Rounds
sub_bytes(state)
shift_rows(state)
# MixColumns(state) # Non implémenté pour la simplicité
add_round_key(state, key) # Clé de round simplifiée

sub_bytes(state)
shift_rows(state)
add_round_key(state, key) # Clé finale

return state

# Exemple d'utilisation
plaintext = [
[0x32, 0x88, 0x31, 0xe0],
[0x43, 0x5a, 0x31, 0x37],
[0xf6, 0x30, 0x98, 0x07],
[0xa8, 0x8d, 0xa2, 0x34]
]

key = [
[0x2b, 0x7e, 0x15, 0x16],
[0x28, 0xae, 0xd2, 0xa6],
[0xab, 0xf7, 0x90, 0x8d],
[0x4c, 0x08, 0x00, 0x02]
]

ciphertext = aes_encrypt(plaintext, key)
print("Texte chiffré :", ciphertext)

4. Cryptographie à clé asymétrique avec RSA

Le RSA (Rivest-Shamir-Adleman) est un algorithme de chiffrement asymétrique largement utilisé pour le chiffrement et la signature numérique. Il utilise une paire de clés distinctes : une clé publique pour le chiffrement et une clé privée pour le déchiffrement.
Il repose sur la difficulté de factoriser de grands nombres premiers.


4.1 Génération des Clés
        1. Choisir deux grands nombres premiers \( p \) et \( q \).
        2. Calculer \( n = p \times q \).
        3. Calculer \( \phi(n) = (p-1)(q-1) \).
        4. Choisir un entier \( e \) tel que \( 1 < e < \phi(n) \) et \( \text{pgcd}(e, \phi(n)) = 1 \).
        5. Calculer \( d \) tel que \( d \times e \equiv 1 \mod \phi(n) \).

4.2 Chiffrement
        Pour chiffrer un message \( m \):
        \[ c \equiv m^e \mod n \]

4.3 Déchiffrement
        Pour déchiffrer le message chiffré \( c \):
        \[ m \equiv c^d \mod n \]
Voici une implémentation basique de l'algorithme RSA :

def gcd(a, b):
while b != 0:
a, b = b, a % b
return a

def mod_inverse(e, phi):
for d in range(1, phi):
if (e * d) % phi == 1:
return d
return None

def rsa_keygen(p, q):
n = p * q
phi = (p - 1) * (q - 1)

e = 65537 # Choix commun pour e
while gcd(e, phi) != 1:
e += 2 # Incrémenter jusqu'à trouver un e valide

d = mod_inverse(e, phi)
return (e, n), (d, n) # (clé publique, clé privée)

def rsa_encrypt(public_key, message):
e, n = public_key
c = pow(message, e, n)
return c

def rsa_decrypt(private_key, ciphertext):
d, n = private_key
m = pow(ciphertext, d, n)
return m

# Exemple d'utilisation
p = 61 # Premier
q = 53 # Autre premier
public_key, private_key = rsa_keygen(p, q)

message = 65 # Message à chiffrer
ciphertext = rsa_encrypt(public_key, message)
print(f"Message chiffré: {ciphertext}")

decrypted_message = rsa_decrypt(private_key, ciphertext)
print(f"Message déchiffré: {decrypted_message}")
4. Conclusion

Ceci conclut notre cours sur la sécurisation des communications, en mettant l'accent sur la cryptographie et le chiffrement de César, ainsi que des exemples de code Python pour chaque concept.


𝔼𝕩𝕖𝕣𝕔𝕚𝕔𝕖𝕤 - 𝕔𝕠𝕣𝕣𝕚𝕘𝕖́𝕤: 𝕊𝕖́𝕔𝕦𝕣𝕚𝕤𝕒𝕥𝕚𝕠𝕟 𝕕𝕖𝕤 𝕔𝕠𝕞𝕞𝕦𝕟𝕚𝕘𝕒𝕥𝕚𝕠𝕟𝕤

Exercice 1: Chiffrement et déchiffrement AES

Écrivez une fonction en Python qui utilise l'algorithme AES (Advanced Encryption Standard) pour chiffrer et déchiffrer un message en utilisant une clé symétrique.

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes

def chiffrement_AES(message, cle):
cipher = AES.new(cle, AES.MODE_ECB)
message_chiffre = cipher.encrypt(pad(message, AES.block_size))
return message_chiffre

def dechiffrement_AES(message_chiffre, cle):
cipher = AES.new(cle, AES.MODE_ECB)
message_dechiffre = unpad(cipher.decrypt(message_chiffre), AES.block_size)
return message_dechiffre

# Exemple d'utilisation
cle = get_random_bytes(16) # Génération d'une clé AES de 128 bits (16 octets)
message = b"Bonjour, ceci est un message secret."

message_chiffre = chiffrement_AES(message, cle)
message_dechiffre = dechiffrement_AES(message_chiffre, cle)

print("Message chiffré :", message_chiffre)
print("Message déchiffré :", message_dechiffre.decode())



Exercice 2: Génération automatique de clés

Écrivez une fonction en Python qui génère automatiquement une clé aléatoire pour l'algorithme AES.

import random

def generate_aes_key():
# Générer 16 octets aléatoires pour la clé AES de 128 bits
key = bytearray(random.getrandbits(8) for _ in range(16))
return key

# Exemple d'utilisation
aes_key = generate_aes_key()
print("Clé AES générée :", aes_key.hex())


Exercice 3: Chiffrement d'un fichier avec AES

Écrivez une fonction en Python qui chiffre le contenu d'un fichier en utilisant l'algorithme AES et enregistre le résultat dans un nouveau fichier.

def xor_bytes(data, key):
return bytearray([b ^ key[i % len(key)] for i, b in enumerate(data)])

def pad(data):
while len(data) % 16 != 0:
data.append(0) # Ajoute des zéros pour le remplissage
return data

def encrypt_file(input_file, output_file, key):
# Lire le contenu du fichier
with open(input_file, 'rb') as f:
data = bytearray(f.read())

# Padding des données
padded_data = pad(data)

# Chiffrement simple par XOR (non sécurisé, juste pour l'exemple)
encrypted_data = xor_bytes(padded_data, key)

# Écrire le contenu chiffré dans un nouveau fichier
with open(output_file, 'wb') as f:
f.write(encrypted_data)

# Exemple d'utilisation
key = bytearray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) # Clé de 16 octets
encrypt_file('input.txt', 'output.enc', key)
print("Fichier chiffré enregistré sous 'output.enc'")


Exercice 4: Génération de clés RSA

Implémentez une fonction pour générer une paire de clés RSA : une clé publique et une clé privée.

import random

def generer_cles_RSA(taille):
p = nombre_premier(taille)
q = nombre_premier(taille)

n = p * q
phi_n = (p - 1) * (q - 1)
e = choisir_exposant_chiffrement(phi_n)
d = inverser_modulo(e, phi_n)

return (n, e), (n, d)

def nombre_premier(taille):
# Génère un nombre aléatoire de la taille spécifiée
nombre = random.getrandbits(taille)

# Vérifie si le nombre généré est premier
while not est_premier(nombre):
nombre = random.getrandbits(taille)

return nombre

def est_premier(nombre):
if nombre < 2:
return False
if nombre == 2:
return True
if nombre % 2 == 0:
return False
for i in range(3, int(nombre**0.5) + 1, 2):
if nombre % i == 0:
return False
return True

def choisir_exposant_chiffrement(phi_n):
e = random.randint(2, phi_n)
while pgcd(e, phi_n) != 1:
e = random.randint(2, phi_n)
return e

def pgcd(a, b):
while b != 0:
a, b = b, a % b
return a

def inverser_modulo(a, m):
r, r_prec = m, a
s, s_prec = 0, 1

while r != 0:
quotient = r_prec // r
r_prec, r = r, r_prec - quotient * r
s_prec, s = s, s_prec - quotient * s

if r_prec > 1:
raise ValueError("L'inverse modulo n'existe pas.")
if s_prec < 0:
s_prec += m

return s_prec


Exercice 5: Chiffrement et déchiffrement RSA

Implémentez les fonctions de chiffrement et de déchiffrement RSA.

def chiffrer_RSA(message, cle_publique):
n, e = cle_publique

m = convertir_message_entier(message)
c = pow(m, e, n)

return c

def dechiffrer_RSA(message_chiffre, cle_privee):
n, d = cle_privee

m = pow(message_chiffre, d, n)
message = convertir_entier_message(m)

return message

def convertir_message_entier(message):
# Convertit chaque caractère du message en valeur entière selon un encodage spécifique
entier = 0
for caractere in message:
entier = (entier << 8) + ord(caractere)
return entier

def convertir_entier_message(entier):
# Convertit la valeur entière en un message lisible en inversant l'encodage spécifique
message = ""
while entier > 0:
caractere = chr(entier & 0xFF)
message = caractere + message
entier >>= 8
return message


𝔼𝕩𝕖𝕣𝕔𝕚𝕔𝕖𝕤 - 𝕔𝕠𝕣𝕣𝕚𝕘𝕖́𝕤: 𝕆𝕓𝕥𝕖𝕟𝕥𝕖 𝕖𝕥 𝕕𝕖𝕔𝕙𝕚𝕗𝕗𝕣𝕖𝕣 𝕝𝕖 𝕞𝕖𝕤𝕤𝕒𝕘𝕖

Exercice 6: Chiffrement de César

Implémentez une fonction pour chiffrer un message en utilisant le chiffrement de César avec un décalage fixe.

def chiffrer_cesar(message, decalage):
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
message_chiffre = ""
for caractere in message:
if caractere.upper() in alphabet:
index = (alphabet.index(caractere.upper()) + decalage) % len(alphabet)
caractere_chiffre = alphabet[index]
if caractere.islower():
caractere_chiffre = caractere_chiffre.lower()
message_chiffre += caractere_chiffre
else:
message_chiffre += caractere
return message_chiffre


Exercice 7: Déchiffrement de César

Implémentez une fonction pour déchiffrer un message chiffré en utilisant le chiffrement de César avec un décalage fixe.

def dechiffrer_cesar(message_chiffre, decalage):
return chiffrer_cesar(message_chiffre, -decalage)


Exercice 8: Chiffrement de César avec caractères spéciaux

Modifiez la fonction de chiffrement de César pour qu'elle gère également les caractères spéciaux et les espaces, sans les chiffrer.

def chiffrer_cesar_special(message, decalage):
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
message_chiffre = ""
for caractere in message:
if caractere.upper() in alphabet:
index = (alphabet.index(caractere.upper()) + decalage) % len(alphabet)
caractere_chiffre = alphabet[index]
if caractere.islower():
caractere_chiffre = caractere_chiffre.lower()
message_chiffre += caractere_chiffre
else:
message_chiffre += caractere # Conserver les caractères spéciaux
return message_chiffre


Exercice 9: Déchiffrement de César avec caractères spéciaux

Modifiez la fonction de déchiffrement de César pour qu'elle gère également les caractères spéciaux et les espaces, sans les déchiffrer.

def dechiffrer_cesar_special(message_chiffre, decalage):
return chiffrer_cesar_special(message_chiffre, -decalage)


Forum(s) associé(s)

Mathématiques Magiques : Dévoilez les Mystères des Nombres

08 Apr, 2016

Les mathématiques ont souvent la réputation d'être une discipline austère et difficile, mais ...

Read more.

Voyage à Travers les Suites Numériques : Découvertes et Applications

27 Jan, 2014

Plongez dans l'univers fascinant des suites numériques, où chaque terme révèle des patterns surprenants et des applications pratiques dans les mathématiques et au-delà.

Read more.

Fonctions en Action : Comprendre et Explorer les Relations Mathématiques

30 Feb, 2015

Découvrez comment les fonctions tissent des liens entre les nombres et les concepts, transformant des idées abstraites en outils puissants pour résoudre des problèmes du quotidien.

Read more.
Page: