|
- /* systeme simple de chiffrement d'octets inspire de la methode PlayFair */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
-
- #include "chiffrePF.h" /* pour verifier la coherence a la compilation */
-
- /* ATTENTION : Ce no de version sert aux utilisateurs a bien verifier
- qu'ils echangent avec LA MEME VERSION !!
- Donc, si vous faites des modifications il faut changer ce no
- *******************************************************/
- #define VERSION "E2l 1.1"
-
- /* ATTENTION : le resultat etant ecrit sur la sortie standard (stdout),
- les messages de DEBUG sont tous diriges vers la sortie erreur (stderr)!!
- *********************************************************************/
-
- #define NBO 256 /* nb d'octets */
- #define LCM 16 /* Longueur du cote de la matrice */
- static char buf[NBO]; /* table des octets a chiffrer */
- static char buf2[NBO]; /* table pour noter le remplissage des octets */
-
- static void coordCar(char C, int *l, int * c)
- {
- int i;
- for (i=0; i< NBO; i++) if (buf[i]==C) break;
- *c = i%LCM;
- *l = i/LCM;
- }
-
- static char carLC(int l, int c) /*fct qui retourne le car. de la ligne l col. c*/
- {
- return(buf[(l*LCM)+c]);
- }
-
- #ifdef DEBUGPF
- static void Trace(void) /* affiche buf */
- {
- int i,j;
- unsigned char c;
- for (i=0;i<LCM;i++) {
- for (j=0;j<LCM;j++) {
- c = (unsigned char)buf[(i*LCM)+j];
- if ((c >= ' ') && (c <= '~')) fprintf(stderr," %c ",c);
- else fprintf(stderr,"%.2x ",c);
- }
- fprintf(stderr,"\n");
- }
- }
- #endif
-
- /* fonction qui chiffre directement dans le buffer des donnees a chiffrer */
- void PF_chiffreD(char *B, int T) /* B adresse du buf, T le nb d'octets */
- {
- int i,l1,c1,l2,c2;
- for (i=0; i<T; i+=2) {
- if (i==T-1) { /* cas particulier du dernier octet */
- coordCar(B[i],&l1,&c1);
- l1+=2; /* on descend de 2 ligne */
- if (l1 >=LCM) l1-=LCM;
- B[i] = carLC(l1,c1);
- } else { /* cas du couple */
- coordCar(B[i],&l1,&c1);
- coordCar(B[i+1],&l2,&c2);
- if (l1 == l2) { /* sur la meme ligne */
- /* on decale vers le haut */
- l1--;
- if (l1 < 0) l1+=LCM;
- B[i] = carLC(l1,c1);
- B[i+1] = carLC(l1,c2);
- } else {
- if (c1 == c2) { /* sur la meme colonne */
- /* on decale vers la droite */
- c1++;
- if (c1 >=LCM) c1-=LCM;
- B[i] = carLC(l1,c1);
- B[i+1] = carLC(l2,c1);
- } else { /* on a un rectangle */
- /* schema
- c1 c2
-
- l1 x b
-
-
- l2 a y
-
- On fait la permutation x,y => a,b
- **************************************/
- B[i] = carLC(l2,c1);
- B[i+1] = carLC(l1,c2);
- }
- }
- }
- }
- }
-
- void PF_dechiffreD(char *B, int T) /* B adresse du buf, T le nb d'octets */
- {
- int i,l1,c1,l2,c2;
- for (i=0; i<T; i+=2) {
- if (i==T-1) { /* cas particulier du dernier octet */
- coordCar(B[i],&l1,&c1);
- l1-=2; /* on monte de 2 ligne */
- if (l1 < 0) l1+=LCM;
- B[i] = carLC(l1,c1);
- } else { /* cas du couple */
- coordCar(B[i],&l1,&c1);
- coordCar(B[i+1],&l2,&c2);
- if (l1 == l2) { /* sur la meme ligne */
- /* on decale vers le bas */
- l1++;
- if (l1 >= LCM) l1-=LCM;
- B[i] = carLC(l1,c1);
- B[i+1] = carLC(l1,c2);
- } else {
- if (c1 == c2) { /* sur la meme colonne */
- /* on decale vers la gauche */
- c1--;
- if (c1 < 0) c1+=LCM;
- B[i] = carLC(l1,c1);
- B[i+1] = carLC(l2,c1);
- } else { /* on a un rectangle */
- /* schema
- c1 c2
-
- l1 x b
-
-
- l2 a y
-
- On fait la permutation x,y => a,b
- **************************************/
- B[i] = carLC(l2,c1);
- B[i+1] = carLC(l1,c2);
- }
- }
- }
- }
- }
-
- #define SAUT 29 /* valeur du saut pour remplir le reste de la table */
- void PF_init(char * cle) /* on passe la cle en parametre */
- {
- /* initialisation de la table */
- int i,I=0,j;
- char c;
- for (i=0; i<strlen(cle); i++) {
- c = cle[i];
- if (buf2[(int)c]) continue;
- buf[I++] = c;
- buf2[(int)c] = 1;
- }
- /*
- for (i=0; i<NBO; i++) {
- if (buf2[i]) continue;
- buf[I++] = (char)i;
- buf2[i] = 1;
- }
- */
- for (j=0;j<SAUT;j++) {
- for (i=j; i<NBO; i+=SAUT) {
- if (buf2[i]) continue;
- buf[I++] = i;
- buf2[i] = 1;
- }
- }
- #ifdef DEBUG
- for (i=0; i<NBO; i++) {
- if (buf2[i]) continue;
- fprintf(stderr,"Valeur %d non affectee !!\n",i);
- }
- #endif
- }
-
|