Comprendre le fonctionnement de la sécurisation des communications
𝐿𝑎 𝑠𝑒́𝑐𝑢𝑟𝑖𝑠𝑎𝑡𝑖𝑜𝑛 𝑑𝑒𝑠 𝑐𝑜𝑚𝑚𝑢𝑛𝑖𝑐𝑎𝑡𝑖𝑜𝑛𝑠 𝑒𝑠𝑡 𝑢𝑛 𝑑𝑜𝑚𝑎𝑖𝑛𝑒 𝑒𝑠𝑠𝑒𝑛𝑡𝑖𝑒𝑙 𝑝𝑜𝑢𝑟 𝑝𝑟𝑜𝑡𝑒́𝑔𝑒𝑟 𝑙'𝑖𝑛𝑡𝑒́𝑔𝑟𝑖𝑡𝑒́, 𝑙𝑎 𝑐𝑜𝑛𝑓𝑖𝑑𝑒𝑛𝑡𝑖𝑎𝑙𝑖𝑡𝑒́ 𝑒𝑡 𝑙'𝑎𝑢𝑡ℎ𝑒𝑛𝑡𝑖𝑐𝑖𝑡𝑒́ 𝑑𝑒𝑠 𝑖𝑛𝑓𝑜𝑟𝑚𝑎𝑡𝑖𝑜𝑛𝑠 𝑒́𝑐ℎ𝑎𝑛𝑔𝑒́𝑒𝑠 𝑒𝑛𝑡𝑟𝑒 𝑙𝑒𝑠 𝑝𝑎𝑟𝑡𝑖𝑒𝑠. 𝑉𝑜𝑖𝑐𝑖 𝑞𝑢𝑒𝑙𝑞𝑢𝑒𝑠 𝑐𝑜𝑛𝑐𝑒𝑝𝑡𝑠 𝑓𝑜𝑛𝑑𝑎𝑚𝑒𝑛𝑡𝑎𝑢𝑥 𝑑𝑒 𝑙𝑎 𝑠𝑒́𝑐𝑢𝑟𝑖𝑠𝑎𝑡𝑖𝑜𝑛 𝑑𝑒𝑠 𝑐𝑜𝑚𝑚𝑢𝑛𝑖𝑐𝑎𝑡𝑖𝑜𝑛𝑠 :
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)
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)
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.
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}")
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.
É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())
É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())
É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'")
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
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
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
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)
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
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)
Les mathématiques ont souvent la réputation d'être une discipline austère et difficile, mais ...
Read more.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.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.Abonnez-vous maintenant et recevez notre newsletter hebdomadaire avec des matériaux éducatifs, de nouveaux cours, des articles intéressants, des livres populaires et bien plus encore !