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
>>> position_lettre('A')
0
>>> position_lettre('B')
1
>>> position_lettre('D')
3
>>> position_lettre('Z')
25
>>> nouvelle_lettre(0)
'A'
>>> nouvelle_lettre(1)
'B'
>>> nouvelle_lettre(12)
'M'
>>> nouvelle_lettre(25)
'Z'
>>> 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 !'
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