É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) :

  1. /*Programme tp 139a
  2. Correction TP 139 2009
  3. */
  4. var n,k;//nombres entiers pour le kryptage
  5. var acoder="BONJOUR@A@TOUS";//message initial
  6. var code="";//message final
  7. for(i=0;i<acoder.length;i=i+1){
  8.         n=acoder.charCodeAt(i)-64;//transformation en entier
  9.         k=(13*n)%27;//codage
  10.         code=code+String.fromCharCode(k+64);//construction message
  11. }
  12. Alert(code);

Télécharger

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 :

  1. /*Programme tp 139b
  2. Correction TP 139 2009
  3. */
  4. var n,k;//nombres entiers pour le kryptage
  5. var acoder="BONJOUR@A@TOUS";//message initial
  6. var code="",decode="";//messages finaux
  7. for(i=0;i<acoder.length;i=i+1){
  8.         n=acoder.charCodeAt(i)-64;//transformation en entier
  9.         k=(13*n)%27;//codage
  10.         code=code+String.fromCharCode(k+64);//construction message
  11. }
  12. for(i=0;i<code.length;i=i+1){
  13.         k=code.charCodeAt(i)-64;//transformation en entier
  14.         n=(25*k)%27;//transformation inverse
  15.         decode=decode+String.fromCharCode(n+64);//construction message
  16. }
  17. Alert(decode);

Télécharger


Troisième partie : Amélioration

Cette question semble facultative.

Le codage précédent était linéaire, celui-ci est vraiment affine :

  1. /*Programme tp 139c
  2. Correction TP 139 2009
  3. */
  4. var n,k;//nombres entiers pour le kryptage
  5. var acoder="BONJOUR@A@TOUS";//message initial
  6. var code="";//message final
  7. for(i=0;i<acoder.length;i=i+1){
  8.         n=acoder.charCodeAt(i)-64;//transformation en entier
  9.         k=(13*n+8)%27;//codage
  10.         code=code+String.fromCharCode(k+64);//construction message
  11. }
  12. Alert(code);

Télécharger

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 :

  1. 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