Voici, une version pour SHARP PC-1211:
J'étais arrivé à des programmes bien structurés et symétriques où tout été fait deux fois, une fois pour chiffré et une fois pour déchiffré.
Ces programmes étaient clairs, didactiques et facile à expliquer. Mais, ils était un peu longs pour un M.P.O.
Alors, j'ai comme à la coutume, bien passer ces codes à la moulinette MPO-tesque afin d'en tirer un petit code optimisé et invraisemblable. Je n'ai malheureusement pas réussi à faire moins de 153 octets de programme utilisant une dizaine de registres.
Le principe est que le signe de la donnée initiale saisi par l'utilisateur défini le mode codeur ou décodeur. Ce mode est mémorisé dans la variable M (M=1,2 ou 3) qui sert alors directement mémoriser le résultat de la donnée initiale ainsi qu'au le jeu de basculement des indices A(3+M) ou A(7-M). Le code est donc très vite plus difficile à comprendre et à expliquer.
En effet, si A, B et C sont respectivement le nombre initial , le nombre transposé et la clé de transposition, on se rend compte de la similitude des opérations de chiffrement et déchiffrement:
Code : Tout sélectionner
Chiffrement/Transposition
Pour i<--0..9
B(C(i))<--A(i) x<--C(i),B(x)<--A(i) x<--C(i),B(x)<--U(i)
Déchiffrage/Rétablissement:
Pour i<--0..9
A(i)<--B(C(i)) x<--C(i),A(i)<--B(x) x<--C(i),A(i)<--U(x)
Les deux opérations peuvent être décomposées en deux étapes.
La première est commune au deux modes et consiste à lire séquentiellement les indices
x de transposition dans la clé de chiffrement
x<--C(i) (cet indice sera mémorisé dans le registre D).
La seconde consiste à placer la valeur du nombre initial à la bonne place (en fonction de
x) dans le nombre résultat. Le nombre initial ou le résultat dépendant du sens de la transformation.
Pour simplifier, appelons
U la donnée initiale (c'est à dire le nombre en clair pour le codage et inversement le nombre codé pour un déchiffrement). Dans le premier cas, il faut construire
B en plaçant chaque élément
U(i) à la positon
x dans
B pour le codage (construction de
B). réciproquement, if faut construire
A en plaçant élément
U(x) à la positon
i dans
A pour le décodage.
C'est le même procédé, avec cependant une symétrie dans le rôle de la destination (
A ou
B) et des indices (x et i inversé entre les deux modes). La donnée étant
U pour simplifier et ne pas avoir à tenir compte de la symétrie entre
B et
A. (De toute façon, U est donné par l'utilisateur, simplifions, minimisons,...)
Le code présenté ci-dessous, utilise cette symétrie en jouant sur les adresses des registres mémoire utilissé dan l'un et l'autre des deux modes. Le tableau ci-dessous tente de résumer le principe d'interversion d'indices et le déroulement des procédures de codage et décodage.
On se rend compte alors qu'un même sous-programme peut être utilisé afin d'extraire des nombres A,B ou C la i-ième position. Le premier appel de ce sous-programme sert à trouver x à partir dans la clé, le second appel permet de trouver l'argument nécessaire à la construction séquentielle du résultat (A ou B selon le mode codage/décodage) et à placer cela au bon endroit (positon x ou i selon le cas).
Dans le code ci-dessous, il y a un piège, car
A est mémorisé dans le registre C,
C dans B et
B dans A, les indices
i et
x sont respectivement mémorisé dans les registres F et D. Seul
U est effectivement à sa place dans le registre U. Les registre X,Y et Z étant les arguments du sous-programme extrayant un chiffre Z <-- Y(X) MOD 10 qui est utilisé pour obtenir
x<--C(i),
a<--B(i) et
b<--A(x)
Code : Tout sélectionner
SS-Prg 1 Mode codeur Décodeur SS-Prg 2 Combiné Codeur/Décodeur
UserData Mode Resultat Z = Y(X) B(j) = A(i) A(i) = B(j) Z<-Y(X) A(M) = A(M) +- Z * 10^? (?:) :::
U M A(M)
U>0 3 C D B F C D U F -------------- Z U F C 3: C 3: - z D 4 7-M ----- Code
U=0 2 B ---------------------------------------------------------------------------------------------------- Set B
U<0 1 A D B F ------------- A F U D Z U D A 1: A 1: + z F 6 7-M ----- Décode
Les registres indiqués dans ce tableau correspondent à l'utilisation suivante de la mémoire du SHARP PC-1211:
Code : Tout sélectionner
MEM : Désignation Calculs
001 A: Nombre en clair A(i) <-- U(j) avec j=B(i) et U<0 (mode décodeur)
002 B: Clé codage B
003 C: Nombre codé C(j) <-- U(i) avec j=B(i) et U>0 (mode codeur)
004 D: Indice j D <-- B(F) Indice lu dans clé de codage (tout mode)
006 F: Indice i Indice de la boucle FOR/TO/NEXT principale (Attention aux puissances de 10 inversées)
013 M: Mode M <-- 2+SGN U
021 U: User's input Donnée d'entrée
024 X: indice extracteur X donnée sous-programme 4: X <-- F (appel initial) X <-- D (appel décodeur) X <-- F (appel codeur)
025 Y: Source Y donnée sous-programme 4: Y <-- B (appel initial) Y <-- U (appel tout mode)
026 Z: module Z résultat ss-programme 4: Z --> j (appel initial) puis Z --> U(i) ou U(j) à placer en #F ou #D selon modes
Qui permet l'exploitation du code suivant:
Code : Tout sélectionner
1:" " AREAD U:M=2+SGN U,A(M)=0:IF BU=0 LET B=U:GOTO 3 35o
2:FOR F=9 TO 0 STEP -1:Y=B,X=F:GOSUB 4:D=9-Z,Y=U,X=A(3+M):GOSUB 4:A(M)=A(M)-SGN U*Z*10^A(7-M):NEXT F 73o
3:"=" PRINT U,A(M):PRINT B:END 18o
4:Z=ABS Y/10^X,Z=INT Z-10*INT .1Z:RETURN 27o
153 octets
Pour changer ou initier un nouvelle clef, il suffit d'effacer la mémoire (CLEAR), de la saisir et de lancer le programme par [DEF][SPC]. Le pocket affiche la nouvelle clef. Alternativement, la clé peut être effacée en saisissant 0.. La saisie suivante serviera alors de nouvelle clé comme après un CLEAR. Quelque soit la méthode, ce code ne vérifie pas la validité de la clé de transposition.
Pour coder un nombre, le saisir comme un nombre positif et faire [def][SPC] . Le nombre transposé s'affichera alors à droite du nombre précédemment saisi. Une pression sur la touche enter permet d'afficher la clef en cours.
Pour décoder saisir un nombre négatif et lancer le programme par [def][SPC] le résultat du décodage s'affichera alors à droite du nombre saisi.Notons qu'à partir de ce dernier affichage, [def][SPC] permet de retrouver le nombre initial, puisque la fonction AREAD lit automatiquement le nombre affiché sur la droite de l'écran.
Code : Tout sélectionner
Saisie Affichage Commentaire
---------------------- ------------------------- ------------------------------------------------------
[mode][mode] > Mettre le poket en mode DEF
CL.[ENTER] > Efface les registres
3465710298[def][SPC] 3465710298. 0. Affiche nouvelle clé de transposition
6765837379[def][SPC] 6765837379.-7336756897. Affiche le nombre et son transposé
[def][SPC] -7336756897. 6765837379. Effectue l'opération inverse et affiche le résultat.
[ENTER] 3465710298. Affiche la clé en cours.