Aller au contenu

Le code de César⚓︎

Le codage de César transforme un message en changeant chaque lettre par une autre obtenue par décalage dans l'alphabet de la lettre d'origine. Par exemple, avec un décalage de 3, le 'A' se transforme en 'D', le 'B' en 'E', ..., le 'X' en 'A', le 'Y' en 'B' et le 'Z' en 'C'. Les autres caractères ('!', '?'...) ne sont pas codés.

La fonction position_lettre ci-dessous prend en paramètre une chaîne de caractères de longueur 1 lettre et renvoie la position de lettre dans l'alphabet à partir de celle de la lettre 'A'. On n'utilisera cette fonction que lorsque 'A' <= lettre <= 'Z'.

La fonction nouvelle_lettre prend un entier indice, compris entre 0 inclus et 26 exclu, et renvoie la lettre de l'alphabet correspondant. Ainsi, nouvelle_lettre(0) revoie 'A' et nouvelle_lettre(25) renvoie 'Z'.

La fonction cesar prend en paramètres une chaîne de caractères message et un nombre entier decalage et renvoie le nouveau message codé avec le codage de César utilisant ce decalage.

Exemples

🐍 Console Python
>>> position_lettre('A')
0
>>> position_lettre('B')
1
>>> position_lettre('D')
3
>>> position_lettre('Z')
25
🐍 Console Python
>>> nouvelle_lettre(0)
'A'
>>> nouvelle_lettre(1)
'B'
>>> nouvelle_lettre(12)
'M'
>>> nouvelle_lettre(25)
'Z'
🐍 Console Python
>>> cesar('BONJOUR A TOUS. VIVE LA MATIERE NSI !', 4)
'FSRNSYV E XSYW. ZMZI PE QEXMIVI RWM !'
>>> cesar('GTSOTZW F YTZX. ANAJ QF RFYNJWJ SXN !', -5)
'BONJOUR A TOUS. VIVE LA MATIERE NSI !'

# testsbksl-nlbksl-nlassert cesar('BONJOUR A TOUS. VIVE LA MATIERE NSI !', 4) == 'FSRNSYV E XSYW. ZMZI PE QEXMIVI RWM !', "Erreur sur ce test"bksl-nlassert cesar('GTSOTZW F YTZX. ANAJ QF RFYNJWJ SXN !', -5) == 'BONJOUR A TOUS. VIVE LA MATIERE NSI !', "Erreur sur ce test"bksl-nlbksl-nl# autres testsbksl-nlbksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1) == 'BCDEFGHIJKLMNOPQRSTUVWXYZA'bksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", -2) == 'YZABCDEFGHIJKLMNOPQRSTUVWX'bksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) == 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'bksl-nlassert cesar("", 7) == ''bksl-nlassert cesar("!?.:", 7) == '!?.:'bksl-nlassert cesar("CESAR", 139) == 'LNBJA'bksl-nlbksl-nlbksl-nl ∞/∞

def positionpy-undlettre(lettre):bksl-nl return ord(lettre) - ord('A')bksl-nlbksl-nldef nouvellepy-undlettre(indice):bksl-nl return chr(ord('A') + indice)bksl-nlbksl-nldef cesar(message, decalage):bksl-nl resultat = ''bksl-nl for ... in message:bksl-nl if 'A' <= caractere <= 'Z':bksl-nl indice = ( ... ) % 26bksl-nl resultat = resultat + ...bksl-nl else:bksl-nl resultat = ...bksl-nl return resultatbksl-nlbksl-nl# testsbksl-nlbksl-nlassert cesar('BONJOUR A TOUS. VIVE LA MATIERE NSI !', 4) == 'FSRNSYV E XSYW. ZMZI PE QEXMIVI RWM !'bksl-nlassert cesar('GTSOTZW F YTZX. ANAJ QF RFYNJWJ SXN !', -5) == 'BONJOUR A TOUS. VIVE LA MATIERE NSI !'bksl-nlbksl-nldef positionpy-undlettre(lettre):bksl-nl return ord(lettre) - ord('A')bksl-nlbksl-nldef nouvellepy-undlettre(indice):bksl-nl return chr(ord('A') + indice)bksl-nlbksl-nldef cesar(message, decalage):bksl-nl resultat = ''bksl-nl for caractere in message:bksl-nl if 'A' <= caractere <= 'Z':bksl-nl indice = (positionpy-undlettre(caractere) + decalage) % 26bksl-nl resultat = resultat + nouvellepy-undlettre(indice)bksl-nl else:bksl-nl resultat = resultat + caracterebksl-nl return resultatbksl-nlbksl-nl# testsbksl-nlbksl-nlassert cesar('BONJOUR A TOUS. VIVE LA MATIERE NSI !', 4) == 'FSRNSYV E XSYW. ZMZI PE QEXMIVI RWM !'bksl-nlassert cesar('GTSOTZW F YTZX. ANAJ QF RFYNJWJ SXN !', -5) == 'BONJOUR A TOUS. VIVE LA MATIERE NSI !'bksl-nlbksl-nl

A

Commentaires⚓︎

{{ IDE('exo_corr') }}

Modulo 26⚓︎

Lorsqu'on calcule l'indice de la nouvelle lettre, on prend le reste de la division par 26 pour obtenir une valeur entre 0 inclus et 26 exclu, ce qui garantit que l'indice correspond bien à une lettre entre 'A' et 'Z'. On dit qu'on fait le calcul modulo 26. Plus généralement pour un texte ou un tableau, si on veut être sûr que l'indice est valide, on peut rajouter un modulo len(texte) ou len(tableau).

Pas si sécurisé⚓︎

Cette méthode de chiffrement n'est pas du tout sécurisée et très facile à casser en tentant tous les décalages possibles ou en faisant une analyse des fréquences des lettres. Pour aller au-delà, vous pouvez regarder du côté du chiffrement affine ou du chiffre de Vigenère.

Z

Retour en haut de la page