Aller au contenu

Avec l’essor d’Internet, certains échanges comme les achats en ligne, les démarches administratives ou encore les transactions bancaires nécessitent de pouvoir garantir l’authenticité et la confidentialité des données échangées.

Sécurité des communications

Que signifie sécuriser les communications??

Sécuriser les données c'est s'assurer de:

  • leur confidentialité : protéger ses données de lectures non désirées
  • leur intégrité: s'assurer qu'un fichier n'a pas été modifié
  • leur authenticité: s'assurer de l'origine du fichier
  • leur non-répudiation: s'assurer qu'une personne ne peut pas répudier un message qu'elle a envoyé.

Des techniques de cryptographie ont été développées pour transformer un message clair (c'est-à-dire lisible...) en un message crypté (c'est-à-dire illisible...).

Vous trouverez plus loin dans ce cours, la manière de visualiser un trafic réseau avec l'outil Wireshark...

Utiliser un algorithme de chiffrement

L'une des techniques enfantiles qui nous vient à l'esprit est de substituer les lettres de l'alphabet pour chiffrer son message. C'est le cas du chiffrement de Cesar!

Le chiffrement de Cesar

Consiste à décaler de quatre rangs les lettres de l'alphabet.

La fonction Python suivante permet de coder une chaîne de caractères selon ce principe. On a choisi deux paramètres: la chaîne de caractères et la clé, 4 par défaut...

🐍 Script Python
def chiffrement_cesar(texte_a_chiffrer, cle = 4):
    '''texte_a_chiffrer ne contient que des minuscules, sans accent.
    Les espaces et les signes de ponctuation sont recopiés.
    Retourne un string
    '''
    MESSAGE = "" #declaration chaine vide
    for let in message:
        if ord(let) > 96 and ord(let) < 123:
            LET = chr(( ord(let) - 97 + cle)%26 + 97)
        else:
            LET = let
        MESSAGE = MESSAGE + LET
    return MESSAGE
Ce chiffrement fait apparaître quelques limites intéressants:

  • la clé 0 n'est pas utilisable: on parle de clé faible quand la clé n'a pas grand intérêt...
  • le choix des clés est limité: pour déchiffrer on peut alors toutes les tester: c'est une attaque par force brute.
  • l'analyse fréquentielle des lettres dans le message chiffré permet une correspondance évidente avec la lettre la plus utilisée dans la langue française e, et en déduire ainsi la clé...

Les fonctions Python suivantes permettent cette analyse fréquentielle:

Code Python
🐍 Script Python
def freq_lettre(texte, let):
    """
    parameters:
    -----------------
    texte: string
    let: caractere
    returns
    -----------------
    float frequence de let dans texte
    """
    cpt = 0
    for carac in texte:
        if carac == let:
            cpt += 1
    return cpt/len(texte)

def freq_lettre_texte(fichier_src):
    """
    parameters:
    -----------------
    fichier_src: string
    returns
    -----------------
    liste des frequences des minus dans texte
    """
    minus = [chr(i) for i in range(97,123)]
    liste_freq = []
    for elt in minus:
        liste_freq.append(freq_lettre(fichier_src, elt))
    return liste_freq

Le chiffrement de Cesar est un exemple de chiffrement symétrique dans lequel la même clé est utilisée pour coder ou décoder un message. Ce chiffrement n'a plus aucun intérêt si ce n'est un objectif pédagogique...

Le chiffrement de Vernam

C'est un chiffrement symétrique dont le principe est décrit par l'illustration ci-dessous.

Par exemple, la lettre O codée 14 et son correspondant R codée 17 dans la clé, donne 14+17=31 qui donne 5 modulo 26...

Dans le cas où les données sont données en binaire, l'opération se réduit à effectuer un XOR entre les données. Une attaque par force brute est alors impossible car d'une part on peut faire dire n'importe quoi avec une clé adéquate et d'autre part, l'espace des clés est exponentiel!.

Cet algorithme, inviolable, présente néamoins quelques problèmes:

  • on ne peut pas utiliser deux fois la même clé(one pad time)
  • la clé peut être très grande
  • il faut préalablement partager, sur un autre canal sécurisé, la clé pour chiffrer puis déchiffrer...

Les valises diplomatiques

Ce système a été utilisé durant la guerre froide par le « Téléphone rouge » entre le Kremlin et la Maison-Blanche, qui était en fait plus un téléscripteur qu’un réel téléphone. La « clé », quant à elle, était échangée par valise diplomatique.

Chiffrement à clés

Chiffrement symétrique ou asymétrique

Dans un chiffrement symétrique, la même clé sert à chiffer et déchiffrer le message. Dans un chiffrement asymétrique, il y a deux clés, une publique l'autre privée, qui ont des rôles complémentaires.

Le chiffrement AES (Advanced Encryption Standard) est un des algorithmes de chiffrement symétrique les plus utilisés actuellement et il est à l’heure actuelle considéré comme sûr.

L'un des chiffrements asymétriques connus est l'algorithme RSA. Il repose sur la difficulté de factoriser des grands nombres.Il est détaillé un peu plus loin...

Les échanges des clés

Dans tous les cas, il faut échanger les clés avant de communiquer. Mais comment échanger des clès dans un réseau qui n'est pas sécurisé!

La vidéo suivante répond en partie à notre question...

Le protocole de Delfie Helman

C'est un concept qui définit comment échanger des clés secrètes entres deux entités qui ne se connaissent pas!

Voici à quoi ressemble une clé utilisée dans un protocole SSH:

Les clés sont généralement générées de façon automatique dans les échanges sécurisées. Mais on peut les renouveler à souhait...

Le cas de https

HTTPS est la version sécurisée du protocole applicatif HTTP, inventé par Netscape en 1995 (début du commerce en ligne). Il repose sur un chiffrement hybride:

  • un chiffrement asymétrique pour échangé une clé de session
  • un chiffrement symétrique avec la clé de session
  • signature numérique pour authentifier le serveur

Pourquoi deux chiffrements?

Le chiffrement asymétrique nécessite beaucoup de ressources(clé d'au moins 1024 bits...). Une fois la clé de session échangé par ce biais, on peut se contenter d'un chiffrement symétrique, moins énergivore(clé de 128 bits...).

Le protocole HTTP est un protocole de la couche Application du modèle OSI. Retenez:

Le protocole sécurisé du Web

HTTPS = HTTP + TLS

L'illustration suivante décrit le principe du protocole:

  1. Le navigateur du client envoie au serveur une demande de mise en place de connexion sécurisée par TLS.
  2. Le serveur envoie au client son certificat : celui-ci contient sa clé publique, ses informations (nom de la société, adresse postale, pays, e-mail de contact...) ainsi qu'une signature numérique.
  3. Le navigateur du client vérifie la signature numérique du certificat du serveur auprès d'autorités compétentes.
  4. Le navigateur du client génère une clé de chiffrement symétrique, appelée clé de session, qu'il chiffre à l'aide de la clé publique contenue dans le certificat du serveur puis transmet cette clé de session au serveur.
  5. Le serveur déchiffre la clé de session envoyée par le client grâce à sa clé privée.
  6. Le client et le serveur commencent à s'échanger des données en chiffrant celles-ci avec la clé de session qu'ils ont en commun. (source: Wikipédia)

On peut facilement observer ces échanges avec WireShark:

et en regardant de plus près la trame 83, on observe le principe de certification et l'envoi de la clé publique par le serveur...

TLS sécurise aussi d'autres protocoles( messagerie par exemple...)

Une vidéo qui montre la capture de trame HTTP non sécurisé et des trames HTTPS...

Le chiffrement RSA

Wikipédia

Du nom de leurs inventeurs Tivest Shamir Adelman, le chiffrement RSA est un algorithme de cryptographie asymétrique décrit en 1977 et très utilisé dans le commerce électronique, et plus généralement pour échanger des données confidentielles sur Internet.

La sécurité de cette méthode repose sur la difficulté de factoriser des grands nombres...

Recherche par brute force impossible

Avec un million de processeurs fonctionnant en parallèle et un cycle d'instructions de 1ns, il faudrait \(10^{16}\) ans pour factoriser un nombre de 500 chiffres(source: Réseaux de A. Tanenbaum)

L'exemple ci-dessous illustre le principe de l'algorithme.

  1. Choisir deux grands entiers premiers(en général 1024 bits mais pas ici pour simplifier...); \(p=3\) et \(q=11\)
  2. Calculer \(n=p \times q\) et \(z=(p-1)\times (q-1)\) ; \(n=33\) et \(z=20\)
  3. Choisir \(d\) tel que \(d\) et \(z\) soient premiers entre eux; \(d=7\) convient
  4. Trouver \(e\) tel que \(e\times d=1\) modulo \(z\); soit \(7e=1[20]\) soit \(e=3\).

Génération des clés

La clé publique est formée du couple (e, n) et la clé privée du couple (d,n).

Pour chiffrer un message \(P\), on calcule \(C=P^e[n]\) et pour déchiffrer \(C\), on calcule \(P=C^d[n]\). Ce qui donne pour le mot NSI:

Exercices

Déchiffrer le message

Cette célèbre phrase de Voltaire a été chiffrée par la méthode de Cesar:

ex mktotbe xehbzgx wx ghnl mkhbl zktgwl ftnq : e'xggnb, ex obvx xm ex uxlhbg.

  1. Construire une fonction force_brute qui prend en paramètre une chaîne de caractères et teste toutes les clés possibles. Cette fonction retourne une chaîne de caractères. En déduire la clé de chiffrement(on fera une f-string...)
  2. Autre tentative pour trouver la clé : effectuer une analyse fréquentielle du message chiffré et en déduire la clé de chiffrement.

Vernam en Python

Écrire une fonction Python chiffrement_vernam qui prend en paramètre une chaîne de caractères et retourne une chaîne de caractères. La clé sera choisie aléatoirement. On se contentera de minuscules sans espaces.