Épreuve pratique 2009, sujet 139

mercredi 4 novembre 2009
par  Alain BUSSER

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 :

  1. passage des lettres aux nombres (unicode suivi par la soustraction de 64, les 64 premiers codes n’étant pas des lettres)
  2. application d’une fonction affine modulo 27 à ces nombres.
  3. 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.


[1en français les caractères sont des maillons d’une chaîne, en anglais ce sont des perles sur une corde.


Commentaires