diff --git a/tp3/Makefile b/tp3/Makefile new file mode 100644 index 0000000..a98ae59 --- /dev/null +++ b/tp3/Makefile @@ -0,0 +1,13 @@ +all : test_df + +./lib_tea/xtea.o : ./lib_tea/xtea.c + gcc -c ./lib_tea/xtea.c -o ./lib_tea/xtea.o + +df.o : df.c + gcc -c df.c + +test_df.o : test_df.c + gcc -c test_df.c + +test_df : test_df.o df.o ./lib_tea/xtea.o + gcc -o test_df df.o test_df.o ./lib_tea/xtea.o diff --git a/tp3/df.c b/tp3/df.c new file mode 100644 index 0000000..ab01a3e --- /dev/null +++ b/tp3/df.c @@ -0,0 +1,31 @@ +#include "df.h" + +uint64 expm(uint64 m, uint64 e, uint64 mod) +{ + uint128 _r = 1; + uint128 _m = (uint128)m; + uint128 _mod = (uint128)mod; + + while (e > 0) { + if (e % 2 == 1) { + _r = (_r * _m) % _mod; + } + _m = (_m * _m) % _mod; + e = e / 2; + } + + return (uint64)_r; +} + +uint64 generateur(uint64 p) +{ + uint64 q = (p - 1) / 2; + uint64 g = 2; + + while (1) { + if (expm(g, 2, p) != 1 && expm(g, q, p) != 1) { + return g; + } + g++; + } +} \ No newline at end of file diff --git a/tp3/df.h b/tp3/df.h new file mode 100644 index 0000000..0aba99a --- /dev/null +++ b/tp3/df.h @@ -0,0 +1,15 @@ +#ifndef _DF_H +#define _DF_H + +typedef unsigned __int128 uint128; +typedef unsigned long long int uint64; + +uint64 expm(uint64 m, uint64 e, uint64 n); +// calcule m^e modulo n + +uint64 generateur(uint64 p); +// calcule un generateur de (Zp)* +// en supposant que p est un nombre premier +// de Sophie Germain + +#endif diff --git a/tp3/lib_tea/tea.c b/tp3/lib_tea/tea.c new file mode 100644 index 0000000..f541848 --- /dev/null +++ b/tp3/lib_tea/tea.c @@ -0,0 +1,39 @@ +#include "tea.h" +#include +#define TOUR 32 + +void encrypt_tea (uint32_t * v, uint32_t* k) +{ + uint32_t v0=v[0], v1=v[1], sum=0, i; /* initialisation */ + uint32_t delta=0x9e3779b9; /* constantes de clef */ + uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* mise en cache de la clef */ + for (i=0; i < TOUR; i++) { /* boucle principale */ + sum += delta; + v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); + v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); + } + v[0]=v0; v[1]=v1; +} + +void decrypt_tea (uint32_t* v, uint32_t* k) +{ + uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* initialisation */ + uint32_t delta=0x9e3779b9; /* constantes de clefs */ + uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* mise en cache de la clef */ + for (i=0; i>5) + k3); + v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); + sum -= delta; + } + v[0]=v0; v[1]=v1; +} + +uint64_t hash_block_tea(char b[24]) +{ + uint32_t v[2]; + uint32_t k[4]; + memcpy(v,b,2*sizeof(uint32_t)); + memcpy(k,b+2*sizeof(uint32_t),4*sizeof(uint32_t)); + encrypt_tea(v,k); + return ((uint64_t)v[0])<<32 | v[1]; +} diff --git a/tp3/lib_tea/tea.h b/tp3/lib_tea/tea.h new file mode 100644 index 0000000..ba07355 --- /dev/null +++ b/tp3/lib_tea/tea.h @@ -0,0 +1,8 @@ +#ifndef _TEA_H +#define _TEA_H +#include +void encrypt_tea (uint32_t* v, uint32_t* k); +void decrypt_tea (uint32_t* v, uint32_t* k); +uint64_t hash_block_tea(char b[24]); +#endif + diff --git a/tp3/lib_tea/xtea.c b/tp3/lib_tea/xtea.c new file mode 100644 index 0000000..769af64 --- /dev/null +++ b/tp3/lib_tea/xtea.c @@ -0,0 +1,34 @@ +#include "xtea.h" +#include +#define TOUR 32 + +void encrypt_xtea(uint32_t v[2], uint32_t const key[4]) { + unsigned int i; + uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; + for (i=0; i < TOUR; i++) { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); + } + v[0]=v0; v[1]=v1; +} +void decrypt_xtea(uint32_t v[2], uint32_t const key[4]) { + unsigned int i; + uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*TOUR; + for (i=0; i < TOUR; i++) { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); + } + v[0]=v0; v[1]=v1; +} +uint64_t hash_block_xtea(char b[24]) +{ + uint32_t v[2]; + uint32_t k[4]; + memcpy(v,b,2*sizeof(uint32_t)); + memcpy(k,b+2*sizeof(uint32_t),4*sizeof(uint32_t)); + encrypt_xtea(v,k); + return ((uint64_t)v[0])<<32 | v[1]; + +} diff --git a/tp3/lib_tea/xtea.h b/tp3/lib_tea/xtea.h new file mode 100644 index 0000000..8007875 --- /dev/null +++ b/tp3/lib_tea/xtea.h @@ -0,0 +1,8 @@ +#ifndef _TEA_H +#define _TEA_H +#include +void encrypt_xtea (uint32_t* v, uint32_t const k[]); +void decrypt_xtea (uint32_t* v, uint32_t const k[]); +uint64_t hash_block_xtea(char b[24]); +#endif + diff --git a/tp3/reseau/Makefile b/tp3/reseau/Makefile new file mode 100644 index 0000000..d0a3c3a --- /dev/null +++ b/tp3/reseau/Makefile @@ -0,0 +1,32 @@ +all : clt srv clt_echo srv_echo + +clt.o:clt.c + gcc -c clt.c + +clt_echo.o:clt_echo.c + gcc -c clt_echo.c + + +clt: clt.o + gcc -o clt clt.o + +clt_echo: clt_echo.o + gcc -o clt_echo clt_echo.o + + +srv.o : srv.c + gcc -c srv.c + +srv_echo.o : srv_echo.c + gcc -c srv.c + + +srv : srv.o + gcc -o srv srv.c + +srv_echo : srv_echo.o + gcc -o srv_echo srv_echo.c + + + + diff --git a/tp3/reseau/clt.c b/tp3/reseau/clt.c new file mode 100644 index 0000000..048dbce --- /dev/null +++ b/tp3/reseau/clt.c @@ -0,0 +1,70 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXBUFF 4096 + +int main(int argc, char * argv[]) { + int sock, z=0, fd; + char buff[MAXBUFF]; + struct sockaddr_in server_addr; + int addrlen; + + if (argc != 4) { + printf("Usage: %s \n",argv[0]); + exit(1); + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + assert(sock != -1); + + bzero(&server_addr, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(atoi(argv[2])); + + assert( inet_aton(argv[1], (struct in_addr*)&server_addr.sin_addr.s_addr) != 0 ); + + addrlen = sizeof(server_addr); + + fd = open(argv[3],O_RDONLY,0666); + assert(fd != -1); + + assert(connect(sock,(struct sockaddr *)&server_addr, addrlen) != -1); + + while(1) { + + ssize_t mbytes, nbytes; + + nbytes=read(fd,buff,MAXBUFF); + + if (nbytes==-1) { + perror("read"); + exit(1); + } + if (nbytes==0) { + break; + } + + mbytes = write(sock,buff,nbytes); + if (mbytes == -1) { + perror("write"); + exit(1); + } + z=z+mbytes; + } + + printf("file %s sent (%d bytes)",argv[3],z); + + close(sock); + exit(0); +} diff --git a/tp3/reseau/clt_echo.c b/tp3/reseau/clt_echo.c new file mode 100644 index 0000000..e922963 --- /dev/null +++ b/tp3/reseau/clt_echo.c @@ -0,0 +1,73 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXBUFF 4096 + +int main(int argc, char * argv[]) { + int sock, z=0, fd; + char buff[MAXBUFF]; + struct sockaddr_in server_addr; + int addrlen; + + if (argc != 3) { + printf("Usage: %s \n",argv[0]); + exit(1); + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + assert(sock != -1); + + bzero(&server_addr, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(atoi(argv[2])); + + assert( inet_aton(argv[1], (struct in_addr*)&server_addr.sin_addr.s_addr) != 0 ); + + addrlen = sizeof(server_addr); + + //fd = open(argv[3],O_RDONLY,0666); + //assert(fd != -1); + + assert(connect(sock,(struct sockaddr *)&server_addr, addrlen) != -1); + + while(1) { + + ssize_t mbytes, nbytes; + + nbytes=read(0,buff,MAXBUFF); + + if (nbytes==-1) { + perror("read"); + exit(1); + } + if (nbytes==0) { + break; + } + + mbytes = write(sock,buff,nbytes); + if (mbytes == -1) { + perror("write"); + exit(1); + } +nbytes=read(sock,buff,MAXBUFF); +write(1,buff,nbytes); + + z=z+mbytes; + } + + printf("file %s sent (%d bytes)",argv[3],z); + + close(sock); + exit(0); +} diff --git a/tp3/reseau/srv.c b/tp3/reseau/srv.c new file mode 100644 index 0000000..37c0bab --- /dev/null +++ b/tp3/reseau/srv.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXBUFF 4096 + +int handle_transferred_file(int sock,struct sockaddr_in * client_addr) +{ + char bufname[256]; + + char buff[MAXBUFF]; + int fd; + ssize_t nbytes,z; + + char addr[INET_ADDRSTRLEN]; + snprintf(bufname,256,"%s.%d",inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); + fd = open(bufname,O_WRONLY|O_CREAT|O_TRUNC,0666); + if (fd == -1) { + perror("open"); + exit(1); + } + + while (1) { + //bzero(buff,MAXBUFF); + nbytes = read(sock,buff,MAXBUFF); + if (nbytes == -1) { + perror("read"); + exit(1); + } + if (nbytes==0) break; + + write(fd,buff,nbytes); + z=z+nbytes; + } + + inet_ntop(AF_INET,&(client_addr->sin_addr.s_addr),addr,INET_ADDRSTRLEN); + printf("%d bytes recieved from %s\n", z, addr); + shutdown(sock,SHUT_RDWR); + close(sock); + + exit(0); + +} + +int main(int argc, char * argv[]) +{ + int /* file descriptor for the tranferred file */ + listen_sock, /* socket for listenning connection */ + service_sock, /* socket for a connected client */ + nbytes, z=0; + int yes=1; + + struct sockaddr_in server_addr, + client_addr; + + int addr_len; + + struct sigaction sa; + + if (argc != 2) { + printf("Usage: %s \n",argv[0]); + exit(1); + } + + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_NOCLDWAIT; + sa.sa_handler = SIG_DFL; + assert (sigaction(SIGCHLD, &sa, NULL) != -1); + + + + listen_sock = socket(AF_INET, SOCK_STREAM, 0); + assert( listen_sock > 0); + + assert (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != -1); + + + + bzero(&server_addr, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(atoi(argv[1])); + server_addr.sin_addr.s_addr = INADDR_ANY; + addr_len = sizeof(server_addr); + + assert(bind(listen_sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1); + + assert(listen(listen_sock,10) == 0); + + + + while(1){ + + service_sock = accept(listen_sock, + (struct sockaddr *)&client_addr , + &addr_len); + + assert(service_sock >= 0); + + pid_t p = fork(); + if (p==0){ + close(listen_sock); + handle_transferred_file(service_sock,&client_addr); + } + } +} diff --git a/tp3/reseau/srv_echo.c b/tp3/reseau/srv_echo.c new file mode 100644 index 0000000..4085576 --- /dev/null +++ b/tp3/reseau/srv_echo.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXBUFF 4096 + +int handle_transferred_file(int sock,struct sockaddr_in * client_addr) +{ + char bufname[256]; + + char buff[MAXBUFF]; + int fd; + ssize_t nbytes,z; + + char addr[INET_ADDRSTRLEN]; + snprintf(bufname,256,"%s.%d",inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port)); + //fd = open(bufname,O_WRONLY|O_CREAT|O_TRUNC,0666); + //if (fd == -1) { + // perror("open"); + // exit(1); + //} + + while (1) { + //bzero(buff,MAXBUFF); + nbytes = read(sock,buff,MAXBUFF); + if (nbytes == -1) { + perror("read"); + exit(1); + } + if (nbytes==0) break; + + write(sock,buff,nbytes); + z=z+nbytes; + } + + inet_ntop(AF_INET,&(client_addr->sin_addr.s_addr),addr,INET_ADDRSTRLEN); + printf("%d bytes recieved from %s\n", z, addr); + shutdown(sock,SHUT_RDWR); + close(sock); + + exit(0); + +} + +int main(int argc, char * argv[]) +{ + int /* file descriptor for the tranferred file */ + listen_sock, /* socket for listenning connection */ + service_sock, /* socket for a connected client */ + nbytes, z=0; + int yes=1; + + struct sockaddr_in server_addr, + client_addr; + + int addr_len; + + struct sigaction sa; + + if (argc != 2) { + printf("Usage: %s \n",argv[0]); + exit(1); + } + + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_NOCLDWAIT; + sa.sa_handler = SIG_DFL; + assert (sigaction(SIGCHLD, &sa, NULL) != -1); + + + + listen_sock = socket(AF_INET, SOCK_STREAM, 0); + assert( listen_sock > 0); + + assert (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != -1); + + + + bzero(&server_addr, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(atoi(argv[1])); + server_addr.sin_addr.s_addr = INADDR_ANY; + addr_len = sizeof(server_addr); + + assert(bind(listen_sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1); + + assert(listen(listen_sock,10) == 0); + + + + while(1){ + + service_sock = accept(listen_sock, + (struct sockaddr *)&client_addr , + &addr_len); + + assert(service_sock >= 0); + + pid_t p = fork(); + if (p==0){ + close(listen_sock); + handle_transferred_file(service_sock,&client_addr); + } + } +} diff --git a/tp3/sophie-germain.sh b/tp3/sophie-germain.sh new file mode 100755 index 0000000..1c9a233 --- /dev/null +++ b/tp3/sophie-germain.sh @@ -0,0 +1,14 @@ +#!/bin/bash +min=4611686018427387904 +max=$((min + 20000)) +PRIMESIEVE="/export/documents/info/is1+2/asr/primesieve" + +$PRIMESIEVE $min -n 20000 > primes.txt + +while read q; do + echo "chargement" + p=$((2*q + 1)) + if $PRIMESIEVE $p -n 1 | grep -q "^$p$"; then + echo "$p" + fi +done < primes.txt diff --git a/tp3/test_df.c b/tp3/test_df.c new file mode 100644 index 0000000..953181b --- /dev/null +++ b/tp3/test_df.c @@ -0,0 +1,59 @@ +#include "df.h" +#include "./lib_tea/xtea.h" + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + uint64 p = 4611686018427402023, + a,b, + A,B,AB,BA, + g; + + uint32_t k[4]; // for tea + // + + + + g=generateur(p); + srand(getpid()^time(NULL)); + + for (int i = 0;i < 2; i++){ + + a = 2 + rand()%(p-3); + A=expm(g,a,p); + + b = 2 + rand()%(p-3); + B = expm(g,b,p); + + + AB = expm(A,b,p); + + BA = expm(B,a,p); + //printf("%lx %lx %lx %lx %lx %lx\n",a,b,A,B,AB,BA); + assert(AB == BA); + + memcpy((void*)(k+2*i),(void*)&AB,sizeof(uint32_t)*2); + } + + printf("key for tea = (%x,%x,%x,%x)\n",k[0],k[1],k[2],k[3]); + + + + while(1){ + uint32_t v[2]={0}; + ssize_t nb_read = read(0,v,sizeof(v)); + if (nb_read <= 0) + break; + encrypt_xtea(v,k); + decrypt_xtea(v,k); + write(1,v,sizeof(v)); + } + return 0; +}