www.pudn.com > oneroundserpent.rar > Myserpent.C
/*Serpent code by Earnest Flasher(Wang An)*/
#include "math.h"
#include "stdio.h"
main(){
char Plaintext[]="abcdefghabcdefgh";
char Key[]="ABCDEFGHABCDEFGHABCDEFGHABCDEFGH";
unsigned long temparray[32];
unsigned long P[4],C[4],W[16],w[132],K[34][4],B[34][4],BK[34][4],X[4];
int i,j,k;
unsigned long temp,temp2;
printf("\n\n\n\n");
/*Change key into ASC and save 4 letters in a variable*/
/*W[0]--W[7] is w[-8]--w[-1]*/
for(i=0;i<=31;i++)
temparray[i]=Key[i];
for(i=0;i<=7;i++)
W[i]=temparray[4*i]*256*256*256+temparray[4*i+1]*256*256+temparray[4*i+2]*256+temparray[4*i+3];
/*Output the key's coding*/
printf("The Key is:%s\n",Key);
for(i=0;i<=7;i++)
{
printf("w[%d]=",i-8);
Convert2(W[i]);
printf("(%lx)\n",W[i]);
}
printf("Fai=");
Convert2(2654435769);
printf("\n");
/*Known W[0]--W[7],Get W[8]--W[15] (That is w[0]--w[7])*/
/*
printf("\nw[0]--w[7] is:\n");
*/
for(i=8;i<=15;i++)
{
W[i]=W[i-8]^W[i-5]^W[i-3]^W[i-1]^2654435769^i;
temp=W[i]<<11;
W[i]=W[i]>>32-11;
W[i]=W[i]|temp;
w[i-8]=W[i];
/*
printf("w[%d]=",i-8);
Convert2(w[i-8]);
printf("\n");
*/
}
/*Known w[0]--w[7],Get K[0][0]--K[1][3]*/
printf("\nThe K[0]--K[7] is:\n");
for(i=0;i<=7;i++)
{
if(i/4%8<=3)
j=3-i/4%8;
else
j=11-i/4%8;
temp=Sbox(j,w[i]>>28);
K[i/4][i%4]=temp<<28;
temp=Sbox(j,w[i]<<4>>28);
K[i/4][i%4]+=temp<<24;
temp=Sbox(j,w[i]<<8>>28);
K[i/4][i%4]+=temp<<20;
temp=Sbox(j,w[i]<<12>>28);
K[i/4][i%4]+=temp<<16;
temp=Sbox(j,w[i]<<16>>28);
K[i/4][i%4]+=temp<<12;
temp=Sbox(j,w[i]<<20>>28);
K[i/4][i%4]+=temp<<8;
temp=Sbox(j,w[i]<<24>>28);
K[i/4][i%4]+=temp<<4;
temp=Sbox(j,w[i]<<28>>28);
K[i/4][i%4]+=temp;
printf("K[%d][%d](Sbox(%d)(w[%d]))=",i/4,i%4,j,i/4*4+i%4);
Convert2(K[i/4][i%4]);
printf("\n");
}
getch();
/*Change plaintext into ASC and save 4 letters in a variable*/
for(i=0;i<=15;i++)
temparray[i]=Plaintext[i];
for(i=0;i<=3;i++)
P[i]=temparray[4*i]*256*256*256+temparray[4*i+1]*256*256+temparray[4*i+2]*256+temparray[4*i+3];
/*Output the plaintext's coding*/
printf("\nThe Plaintext is:%s\n",Plaintext);
for(i=0;i<=3;i++)
{
printf("P[%d]=",i);
Convert2(P[i]);
printf("(%lx)\n",P[i]);
}
/*IP Change*/
for(i=0;i<=3;i++)
B[0][i]=0;
for(i=0;i<=127;i++)
{
j=i%4;
k=(i-i/32*32)/4;
temp=P[j]<>31<<(31-i%32);
B[0][i/32]+=temp;
}
/*Output B[0]*/
printf("\nB[0] is:\n");
for(i=0;i<=3;i++)
{
printf("B[0][%d]=",i);
Convert2(B[0][i]);
printf("\n");
}
/*Known B[i],Get B[i+1]*/
for(i=0;i<=0;i++)
/* i means round */
/*round begin*/
{
for(j=0;j<=3;j++)
{
temp2=B[i][j]^K[i][j];
/*
printf("B[%d][%d]^K[%d][%d]=",i,j,i,j);
Convert2(temp2);
printf("\n");
*/
temp=Sbox(i%8,temp2>>28);
X[j]=temp<<28;
temp=Sbox(i%8,temp2<<4>>28);
X[j]+=temp<<24;
temp=Sbox(i%8,temp2<<8>>28);
X[j]+=temp<<20;
temp=Sbox(i%8,temp2<<12>>28);
X[j]+=temp<<16;
temp=Sbox(i%8,temp2<<16>>28);
X[j]+=temp<<12;
temp=Sbox(i%8,temp2<<20>>28);
X[j]+=temp<<8;
temp=Sbox(i%8,temp2<<24>>28);
X[j]+=temp<<4;
temp=Sbox(i%8,temp2<<28>>28);
X[j]+=temp;
/*
printf("Sbox(%d)(B^K[%d][%d])=",i%8,i,j);
Convert2(X[j]);
printf("\n");
*/
}
/*L Change*/
temp=X[0]<<13;
X[0]=X[0]>>32-13;
X[0]=X[0]|temp;
temp=X[2]<<3;
X[2]=X[2]>>32-3;
X[2]=X[2]|temp;
X[1]=X[1]^X[0]^X[2];
X[3]=X[3]^X[2]^(X[0]<<3);
temp=X[1]<<1;
X[1]=X[1]>>32-1;
X[1]=X[1]|temp;
temp=X[3]<<7;
X[3]=X[3]>>32-7;
X[3]=X[3]|temp;
X[0]=X[0]^X[1]^X[3];
X[2]=X[2]^X[3]^(X[1]<<7);
temp=X[0]<<5;
X[0]=X[0]>>32-5;
X[0]=X[0]|temp;
temp=X[2]<<22;
X[2]=X[2]>>32-22;
X[2]=X[2]|temp;
/*
printf("\nX[0]=");
Convert2(X[0]);
printf("\nX[1]=");
Convert2(X[1]);
printf("\nX[2]=");
Convert2(X[2]);
printf("\nX[3]=");
Convert2(X[3]);
printf("\n");
*/
printf("\nB[%d] is:\n",i+1);
for(j=0;j<=3;j++)
{
B[i+1][j]=X[j];
printf("B[%d][%d]=",i+1,j);
Convert2(B[i+1][j]);
printf("\n");
}
}
/*round end*/
/*IP-1 Change*/
for(i=0;i<=3;i++)
C[i]=0;
for(i=0;i<=127;i++)
{
j=i%32/8;
k=4*(i%8)+i/32;
temp=B[1][j]<>31<<(31-i%32);
C[i/32]+=temp;
}
/*Output C[0]--C[3]*/
printf("\nC[0]--C[3] is:\n");
for(i=0;i<=3;i++)
{
printf("C[%d]=",i);
Convert2(C[i]);
printf("\n");
}
/*End*/
printf("\n******End*******");
getch();
/*End*/
}
/*Convert 10 to 2 and Output*/
Convert2(unsigned long x)
{
int i;
int temp[32];
for(i=0;i<=31;i++)
{
temp[i]=x%2;
x=x/2;
}
for(i=31;i>=0;i--)
{
printf("%d",temp[i]);
if (i%8==0)
printf(",");
}
}
Sbox(int j,int x)
{
int S[8][16]={3,8,15,1,10,6,5,11,14,13,4,2,7,0,9,12,
15,12,2,7,9,0,5,10,1,11,14,8,6,13,3,4,
8,6,7,9,3,12,10,15,13,1,14,4,0,11,5,2,
0,15,11,8,12,9,6,3,13,1,2,4,10,7,5,14,
1,15,8,3,12,0,11,6,2,5,4,10,9,14,7,13,
15,5,2,11,4,10,9,12,0,3,14,8,13,6,7,1,
7,2,12,5,8,4,6,11,14,9,1,15,13,3,10,0,
1,13,15,0,14,8,2,11,7,4,12,10,9,3,5,6};
return(S[j][x]);
}