Здраствуйте, нужно написать курсовую на даную тему "создание защищенного канала предачи данных по протоколу TCP и симметричного шифрования данных в ОС LINUX". Есть клиент и сервер для низащищенного
клиент
Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int sockfd;
int n;
int i;
char sendline[1000],recvline[1000];
struct sockaddr_in servaddr;
if(argc!=2)
{ printf("Usage: a.out <IP address>\n");
exit(1);
}
bzero(sendline,1000);
bzero(recvline,1000);
if((sockfd = socket(PF_INET, SOCK_STREAM, 0))<0)
{ perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(7);
if(inet_aton(argv[1],&servaddr.sin_addr)==0)
{ printf("Invalid IP address\n");
close(sockfd);
exit(1);
}
if(connect(sockfd,(struct sockaddr *) &servaddr,
sizeof(servaddr))<0)
{ perror(NULL);
close(sockfd);
exit(1);
}
for(i=0;i<3;i++)
{
printf("String => ");
fflush(stdin);
fgets(sendline,1000,stdin);
if((n=write(sockfd,sendline,
strlen(sendline)+1))<0)
{ perror("Can\'t write\n");
close(sockfd);
exit(1);
}
if((n=read(sockfd,recvline,999))<0)
{ perror("Can\'t read\n");
close(sockfd);
exit(1);
}
printf("%s\n",recvline);
}
close(sockfd);
return 0;
}
сервер
Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd,newsockfd;
int clilen;
int n;
char line[1000];
struct sockaddr_in servaddr,cliaddr;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
{ perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(51000);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *) &servaddr,
sizeof(servaddr))<0)
{ perror(NULL);
close(sockfd);
exit(1);
}
if(listen(sockfd,5)<0)
{ perror(NULL);
close(sockfd);
exit(1);
}
while(1)
{ clilen=sizeof(cliaddr);
if((newsockfd=accept(sockfd,
(struct sockaddr *) &cliaddr, &clilen))<0)
{ perror(NULL);
close(sockfd);
exit(1);
}
while((n=read(newsockfd,line,999))>0)
{ if((n=write(newsockfd,line,
strlen(line)+1))<0)
{ perror(NULL);
close(sockfd);
close(newsockfd);
exit(1);
}
}
if(n<0)
{ perror(NULL);
close(sockfd);
close(newsockfd);
exit(1);
}
close(newsockfd);
}
return 0;
}
еще есть простой пример шифрования написаного другим человеком.
По сути нужно заменить все функции read/write на свои read_enc/write_enc
Код:
const char key[] = "oskopdfgowj4r9tg8wj0tg93j4958gh304958hy304985ghsoeirugh049g78h34059g87h340958gh30948hg03euirhg0w";
ssize_t read_enc(int fd, void *buf, size_t count) {
static size_t total_read = 0;
ssize_t n = read(fd, buf, count);
if (n > 0) {
for (ssize_t i = 0; i < n; ++i, ++total_read) {
buf[i] ^= key[total_read % sizeof(key)];
}
}
return n;
}
ssize_t write_enc(int fd, void *buf, size_t count) {
static size_t total_write = 0;
for (ssize_t i = 0; i < count; ++i, ++total_write) {
buf[i] ^= key[total_write % sizeof(key)];
}
ssize_t n = write(fd, buf, count);
for (ssize_t i = count; i > n; --i, --total_write) {
buf[i-1] ^= key[total_write % sizeof(key)];
}
return n;
}
Вопрос как ето можно получше реализовать? И какие инклуды еще нужны для примера выше. Реализация вроде з помощью openssl