使用UDP服务器进行消息加密和解密

在使用UDP服务器的客户机-服务器通信期间,消息加密和解密的过程如下:

null
  • 客户端向服务器请求一个文件名。
  • 服务器打开相应的文件,并使用数据报套接字发送该文件。
  • 发送方发送带有固定长度密钥的加密文本(Xoring)。
  • 接收方接收加密文本(密文)。
  • 接收方使用相同的密钥(私钥)解密文件。

先决条件: 套接字编程

例子 :

Input :  file.txtOutput : 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  

客户端程序 :

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, ' ' , sizeof serverAddr.sin_zero);
addr_size = sizeof serverAddr;
while (1) {
printf ( "Specify file name: " );
gets (path);
// printf("%s", path);
FILE * fp;
fp = fopen (path, "r" );
if (fp == NULL) {
printf ( "file does not exist" );
}
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" );
exit (1);
}
if (sendto(clientSocket, file_buffer, 3000, 0, ( struct sockaddr*)&serverAddr,
addr_size) < 0) {
printf ( "error in sending the file" );
exit (1);
}
bzero(file_buffer, sizeof (file_buffer));
nBytes = recvfrom(clientSocket, buffer, 1024, 0, NULL, NULL);
printf ( "Received from server: " );
// printing some of the character to have a feel of encryption
for (i = 0; i < 15; ++i)
printf ( "%02X " , buffer[i]);
printf ( "" );
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)" );
for (i = 0; i < 11; ++i)
printf ( "%c " , x[i]);
printf ( "" );
}
return 0;
}


服务器端程序 :

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, ' ' , 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" , ++count);
for (i = 0; i < nBytes - 1; i++) {
if (buffer[i] != '' )
xor[i] = ( char )(buffer[i] ^ key[i]);
else
xor[i] = buffer[i];
}
printf ( "Encrypted message stored in file : (First 15 characters)" );
// printing some of the character to have a feel of encryption
for (i = 0; i < 15; ++i)
printf ( "%02X " , xor[i]);
printf ( "" );
FILE * fp;
fp = fopen ( "temp.txt" , "w+" );
for (i = 0; i < nBytes - 1; i++) {
if (xor[i] != '' )
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;
}


输出 :

图片[1]-使用UDP服务器进行消息加密和解密-yiteyi-C++库

图片[2]-使用UDP服务器进行消息加密和解密-yiteyi-C++库

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享