• Aucun résultat trouvé

Principes de codes généraux pour les fichiers d'octets

N/A
N/A
Protected

Academic year: 2022

Partager "Principes de codes généraux pour les fichiers d'octets"

Copied!
7
0
0

Texte intégral

(1)

L ES CAHIERS DE L ’ ANALYSE DES DONNÉES

J.-P. B ENZÉCRI

A. S KALLI

Principes de codes généraux pour les fichiers d’octets

Les cahiers de l’analyse des données, tome 22, no4 (1997), p. 455-460

<http://www.numdam.org/item?id=CAD_1997__22_4_455_0>

© Les cahiers de l’analyse des données, Dunod, 1997, tous droits réservés.

L’accès aux archives de la revue « Les cahiers de l’analyse des don- nées » implique l’accord avec les conditions générales d’utilisation (http:

//www.numdam.org/conditions). Toute utilisation commerciale ou impres- sion systématique est constitutive d’une infraction pénale. Toute copie ou impression de ce fichier doit contenir la présente mention de copyright.

Article numérisé dans le cadre du programme Numérisation de documents anciens mathématiques

http://www.numdam.org/

(2)

Les Cahiers de l'Analyse des Données Vol.XXII 1997/8 - n°4 pp.455-460.

PRINCIPES DE CODES GENERAUX POUR LES FICHIERS D'OCTETS

[CODES OCT.]

J.~P. BENZÉCRI A.SKALU*

Les codes utilisés aujourd'hui perpétuent une longue tradition de chiffres.

Mais l'avènement du calcul électronique, tout en fournissant au chiffrage et au déchiffrage un outil d'une merveilleuse vélocité, multiplie en nombre et variété les documents qu'on s'applique à faire circuler à l'abri de toute indiscrétion. Des conceptions nouvelles sont nées, sous l'égide de la haute arithmétique et de la théorie de l'information. Nous proposons ici un kaléidoscope d'un autre genre, imaginé en observant le jeu capricieux des microprocesseurs.

Nous considérerons successivement les termes et les opérations dont nous paraît constitué un système de codage; puis décrirons le système proposé; et donnerons enfin notre procédé de génération pseudo-aléatoire de codes.

I Termes et opérateurs 1.1 Fichiers

II ne nous semble pas utile de distinguer les données à chiffrer selon leur contenu verbal ou numérique; ni d'envisager la nature des supports et des canaux; nous supposerons seulement que la donnée à coder est une suite de chiffres binaires; ou, plus précisément, compte tenu des procédés techniques que nous prendrons comme exemples, une suite d'octets. Nous dirons simplement que la donnée, ainsi que le message codé, sont des fichiers d'octets, ou, en bref, des fichiers.

1.2 Transformations

Il est commun d'utiliser comme base de codage une suite pseudo- aléatoire de nombres. Nous acceptons cette pratique, notre suggestion visant à créer des générateurs pseudo-aléatoires à la fois très simples et très divers.

Nous userons du terme de transformation pour désigner une opération notée trans qui, à partir d'un fichier donné /, produit un fichier trans(f) que

(*) Professeur, Ecole Mohammadia d'Ingénieurs; Avenue ïbn Sina;

BP 765; Rabat-Agdal; MAROC.

Les cahiers de l'analyse des données 0339 3097/97/04/© Elsevier, Paris

(3)

456 J.-R BENZÉCRI, A. SKALLI

nous supposerons être de même longueur que le fichier initial, ou de longueur proportionnelle à celle de celui-ci. Pour remplir la fonction qui lui est assignée, une transformation devra avoir un caractère pseudo-aléatoire au sens suivant. Bien que le codage se fasse de façon déterminée, par blocs, par exemple par blocs de 4 octets, la correspondance entre bloc initial et bloc transformé ne devra paraître présenter aucun caractère de régularité, même si l'on considère plusieurs centaines ou milliers d'exemples.

1.3 Union

Nous appellerons union et noterons simplement: uni, une opération qui, à partir de deux fichiers:/et g, engendre un fichier: uni(f,g), de telle sorte que, si l'on connaît uni(f,g), on puisse retrouver les deux fichiers / et g. À titre d'exemple, le plus simple sera de supposer que les fichiers / e t g ayant même longueur, la construction de uni se fait par blocs, disons de 4 octets; les octets de deux blocs de même rang de / e t g étant permutés suivant une règle définie (mais arbitraire) pour créer un bloc de 8 octets de som(f,g). On notera:

f=sepl(uni(f,g) ; g=sep2(uni(f,g) ;

les opération de séparation servant à retrouver f et g quand est connue l'union de f et de g.

1.4 Somme

Nous appellerons somme et noterons: sont une opération qui, étant donnés deux fichiers:/et g, construit un fichier not:é: som(f,g), de telle sorte que si l'on connaît som(f,g) et l'un des fichiers/et g, on puisse retouver l'autre.

A titre d'exemple, le plus simple sera de supposer que, les fichiers/et g ayant même longueur, la construction de som se fait par blocs, disons de 4 octets; les blocs de même rang, interprétés comme désignant des entiers, étant additionnés, suivant les règles de l'arithmétique usuelle (des entiers modulo 2Î32) pour créer le bloc correspondant du fichier som. On notera:

g=diff(som(f,g),f) .

2 Le système de codage et de décodage 2.1 Fichier donné: fd, et base de code: fb

Le fichier donné sera désigné par fd; outre fd, nous utiliserons un second fichier fb, ou base de code, dont on peut supposer qu'il a même longueur que fd, quitte à couper fb s'il est trop long, ou à le répéter s'il est trop court.

Le choix du fichier fb ne sera soumis à aucune contrainte; en particulier, il n'aura pas à être connu du destinataire du message codé; il pourra avantageusement être changé à chaque émission, au caprice de l'émetteur; il faudra seulement éviter que fb ne donne au codage une régularité contraire au caractère pseudo-aléatoire cherché; mais les opérations effectuées assureront aisément ce caractère.

(4)

[CODES OCT.] 457

2.2 Génération du code intermédiaire: fc

Le code intermédiaire, ou fichier fc, sera engendré à partir de fb par une transformation, transe; laquelle n'aura pas à être connue du destinataire, mais sera à la discrétion de l'émetteur; et servira seulement à garantir au code fc le caractère pseudo-aléatoire qui peut manquer si Von emploie telle quelle la base de code fb. On aura donc:

fc=transc(fb).

En toute rigueur, il n'est pas indispensable que fc diffère de fb.

2.3 Création du code: fk, et du message: fm

Le message fm sera créé par une transformation transk, une opération d'union uni et une opération d'addition som, lesquelles devront toutes trois être connues du destinataire mais pourront, comme de règle dans le codage, être modifiées suivant toute convention que l'on jugera opportune; la particularité du système étant que transk peut revêtir des formes à la fois très variées et engendrées à partir d'une description très compacte. On posera

fm=uni(fc,som(transk((fc),fd)) .

En d'autres termes, le codage proprement dit s'effectuera en faisant la somme du fichier donné: fd et d'une séquence pseudo-aléatoire: transk(fc);

cette dernière sera transmise sous la forme du code intermédiaire: fc ayant servi à l'engendrer.

Il sera commode de noter: fk la séquence pseudo-aléatoire à laquelle est ici dévolu le rôle d'un code usuel:

fk=transk(fc).

2.4 Décodage

Le destinataire peut reconstituer fd à partir de fm; à condition qu'il soit à même d'effectuer les opérations sepl, sep2, transk et diff. De façon précise, on a la formule:

fd=diff(sep2(fm),transk(sep l(fm))).

En décomposant cette formule, on a:

sepl(fm)=fc ; sep2(fm)=som(trask(fc),fd)=som(fk,fd) ; fk=transk(fc) ; fd=diff(fm,fk) .

En d'autres termes, après avoir séparé les deux fichiers fc et som(fk, fd) qui sont unis pour créer fm, le destinataire peut reconstituer la suite pseudo- aléatoire, ou code, fk; il obtient alors fd par différence.

(5)

458 J.-P. BENZECRI, A. SKALLI

3 Les générateurs fonctionnels de nombres aléatoires

En définitive, dans la construction très peu originale proposée ci-dessus comme un support à notre exposé, tout repose sur l'aptitude véritable des transformations: transe, ou: transk, à engendrer du pseudo-aléatoire avec des spécifications très diverses et très compactes. Au lieu de recourir à des théories mathématiques, nous utilisons directement les fonctions comme générateurs de nombres.

Partons, pour fixer les idées, du calcul tel qu'il est effectué sur Macintosh suivant les normes SANE. Toute suite de 4 octets représente un entier long; et il est facile, si on le désire, de choisir systématiquement un représentant positif ou nul modulo 2Î32, plutôt qu'un représentant avec signe. Ce nombre entier x peut être considéré comme un nombre réel et pris pour argument d'une fonction que nous noterons: rac, parce que la racine carrée nous paraît un bon exemple. Le nombre réel: rac(x), n'est lui-même, dans la mémoire de la machine, qu'une suite de 10 octets. De ces 10 octets, on peut en choisir 4, qui ne contribuent ni à l'exposant ni au signe, et les ranger dans un ordre quelconque pour créer un entier long y , qu'on notera: y = irac(x).

Pour transformer un fichier fx, considéré comme une suite (x(l), x(2),..., x(n), x(n+l)}, en un fichier fy = (y(l), y,2),...), on posera:

y(l)=irac(x(l));

y(2)=irac(x(2));

y(n)=irac(x(n)).

Il pourra être utile de se garantir contre la présence fréquente de certaines valeurs x en posant

y(n)=irac(y(n-l)+x(n)) .

Il nous semble possible de prendre pour fonction rac des expressions très diverses sans laisser d'être compactes telles que:

rac(x)=W(x+(l/100));

rac(x)=V(sin x+(3/10)); ...

4 Le programme 'codecod* de codage et décodage de fichiers d'octets Le programme 'codecod' met en œuvre les principes proposés ci-dessus.

Notre commentaire se bornera à des remarques et mises en garde.

La procédure: transk, utilisée aussi bien pour le codage que pour le décodage, comporte, comme paramètre, un entier: chif. Cet entier est spécifié par l'utilisateur qui demande le codage d'un fichier; et la valeur choisie doit

(6)

[CODES OCT.] 459

p r o g r a m codecod;

u s e s m e m t y p e s , q u i c k d r a w , o s i n t f , t o o l i n t f , s a n e . u v e r ; t y p e t l O = p a c k e d a r r a y [ 1 . . 1 0 ] o f b y t e ; p l O =At l O ; v a r fb,fd,fm:file o f integer;nomfb, nomfd,norafm:string;

e r l , i , i b , i c , i k , i d , i s , i m , iz,chif:integer;rr:extended;

p r r , p r c , p r k , p r s , p r m : p l O ; r p t , r p c , r p k : char;

p r o c é d u r e t r a n s c ; b e g i n r r r - i b + 1 1 3 ; if (ib+113<0) t h e n r r : = r r + 3 2 7 6 8 ;

r r : = s q r t ( r r + s q r ( i / 1 0 0 ) ) ; p r cA[ l ] : = p r rA[ 7 ] ; p r cA[ 2 ] : = p r rA[ 5 ] e n d ; p r o c é d u r e t r a n s k ; b e g i n r r : = i c + c h i f + 0 . 1 ;

if (ic+chif<0) t h e n r r : = r r + 3 2 7 6 8 ;

r r : = s q r t ( r r ) ; p r kA[ U : = p r rA[ 6 ] ; p r kA[ 2 ] : = p r rA[ 9 ] e n d ; b e g i n b e n z e c r i ; rpt : =• ' 0 ' ;

prr:=plO(@rr) ;prc:=-plO(@ic) ;prk:=*pl0 (@ik) ;prs:=pl0(@is) ; p r m : = p l O (@im) ; while n o t (rpt= ' N ' ) d o b e g i n erl : =0 ; rpc : =« ' N ' ; rpk : = ' N ' ;

w h i l e not (rpk in ['C^'D'l) d o b e g i n

w r i t e ( 'faut-il coder(C) o u d é c o d e r ( D ) u n fichier *) ; r e a d l n ( r p k ) e n d ; if ( r p k = ' C ) t h e n w h i l e not((rpc='0*)or(erl=6)) d o b e g i n

write('le n o m d u f i c h i e r d o n n é fd à coder e s t ' ) ; r e a d l n (nomfd) ; r p c : = d i a l o f ( s t r i n g p t r ( Q n o m f d ) ) ; if (rpc='O') then b e g i n

w r i t e ( ' l e n o m d u fichier b a s e d e code f b e s t : ' ) ; r e a d l n ( n o m f b ) ; rpc:=dialof(stringptr(@nomfb)) e n d ;

if (nomfb^concat (nomfd,'*')) t h e n b e g i n

w r i t e l n ('ERREUR: f b n e peut a v o i r l e n o m d u m e s s a g e à créer" ) ; rpc:='N' e n d ;

if (rpc^'O'ï t h e n b e g i n

w r i t e ( * le c h i f f r e d u c o d e est : ' ) ; r e a d l n ( c h i f ) ;

w r i t e ( ' c e s réponses sont-elles"confirmées 0 o u N ' ) ; r e a d l n ( r p c ) e n d else e r l : = e r l + l e n d ;

if ( (rpc= ' O' ) a n d (rpk*= ' C ' ) ) t h e n b e g i n if (nomfb-nomfd) t h e n iz:=l else i z : = 0 ; if (iz=0) t h e n r e s e t ( f b , n o m f b ) ; r e s e t ( f d , n o m f d ) ; n o m f m : = c o n c a t ( n o m f d , • * ' ) ; r e w r i t e ( f m , n o m f m ) ; i :=0;

w h i l e n o t e o f ( f d ) d o begin r e a d ( f d , i d ) ; ib:=id;

i:-i+l;if(i m o d 10=0) t h e n w r i t e l n ( i d i v 1 0 ) ; if (iz=0) t h e n b e g i n

if e o f ( f b ) t h e n reset(fb,nomfb);read(fb,ib) e n d ; t r a n s e ; t r a n s k ; is : *=id+ik;

p r mA[ l ] :=prcA[l];prnT[21 : = p r sA [1] ; w r i t e (fm,im) ; p r mA[ l ] : = p r cA[ 2 ] ; p r mA[ 2 ] : = p r sA[ 2 ] ; w r i t e ( f m , i m ) e n d ; c l o s e ( f b ) ; c l o s e ( f d ) ; close(fm);writeln('fin d u codage') e n d ; if (rpk=»'D') t h e n w h i l e not ( ( r p c ^ O ' ) or (erl=6) ) d o b e g i n

wrire('le n o m d u f i c h i e r donné fm à d é c o d e r e s t ');readln (nomfm) ; rpc:=dialof(stringptr(@nomfm) ) ;

if (rpc=fO') t h e n b e g i n

w r i t e ( ' l e c h i f f r e d u code est : * ) ; r e a d l n ( c h i f ) ;

w r i t e ( ' c e s réponses sont-elles c o n f i r m é e s 0 o u N ' ) ; r e a d l n ( r p c ) e n d else e r l : = e r l + l e n d ;

if ( (rpc= 'O' ) a n d (rpk=-'D' ) ) t h e n b e g i n

reset (fm, nomf m) ; r e w r i t e (fd, concat (nomf m, ' - ' ) ) ; i : - 0 ; w h i l e n o t e o f ( f m ) d o b e g i n

i:-i+l;if(i m o d 10=0) t h e n w r i t e l n ( i d i v 1 0 ) ; read (fm, im) ; p r cA [ 1 ] : = p r mA [ 1 ] ; p r sA [ 1 ] : = p r mA [2 ] ; read(fm, i m ) ; p r cA[ 2 ] :=prmA [1] ; p r sA [2] : = p r mA[ 2 ] ; transk;id:=is-ik;write(fd,îd) e n d ;

close(f m) ; close(fd);writeln('fin d u décodage') e n d ; if (rpc='0'ï t h e n b e g i n

w r i t e ( ' f a u t i l r e c o m m e n c e r 0 o u N ');readln(rpt) e n d ; e n d ; e n d .

être donnée quand on demande le décodage.

(7)

460 J.-R BENZECRI, A. SKALLI

L'on a parlé de fichier d'octets, sans en restreindre la nature: fichier en format de texte seul; texte formaté créé par un logiciel; graphique, d'un type ou d'un autre: simple damier de pixels en noir et blanc, ou instructions de tracé de lignes, etc.; et même, programme exécutable.

Toutefois, on dépend ici des contraintes du système et de celles des logiciels. Sur un Macintosh+ de «1988, le codage et décodage d'un exécutable se fait bien; et, de même, sur un IBM.PC de même époque; mais le système 6 de Macintosh, ne permet pas d'ouvrir en lecture un exécutable. Quant aux textes ou graphiques créés par des applications, 'codecod' les code et les décode sans rencontrer d'obstacle; mais beaucoup de logiciels n'acceptent pas d'ouvrir le fichier décodé; à moins que le type, voire le créateur adéquat n'ait été spécifié dans l'en-tête; (ce que permettent de faire divers logiciels).

L'espace de dix octets, occupé par le réel: rr, est lu comme suite d'octets par plusieurs pointeurs du type: plO. Le jeux des procédures: transk, et: transe, dépend essentiellement de la manière dont sont écrits les réels en virgule flottante. Il ne convient pas d'utiliser, pour le codage les octets représentant l'exposant; car ceux-ci n'ont pas la même amplitude de fluctuation que ceux de la mantisse. Bien plus, des coprocesseurs insèrent des octets fixes dans la représentation d'un réel... Et le système du Macintosh ne code pas les réels comme le fait celui d'un IBM.PC. Mais si l'on est averti de toutes ces particularités (que l'on peut découvrir par un programme conversationnel ad hoc, affichant à l'écran la suite des octets représentant des réels entrés au clavier), on parvient à décoder sur IBM un fichier codé sur MAcintosh; et réciproquement; (à condition de ne pas utiliser dans le codage les derniers chiffres de la mantisse; lesquels sont en butte à des erreurs d'arrondi gérées différemment par les divers processeurs).

Le programme peut être modifié; non seulement en introduisant, dans transe et transk, d'autres fonctions que sqrt; mais aussi en codant les octets par blocs de 4 plutôt que par blocs de 2; ce qui interdit de tabuler (sans dépense excessive) l'action du programme, même si l'on dispose de nombreux exemples de fichiers codés.

Nous ne savons rien des propriétés arithmétiques du processus pseudo- aléatoire utilisé ici: question en rapport avec le décryptage; et qui intéresse peut-être le mathématicien.

Références

Documents relatifs

L'adresse IP est présente dans le cache de l'émetteur, il lit l‘adresse MAC correspondante pour envoyer la trame Ethernet. L'adresse IP est absente du cache

Séquence Contrôle de Trame 7 octets 1 octet 6 octets 6 octets 2 octets 46 à 1500 octets

Si au contraire la fonction a trouvé un fichier, les caractéristiques de ce fichier (i.e. son nom, sa taille, ses attributs,...) sont inscrits dans une zone de la mémoire appelée

Il suffit de mentionner le handle dans BX, le nombre d'octets à lire dans CX, et l'adresse d'un buffer dans DS:DX.. Au cas où vous ne sauriez pas ce qu'est un buffer (ou

• Les informations de l’utilisateur sont stockées sur les périphériques de stockage sous forme de fichiers (ensemble d’information codées selon un système de codage,

setLength pour régler la longueur du fichier Note: dans ce type de fichier, il faut. 1 connaitre la longueur des types usuels (int=4 octets, long = 8 octets, double = 4 octets, char =

Le suffixe dta est l'abrégé du mot &#34;data&#34; (données) qui est souvent utilisé pour désigner un fichier qui contient des données. Le suffixe &#34;c&#34; désigne un fichier

Un arbre de calcul arithmétique est un arbre dont tous les nœuds non feuille ont exactement deux fils, dont les données sur les feuilles sont des nombres et les données sur les