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]); 
}