@@ -1,3 +1,6 @@ | |||||
# Passerelle | # Passerelle | ||||
Programme passerelle dans le cadre du projet Prosecco | |||||
Programme passerelle dans le cadre du projet Prosecco | |||||
v 1.1 : Avec le chiffrement dit "Playfair" | |||||
@@ -1,7 +1,14 @@ | |||||
pass : pass.c pass.h | |||||
cc -Wall -D_REENTRANT -o pass pass.c -pthread | |||||
# Makefile pour tester la librairie | |||||
pass : pass.o chiffrePF.o | |||||
cc -o pass pass.o chiffrePF.o -pthread | |||||
clean: | |||||
rm -f pass | |||||
pass.o : pass.c pass.h chiffrePF.h | |||||
cc -c -Wall -D_REENTRANT pass.c | |||||
chiffrePF.o : chiffrePF.c chiffrePF.h | |||||
cc -c -Wall -D_REENTRANT chiffrePF.c | |||||
clean : | |||||
rm -f pass *.o | |||||
@@ -0,0 +1,179 @@ | |||||
/* 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 | |||||
} | |||||
@@ -0,0 +1,17 @@ | |||||
/* chiffrePF.h : header file pour le chiffrement Playfair */ | |||||
/* liste des fonctions utilisables */ | |||||
/* Fonction de chiffrement direct dans le buffer : | |||||
B adresse du buf, T le nb d'octets */ | |||||
extern void PF_chiffreD(char *B, int T); | |||||
/* Fonction de dechiffrement direct dans le buffer : | |||||
B adresse du buf, T le nb d'octets */ | |||||
extern void PF_dechiffreD(char *B, int T); | |||||
/* Fonction d'Initialisation : on passe la cle en parametre */ | |||||
extern void PF_init(char * cle); | |||||
@@ -15,6 +15,7 @@ | |||||
#include <pthread.h> | #include <pthread.h> | ||||
#include "pass.h" | #include "pass.h" | ||||
#include "chiffrePF.h" | |||||
/* les variables globales */ | /* les variables globales */ | ||||
int RUN=1; /* Indice qui permet de stopper en le mettant a zero */ | int RUN=1; /* Indice qui permet de stopper en le mettant a zero */ | ||||
@@ -91,6 +92,13 @@ char *NFCLE="/tmp/clepass"; | |||||
#define LCLE 8192 /* 8 ko => cle de 65536 bits !! */ | #define LCLE 8192 /* 8 ko => cle de 65536 bits !! */ | ||||
char BCLE[LCLE]; /* buffer contenant la cle */ | char BCLE[LCLE]; /* buffer contenant la cle */ | ||||
/* fchiffre3 utilise les fonction PF */ | |||||
void fchiffre3(char * b, int l, int ori) | |||||
{ | |||||
if (ori) PF_chiffreD(b,l); | |||||
else PF_dechiffreD(b,l); | |||||
} | |||||
/* on suppose dans tout le code que la fct de chiffrement est telle que | /* on suppose dans tout le code que la fct de chiffrement est telle que | ||||
fchiffre(fchiffre(buf)) = buf !! autrement dit qu'elle est involutive ! */ | fchiffre(fchiffre(buf)) = buf !! autrement dit qu'elle est involutive ! */ | ||||
void fchiffre2(char * b, int l, int ori) /* travaille avec BCLE */ | void fchiffre2(char * b, int l, int ori) /* travaille avec BCLE */ | ||||
@@ -110,10 +118,13 @@ long long *d, *f, *c, *fc; | |||||
int initCle(void) | int initCle(void) | ||||
{ | { | ||||
PF_init("Salut"); | |||||
/* si on utilise fchiffre2() !! | |||||
int fd; | int fd; | ||||
if ((fd = open(NFCLE,O_RDONLY)) == -1) return -1; | if ((fd = open(NFCLE,O_RDONLY)) == -1) return -1; | ||||
if (read(fd,BCLE, LCLE) != LCLE) return -1; | if (read(fd,BCLE, LCLE) != LCLE) return -1; | ||||
close(fd); | close(fd); | ||||
*******************/ | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -150,7 +161,16 @@ char buf[LBUF]; | |||||
else { | else { | ||||
n = (int)ntohs(lb); | n = (int)ntohs(lb); | ||||
if (readNbc(SidLoc,buf,n) == -1) n=-1; | if (readNbc(SidLoc,buf,n) == -1) n=-1; | ||||
/* on pourrait faire varier le chiffrement dans le code en faisant : | |||||
#ifdef CHIF_V1 | |||||
fchiffre(buf,n,0); | |||||
#endif | |||||
#ifdef CHIF_V2 | |||||
fchiffre2(buf,n,0); | fchiffre2(buf,n,0); | ||||
#endif | |||||
etc .... *************************************************/ | |||||
/* on dechiffre */ | |||||
fchiffre3(buf,n,0); | |||||
} | } | ||||
} else | } else | ||||
n=read(SidLoc,buf,LBUF); | n=read(SidLoc,buf,LBUF); | ||||
@@ -160,7 +180,8 @@ char buf[LBUF]; | |||||
#ifdef TRACESP | #ifdef TRACESP | ||||
printf(" writeNbc %d octets !\n",n); | printf(" writeNbc %d octets !\n",n); | ||||
#endif | #endif | ||||
fchiffre2(buf,n,0); | |||||
/* on chiffre */ | |||||
fchiffre3(buf,n,1); | |||||
lb = htons((uint16_t)n); | lb = htons((uint16_t)n); | ||||
write(SidDist,&lb,2); /* on envoie le nb d'octets du paquet */ | write(SidDist,&lb,2); /* on envoie le nb d'octets du paquet */ | ||||
} | } | ||||
@@ -209,7 +230,8 @@ char buf[LBUF]; | |||||
else { | else { | ||||
n = (int)ntohs(lb); | n = (int)ntohs(lb); | ||||
if (readNbc(sid,buf,n) == -1) n=-1; | if (readNbc(sid,buf,n) == -1) n=-1; | ||||
fchiffre2(buf,n,0); | |||||
/* on dechiffre */ | |||||
fchiffre3(buf,n,0); | |||||
} | } | ||||
} else n=read(sid,buf,LBUF); | } else n=read(sid,buf,LBUF); | ||||
if (n > 0) { | if (n > 0) { | ||||
@@ -217,7 +239,8 @@ char buf[LBUF]; | |||||
#ifdef TRACESP | #ifdef TRACESP | ||||
printf(" writeNbc %d octets !\n",n); | printf(" writeNbc %d octets !\n",n); | ||||
#endif | #endif | ||||
fchiffre2(buf,n,1); | |||||
/* on chiffre */ | |||||
fchiffre3(buf,n,1); | |||||
lb = htons((uint16_t)n); | lb = htons((uint16_t)n); | ||||
write(fd,&lb,2); /* on envoie le nb d'octets du paquet */ | write(fd,&lb,2); /* on envoie le nb d'octets du paquet */ | ||||
} | } | ||||
@@ -1,6 +1,6 @@ | |||||
/* pass.h : parametres du programme pass.c */ | /* pass.h : parametres du programme pass.c */ | ||||
#define Version "1.00" | |||||
#define Version "1.10" | |||||
#define EOT '\04' /* caractere fin de transmission */ | #define EOT '\04' /* caractere fin de transmission */ | ||||