1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <openssl/des.h>
#define MAX_LEN 1024
char *Decrypt( char *Key, char *Msg, int size)
{
static char* Res;
int n=0;
DES_cblock Key2;
DES_key_schedule schedule;
Res = ( char * ) malloc( size );
memcpy( Key2, Key,8);
DES_set_odd_parity( &Key2 );
DES_set_key_checked( &Key2, &schedule );
DES_cfb64_encrypt( ( unsigned char * ) Msg, ( unsigned char * ) Res, size, &schedule, &Key2, &n, DES_DECRYPT );
return (Res);
}
int main(int argc, char *argv[])
{
int sock;
int flag_on = 1;
struct sockaddr_in multicast_addr;
char message_received[MAX_LEN+1];
int msgrecv_len;
struct ip_mreq mc_req;
char* multicast_ip;
unsigned short multicast_port;
struct sockaddr_in from_addr;
unsigned int from_len;
char *decrypted;
FILE *fp;
char key[512];
fp=fopen("passphrase.txt", "r");
if (fp) {
while(fscanf(fp, "%s", key)!=EOF)
fclose(fp);
}
printf("Key: %s\n", key);
if (argc != 3)
{
fprintf(stderr, "Usage: %s Multicast_IP Multicast_Port\n", argv[0]);
exit(1);
}
multicast_ip = argv[1]; /* arg 1: multicast ip address */
multicast_port = atoi(argv[2]); /* arg 2: multicast port number */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
perror("socket() failed");
exit(1);
}
if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
sizeof(flag_on))) < 0)
{
perror("setsockopt() failed");
exit(1);
}
memset(&multicast_addr, 0, sizeof(multicast_addr));
multicast_addr.sin_family = AF_INET;
multicast_addr.sin_addr.s_addr = htonl(INADDR_ANY);
multicast_addr.sin_port = htons(multicast_port);
if ((bind(sock, (struct sockaddr *) &multicast_addr, sizeof(multicast_addr))) < 0)
{
perror("bind() failed");
exit(1);
}
mc_req.imr_multiaddr.s_addr = inet_addr(multicast_ip);
mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
{
perror("setsockopt() failed");
exit(1);
}
while(1)
{
decrypted=malloc(sizeof(message_received));
memcpy(decrypted,Decrypt(key,message_received,sizeof(message_received)), sizeof(message_received));
memset(message_received, 0, sizeof(message_received));
from_len = sizeof(from_addr);
memset(&from_addr, 0, from_len);
if ((msgrecv_len = recvfrom(sock, message_received, MAX_LEN, 0, (struct sockaddr*)&from_addr, &from_len)) < 0)
{
perror("recvfrom() failed");
break;
}
printf("Received %d bytes from %s: ", msgrecv_len, inet_ntoa(from_addr.sin_addr));
printf("%s", decrypted);
}
if ((setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0)
{
perror("setsockopt() failed");
exit(1);
}
close(sock);
return 0;
}
|