The process of message encryption and decryption during client-server communication using UDP server is as follows:
- The client requests the server with a file name.
- The corresponding file is opened by the server and sends the file using datagram socket.
- The sender sends the encrypted text (Xoring) with a fixed length key.
- The receiver receives the encrypted text (cipher text).
- The receiver decrypts the file using the same key (private key).
Prerequisite : Socket Programming
Examples:
Input : file.txt Output : ClientSide : Received from server: 00 2C 28 28 2A 6E 3B 24 37 64 65 79 0A 00 00 Decrypted message: Hello People ServerSide : Encrypted message stored in file: 00 2C 28 28 2A 6E 3B 24 37 64 65 79 0A 00
Client Side Program:
C
// Client side code #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> // Driver code int main()
{ int clientSocket, portNum, nBytes;
char file_buffer[3000], path[1024], buffer[3000];
// This key array stores the hidden key
char const key[3000] = "HIDDENKEY" ;
struct sockaddr_in serverAddr;
socklen_t addr_size;
int i;
clientSocket = socket(PF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5004);
serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
memset (serverAddr.sin_zero, '\0' , sizeof serverAddr.sin_zero);
addr_size = sizeof serverAddr;
while (1) {
printf ( "Specify file name: \n" );
gets (path);
// printf("%s\n", path);
FILE * fp;
fp = fopen (path, "r" );
if (fp == NULL) {
printf ( "file does not exist\n" );
}
fseek (fp, 0, SEEK_END);
size_t file_size = ftell (fp);
fseek (fp, 0, SEEK_SET);
if ( fread (file_buffer, file_size, 1, fp) <= 0) {
printf ( "unable to copy file into buffer\n" );
exit (1);
}
if (sendto(clientSocket, file_buffer, 3000, 0, ( struct sockaddr*)&serverAddr,
addr_size) < 0) {
printf ( "error in sending the file\n" );
exit (1);
}
bzero(file_buffer, sizeof (file_buffer));
nBytes = recvfrom(clientSocket, buffer, 1024, 0, NULL, NULL);
printf ( "Received from server: \n" );
// printing some of the character to have a feel of encryption
for (i = 0; i < 15; ++i)
printf ( "%02X " , buffer[i]);
printf ( "\n" );
char x[3000];
for (i = 0; i < nBytes - 1; ++i)
x[i] = ( char )(buffer[i] ^ key[i]);
// printing some of the character to have a feel of decryption
printf ( "Decrypted message: (First 15 characters)\n" );
for (i = 0; i < 11; ++i)
printf ( "%c " , x[i]);
printf ( "\n" );
}
return 0;
} |
Server Side Program:
C
// C server code #include <memory.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> // Driver code int main()
{ int udpSocket, nBytes;
char buffer[3000], xor[3000];
char const key[1024] = "HIDDENKEY" ;
struct sockaddr_in serverAddr, clientAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size, client_addr_size;
int i;
udpSocket = socket(PF_INET, SOCK_DGRAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5004);
serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
memset (serverAddr.sin_zero, '\0' , sizeof serverAddr.sin_zero);
bind(udpSocket, ( struct sockaddr*)&serverAddr, sizeof (serverAddr));
addr_size = sizeof serverStorage;
puts ( "Waiting for client :" );
int count = 0;
while (1) {
nBytes = recvfrom(udpSocket, buffer, 3000, 0, ( struct sockaddr*)&serverStorage,
&addr_size);
printf ( "Message no : %d\n" , ++count);
for (i = 0; i < nBytes - 1; i++) {
if (buffer[i] != '\n' )
xor[i] = ( char )(buffer[i] ^ key[i]);
else
xor[i] = buffer[i];
}
printf ( "Encrypted message stored in file : (First 15 characters)\n" );
// printing some of the character to have a feel of encryption
for (i = 0; i < 15; ++i)
printf ( "%02X " , xor[i]);
printf ( "\n" );
FILE * fp;
fp = fopen ( "temp.txt" , "w+" );
for (i = 0; i < nBytes - 1; i++) {
if (xor[i] != '\n' )
fprintf (fp, "%X" , xor[i]);
else
fprintf (fp, "%c" , xor[i]);
}
fclose (fp);
sendto(udpSocket, xor, nBytes, 0, ( struct sockaddr*)&serverStorage,
addr_size);
}
return 0;
} |
Output :
Recommended Articles