#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
static int hacker;
typedef struct ticket
{
int server_ID = -1; //服务器ID
char* client_ID; //用户ID
int password; //票据密码
int client_address; //用户网络地址
}kerberos_ticket;
typedef struct client_message
{
char *client_ID; //用户ID
int client_address; //用户网络地址
char *Client_password; //用户口令
ticket client_ticket; //用户的票据
} client[10];
typedef struct server_message
{
int server_ID;
ticket server_ticket;
}server[10];
void input_data_client(struct client_message *client);
void input_data_server(struct server_message *server);
int Client_to_AS(struct client_message *client,struct server_message *server);
int client_to_server(struct client_message *client,struct server_message *server);
int hacker_function(struct client_message *client,struct server_message *server);
int main()
{
client_message client[10];
server_message server[10];
input_data_client(client);
input_data_server(server);
Client_to_AS(client,server);
hacker_function(client,server);
printf("开始正常用户的登录\n\n");
client_to_server(client,server);
return 0;
}
void input_data_client(struct client_message *client)
{
client[0].Client_password = "001";
client[1].Client_password = "002";
client[2].Client_password = "003";
client[3].Client_password = "004";
client[4].Client_password = "005";
client[5].Client_password = "006";
client[6].Client_password = "007";
client[7].Client_password = "008";
client[8].Client_password = "009";
client[9].Client_password = "010";
client[0].client_address = 192;
client[1].client_address = 193;
client[2].client_address = 194;
client[3].client_address = 195;
client[4].client_address = 196;
client[5].client_address = 197;
client[6].client_address = 198;
client[7].client_address = 199;
client[8].client_address = 200;
client[9].client_address = 201;
}
void input_data_server(struct server_message *server)
{
server[0].server_ID = 1;
server[1].server_ID = 2;
server[2].server_ID = 3;
server[3].server_ID = 4;
server[4].server_ID = 5;
server[5].server_ID = 6;
server[6].server_ID = 7;
server[7].server_ID = 8;
server[8].server_ID = 9;
server[9].server_ID = 10;
}
int Client_to_AS(struct client_message *client,struct server_message *server) //返回值作为票据
{
int number;
printf("*******************************\n\n开始输入用户信息:\n\n");
printf("输入您是几号用户(1-9):");
scanf("%d",&number);
number = number - 1;
hacker = number;
client[number].client_ticket.client_ID = client[number].client_ID;
client[number].client_ticket.client_address = client[number].client_address;
char* Client_password;
Client_password = (char*)malloc(sizeof(char));
printf("\n请输入您的密码(1就是001,2就是002,以此类推):");
scanf("%s",Client_password);
if(strcmp(Client_password,client[number].Client_password) == 0) //判断密码是否正确
{
srand((unsigned)time(NULL));
int ticket = rand(); //生成票据
int number_server;
printf("\n请输入您需要访问的服务器代码(1-10):");
scanf("%d",&number_server);
printf("\n输入用户信息结束\n\n*******************************\n\n");
client[number].client_ticket.server_ID = number_server--;
server[number_server].server_ticket.client_ID = client[number].client_ID;
client[number].client_ticket.password = ticket;
server[number_server].server_ticket.password = ticket;
server[number_server].server_ticket.client_address = client[number].client_address;
printf("验证成功,您的票据已经分发\n\n");
printf("您的票据为%d\n\n",client[number].client_ticket.password);
printf("对应服务器的票据为%d\n",server[number_server].server_ticket.password);
}
else
{
printf("\n您输入的密码有错\n");
exit(-1);
}
return 0;
}
int hacker_function(struct client_message *client,struct server_message *server)
{
printf("\n*******************************\n\n黑客闪亮登场,开始模拟黑客攻击\n\n");
printf("黑客攻击对象:%d号用户\n\n",hacker+1);
client[9].client_ticket.password = client[hacker].client_ticket.password;
client[9].client_ticket.server_ID = client[hacker].client_ticket.server_ID;
printf("黑客已经获取%d号用户的信息:\n\n他要访问%d号服务器\n\n他的票据口令是:%d\n\n黑客是十号机,在攻击时请输入10\n\n",hacker+1,client[9].client_ticket.server_ID,client[9].client_ticket.password);
client_to_server(client,server);
printf("\n黑客攻击失败,他逃跑了\n\n*******************************\n\n");
return 0;
}
int client_to_server(struct client_message *client,struct server_message *server)
{
int number;
printf("请输入您的编号:(1-10,如果是模拟黑客请输入10)");
scanf("%d",&number);
number = number - 1;
while(client[number].client_ticket.server_ID == -1)
{
printf("\n这台机器没有申请过这个服务,请重新输入:");
scanf("%d",&number);
number = number - 1;
}
int server_number = client[number].client_ticket.server_ID - 1;
if(client[number].client_ticket.password == server[server_number].server_ticket.password)
{
printf("\n票据验证成功\n");
if(client[number].client_address == server[server_number].server_ticket.client_address)
printf("\n用户IP地址验证成功,没有重放攻击风险,登录成功\n\n*******************************\n");
else
printf("\n用户IP地址不一致,可能票据已经泄露\n");
}
else
{
printf("票据不一致,访问被拒绝\n");
exit(-1);
}
}