Comme c’est expliqué brièvement au début de l’énoncé, une chaîne de caractères est une suite de symboles (lettres, chiffres ou ponctuation) que l’on peut traiter en arithmétique grâce à une bijection entre les caractères et des entiers. Par chance, ce codage est un standard appelé dans le sujet ASCII. En fait une version plus moderne est appelée unicode et c’est celle-là qui sera utilisée dans ce corrigé.
Première étape : Codage
Le codage se fait en trois étapes :
- passage des lettres aux nombres (unicode suivi par la soustraction de 64, les 64 premiers codes n’étant pas des lettres)
- application d’une fonction affine modulo 27 à ces nombres.
- passage à des lettres à nouveau (unicode inverse).
On parle donc de chiffre affine pour ce genre de codage.
La variable acoder (pour « à coder ») est donc une chaîne de caractères, en JavaScript un objet de type String [1]. Pour le message codé on a besoin d’une autre variable de type String, initialement vide et appelé code (pour « codé » - on remarque que les accents sont évités, c’est pour faciliter le copier-coller à partir du script ci-dessous).
Voici le script qui fait la partie 1.b (le nombre acoder.length est la longueur de la chaîne à coder, donc le nombre de caractères) :
/*Programme tp 139a
Correction TP 139 2009
*/
var n,k;//nombres entiers pour le kryptage
var acoder="BONJOUR@A@TOUS";//message initial
var code="";//message final
for(i=0;i<acoder.length;i=i+1){
n=acoder.charCodeAt(i)-64;//transformation en entier
k=(13*n)%27;//codage
code=code+String.fromCharCode(k+64);//construction message
}
Alert(code);
L’exécution de ce script sous CaRMetal donne l’affichage de ZFTVFCR@M@QFCD.
Deuxième étape : Décodage
Rien de nouveau, on refait les mêmes étapes à l’envers :
/*Programme tp 139b
Correction TP 139 2009
*/
var n,k;//nombres entiers pour le kryptage
var acoder="BONJOUR@A@TOUS";//message initial
var code="",decode="";//messages finaux
for(i=0;i<acoder.length;i=i+1){
n=acoder.charCodeAt(i)-64;//transformation en entier
k=(13*n)%27;//codage
code=code+String.fromCharCode(k+64);//construction message
}
for(i=0;i<code.length;i=i+1){
k=code.charCodeAt(i)-64;//transformation en entier
n=(25*k)%27;//transformation inverse
decode=decode+String.fromCharCode(n+64);//construction message
}
Alert(decode);
Troisième partie : Amélioration
Cette question semble facultative.
Le codage précédent était linéaire, celui-ci est vraiment affine :
/*Programme tp 139c
Correction TP 139 2009
*/
var n,k;//nombres entiers pour le kryptage
var acoder="BONJOUR@A@TOUS";//message initial
var code="";//message final
for(i=0;i<acoder.length;i=i+1){
n=acoder.charCodeAt(i)-64;//transformation en entier
k=(13*n+8)%27;//codage
code=code+String.fromCharCode(k+64);//construction message
}
Alert(code);
Le message krypté est maintenant GNACNKZHUHYNKL.
Pour trouver l’ordonnée à l’origine de la fonction affine inverse (en admettant que son coefficient directeur est toujours 25), on peut encore utiliser JavaScript :
Println((8*25)%27);
qui nous apprend que l’ordonnée à l’origine a pour opposé 11 modulo 27, et on trouve 27-11=16.
Commentaires