//filename: sybil.cpp
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<dos.h>
using namespace std;
int network[100][100],neighbor[50][25],cnv[25][25],ap[50],critical[50],sybil[40];
int i,r,j,k,l,m=0,v,max_X,max_Y,nodes_T,nodes_M,cv,ch;
int x,y2,y,x2;
long x1, fac,y11;
void delay(int delay)
{
int now=time(NULL);
int later=now+delay;
while(now<=later)now=time(NULL);
}
int length(int a[])
{
int i=0;
while(a[i])
i++;
return i;
}
long double fact(int a)
{
fac=1;
while(a!=0)
{
fac=fac*a;
a--;
}
return fac;
}
void sybil_nodes()
{
int i,j,k,f=0,t=0,c=0;
for(i=0;i<=nodes_T+nodes_M;i++)
{
for(k=0;k<length(critical);k++)
{
t=0;
for(j=0;j<length(neighbor[i])&&!t;j++)
{
if(critical[k]==neighbor[i][j])
{
t=1;
c++;
delay(10);
}
}
}
if(c==length(critical))
{
sybil[f++]=i;
c=0;
}
}
cout<<"\n\nsybil nodes are =";
for(i=0;i<length(sybil);i++)
{
cout<<" "<<sybil[i];
}
}
void calculate_ap()
{
int i,j,k=0;
for(i=0;i<length(neighbor[v]);i++)
for(j=0;j<length(neighbor[neighbor[v][i]]);j++)
{
ap[cnv[i][j]]=1+ap[cnv[i][j]];
}
k=0;
for(i=1;i<=nodes_T+nodes_M;i++)
{
if(ap[i]>cv)
{
critical[k++]=i;
}
}
cout<<"\nCritical set::";
for(i=0;i<length(critical);i++)
{
cout<<critical[i]<<" ";
}
}
void cnb_IV()
{
int m,i,j,k=0,t,s;
for(m=0;m<length(neighbor[v]);m++)
{
k=0;
for(i=0;i<length(neighbor[v]);i++)
for(j=0;j<length(neighbor[neighbor[v][m]]);j++)
{
if(neighbor[v][i]==neighbor[neighbor[v][m]][j])
{
cnv[m][k++]=neighbor[v][i];
}
}
}
}
void calculate_neighbor()
{
int x,y,i,j,k=0,p,q=-1,f,d;
for(x=0;x<max_X;x++)
for(y=0;y<max_Y;y++)
if(network[x][y]!=0)
{
if(network[x][y]!=nodes_T+1)
{
k=0;
for(i=x-r;i<=x+r;i++)
for(j=y-r;j<=y+r;j++)
{
if(network[i][j]!=0&&network[x][y]!=network[i][j])
{
if(network[i][j]!=nodes_T+1)
{
neighbor[network[x][y]][k]=network[i][j];
k++;
if(m<k)
m=k;
}
else
{
for(p=nodes_T+1;p<=(nodes_T+nodes_M);p++)
{
neighbor[network[x][y]][k]=p;
k++;
}
if(m<k)
m=k;
}
}
}
}
else
{
for(i=x-r;i<=x+r;i++)
for(j=y-r;j<=y+r;j++)
{
if(network[i][j]!=0)
{
q++;
for(p=nodes_T+1;p<=(nodes_T+nodes_M);p++)
{
neighbor[p][q]=network[i][j];
}
}
}
f=q;
for(q=q,d=nodes_T+1;q<f+nodes_M&&d<=nodes_T+nodes_M;q++,d++)
for(p=nodes_T+1;p<=(nodes_T+nodes_M);p++)
{
neighbor[p][q+1]=d+1;
}
}
}
if(m<q)
m=q;
cout<<"\nNeighbor of all nodes\n";
for(i=1;i<=nodes_T+nodes_M;i++)
{ cout<<"\n";
for(k=0;k<m;k++)
cout<<neighbor[i][k]<<" ";
}
}
void create_network()
{
cout<<"Enter the size of network area\nmax_X=:";
cin>>max_X;
cout<<"\nmax_Y=";
cin>>max_Y;
cout<<"\nEnter the valid nodes in a network nodes_T=:";
cin>>nodes_T;
cout<<"\nEnter the total malicious nodes in a network nodes_M=:";
cin>>nodes_M;
cout<<"Enter the node range:";
cin>>r;
cout<<"enter the choice of distribution";
cin>>ch;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
network[i][j]=0;
k=0;
switch(ch)
{
case 1:
for(i=0;k<(nodes_T);i++)
{
x=r+rand()%(max_X-(2*r));
y=r+rand()%(max_Y-(2*r));
if(network[x][y]==0)
{
network[x][y]=k+1;
k++;
}
}
k=1;
while(k)
{
x=r+rand()%(max_X-(r*2));
y=r+rand()%(max_Y-(r*2));
if(network[x][y]==0)
{
network[x][y]=nodes_T+1;
x=r+rand()%(max_X-(2*r));
y=r+rand()%(max_Y-(2*r));
k=0;
}
}
break;
case 2:
x1=((exp(max_X))*(pow(max_X,r))/(fact(r)));
x2=int(x1);
cout<<x2;
y11=((exp(max_Y))*(pow(max_Y,r))/(fact(r)));
y2=int(y11);
cout<<y2;
for(i=0;k<(nodes_T);i++)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=k+1;
k++;
}
}
k=1;
while(k)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=nodes_T+1;
x=r+rand()%(x2);
y=r+rand()%(y2);
k=0;
}
}
cout<<"pls";
break;
case 3:
x1=((exp(max_X*r))*r);
x2=int(x1);
cout<<x2;
y11=((exp(max_Y*r))*r);
y2=int(y11);
cout<<y2;
for(i=0;k<(nodes_T);i++)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=k+1;
k++;
}
}
k=1;
while(k)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=nodes_T+1;
x=r+rand()%(x2);
y=r+rand()%(y2);
k=0;
}
}
cout<<"pls";
break;
case 4:
x1=(max_X)*(pow(1-max_X,r));
x2=int(x1);
cout<<x2;
y11=(max_Y)*(pow(1-max_Y,r));
y2=int(y11);
cout<<y2;
for(i=0;k<(nodes_T);i++)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=k+1;
k++;
}
}
k=1;
while(k)
{
x=r+rand()%(x2);
y=r+rand()%(y2);
if(network[x][y]==0)
{
network[x][y]=nodes_T+1;
x=r+rand()%(x2);
y=r+rand()%(y2);
k=0;
}
}
cout<<"pls";
break;
default:
cout<<"njnhkjk";
}
l=0;
system("CLS");
for(i=0;i<max_X;i++)
{
cout<<"\n\n";
for(j=0;j<max_Y;j++)
{
cout<<" ";
if(network[i][j]!=0&&network[i][j]!=nodes_T+1)
{
cout<<network[i][j];
}
if(network[i][j]==nodes_T+1)
{
cout<<"["<<nodes_T+1<<"-"<<nodes_T+nodes_M<<"]";
}
}
}
}
void show_cnv()
{
int i,j;
cout<<"\nCommon Neighbor\n";
for(i=0;i<length(neighbor[v]);i++)
{
cout<<"\n";
for(j=0;j<length(cnv[i]);j++)
cout<<" "<<cnv[i][j];
}
}
int main()
{
time_t t;
srand((unsigned) time(&t));
system("CLS");
clock_t start;
clock_t end;
create_network();
calculate_neighbor();
cout<<"\n\nEnter the victim node\n\n";
cin>>v;
cv=.7*(length(neighbor[v]));
cnb_IV();
show_cnv();
calculate_ap();
start=clock();
sybil_nodes();
end=clock();
float n,time;
n=end-start;
time=n/(CLK_TCK);
cout<<"\nThe time calculated is "<<time;
getch();
}