當前位置:編程學習大全網 - 源碼下載 - 43的源代碼

43的源代碼

首先,創建壹個新的頭文件des_encode。H

內容如下:

void encode main();//EncodeMain函數

void DecodeMain();//對不起,還沒有用過

void Decode(int *str,int * key char);//decode:輸入8個字符,8個鍵碼

void Encode(int *str,int * key char);//encode:輸入8個字符,8個鍵碼

void key build(int * key char);//創建鍵數組

void StrtoBin(int *midkey,int * key char);//變成二進制

void keyCreate(int *midkey2,int movebit,int I);//通過keyBuild調用

void EncodeData(int *lData,int *rData,int * SRT);//encoded data函數

void F(int *rData,int * key);//F函數

void Expand(int *rData,int * RDA tap);//擴展功能

void exchange(int * RDA tap,int * rData);//S圖更改

void exchange p(int * rData);//P更改

void FillBin(int *rData,int n,int s);//數據轉換為二進制;通過S圖變化函數調用

void DecodeData(int *str,int *lData,int * rData);//從二進制文件中解碼數據

int IP1[]={58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,//初始更改

62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,

};

int IP2[]={40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,//opp初始更改

38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25

};

int S[][4][16]= { {//S-圖數組

{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},

{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},

{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},

{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}

},

{

{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},

{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},

{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},

{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}

},

{

{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},

{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},

{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},

{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}

},

{

{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},

{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},

{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},

{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}

},

{

{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},

{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},

{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},

{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}

},

{

{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},

{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},

{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},

{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}

},

{

{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},

{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},

{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},

{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}

},

{

{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},

{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},

{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},

{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}

}

};

int Ex[48]={ 32,1,2,3,4,5,//展開數組

4,5,6,7,8,9,

8,9,10,11,12,13,

12,13,14,15,16,17,

16,17,18,19,20,21,

20,21,22,23,24,25,

24,25,26,27,28,29,

28,29,30,31,32,1

};

int P[32]={16,7,20,21,//P-change

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

};

int PC1[56]={57,49,41,33,25,17,9,//PC-1 in keyBuild

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,33,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4

};

int PC2[48]={14,17,11,24,1,5,//PC-2 in keyBuild

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32

};

然後創建des.cpp

內容如下:

# include & ltstdio.h & gt

# include & ltstring.h & gt

#包含" des_encode.h "

int key[16][48];

char string[8];

void main()//主函數

{

encode main();

}

void EncodeMain() //EncodeMain函數

{

int I;

char key char[8];

int key 2[8];

int strkey[8];

Printf("請輸入8個要加密的字符:\ n ");

for(I = 0;我& lt8;i++)

scanf("%c ",& ampstr[I]);

getchar();

for(I = 0;我& lt8;i++)

strkey[I]= str[I];

printf(" \ n輸入明文的十六進制為:\ n ");

for(I = 0;我& lt8;i++)

printf("%10x ",strkey[I]);

printf(" \ n請輸入密鑰(8個字符):\ n ");

for(I = 0;我& lt8;i++)

scanf("%c ",& ampkey char[I]);

for(I = 0;我& lt8;i++)

key 2[I]= key char[I];

getchar();

// printf("%c ",key char[I]);

Encode(strkey,key 2);

printf(" \ n加密的十六進制密文是:\ n ");

for(I = 0;我& lt8;i++)

printf("%10x ",strkey[I]);

printf(" \ n \ n請輸入解密密碼\ n ");

for(I = 0;我& lt8;i++)

scanf("%c ",& ampkey char[I]);

for(I = 0;我& lt8;i++)

key 2[I]= key char[I];

Decode(strkey,key 2);

for(I = 0;我& lt8;i++)

printf("%10x ",strkey[I]);

for(I = 0;我& lt8;i++)

str[I]= strkey[I];

Printf("\n純文本:\ t ");

for(I = 0;我& lt8;i++)

printf("%c ",str[I]);

printf(" \ n \ n ");

}

void key build(int * key char){//創建鍵數組

int i,j;

int movebit[]={1,1,2,2,2,2,2,

1,2,2,2,2,2,2,1};

int midkey 2[56];

int midkey[64];

StrtoBin(midkey,key char);

for(I = 0;我& lt56;i++)

midkey 2[I]= midkey[PC 1[I]-1];

for(I = 0;我& lt16;i++)

keyCreate(midkey2,movebit[i],I);

}

void StrtoBin(int *midkey,int * key char){//轉換為二進制

int trans[8],I,j,k,n;

n = 0;

for(I = 0;我& lt8;i++){

j = 0;

while(keychar[i]!=0){

trans[j]= key char[I]% 2;

key char[I]= key char[I]/2;

j++;

}

for(k = j;k & lt8;k++)trans[k]= 0;

for(k = 0;k & lt8;k++)

midkey[n++]= trans[7-k];

}

}

void keyCreate(int *midkey2,int movebit,int n){

int i,temp[4];

temp[0]= midkey 2[0];

temp[1]= midkey 2[1];

temp[2]= midkey 2[28];

temp[3]= midkey 2[29];

if(movebit==2){

for(I = 0;我& lt26;i++){

midkey 2[I]= midkey 2[I+2];

midkey 2[I+28]= midkey 2[I+30];

}

midkey 2[26]= temp[0];midkey 2[27]= temp[1];

midkey 2[54]= temp[2];midkey 2[55]= temp[3];}

其他

{ for(I = 0;我& lt27;i++){

midkey 2[I]= midkey 2[I+1];

midkey 2[I+28]= midkey 2[I+29];

}

midkey 2[27]= temp[0];midkey 2[55]= temp[2];

}

for(I = 0;我& lt48;i++)

key[n][I]= midkey 2[PC2[I]-1];

}

void EncodeData(int *lData,int *rData,int *str){ //encodedata函數

int i,j,temp[8],lint,rint//int h;

int data[64];

lint=0,rint = 0;

for(I = 0;我& lt4;i++){

j = 0;

while(str[i]!=0){

temp[j]= str[I]% 2;

str[I]= str[I]/2;

j++;

}

while(j & lt;8)temp[j++]= 0;

for(j = 0;j & lt8;j++)

lData[lint++]= temp[7-j];

j = 0;

while(str[i+4]!=0){

temp[j]= str[I+4]% 2;

str[I+4]= str[I+4]/2;

j++;

}

while(j & lt;8)temp[j++]= 0;

for(j = 0;j & lt8;j++)rData[rint++]= temp[7-j];

}

for(I = 0;我& lt32;i++){

data[I]= lData[I];

data[I+32]= rData[I];

}

for(I = 0;我& lt32;i++){

lData[I]= data[IP 1[I]-1];//printf("P1:%5d:%5d,%5d\n ",IP1[i],lData[i],data[IP1[I]-1]);

rData[I]= data[IP 1[I+32]-1];

}

}

void F(int *rData,int *key){ //F函數

int i,RDA tap[48];

展開(rData,RDA tap);

for(I = 0;我& lt48;i++){

rdatap[i]=rdatap[i]^key[i];// printf("%10d ",RDA tap[I]);if((I+1)% 6 = = 0)printf(" \ n ");

}

交易所(rDataP,rData);

exchange p(rData);

}

void Expand(int *rData,int * RDA tap){//展開函數

int I;

for(I = 0;我& lt48;i++)

RDA tap[I]= rData[Ex[I]-1];

}

void exchange(int * RDA tap,int * rData){//S-圖表更改

int i,n,linex,liney

linex = liney = 0;

for(I = 0;我& lt48;i+=6){

n = I/6;//printf("%10d\n ",(RDA tap[I]& lt;& lt1));

linex =(RDA tap[I]& lt;& lt1)+RDA tap[I+5];

liney =(RDA tap[I+1]& lt;& lt3)+(RDA tap[I+2]& lt;& lt2)+(RDA tap[I+3]& lt;& lt1)+RDA tap[I+4];

FillBin(rData,n,s[n][linex][liney]);

}

}

void exchange P(int * rData){//P change

int i,temp[32];

for(I = 0;我& lt32;i++)

temp[I]= rData[I];

for(I = 0;我& lt32;i++)

rData[I]= temp[P[I]-1];

}

void FillBin(int *rData,int n,int s){ //數據轉二進制;通過S圖變化函數調用

int temp[4],I;

for(I = 0;我& lt4;i++){

temp[I]= s % 2;

s = s/2;

}

for(I = 0;我& lt4;i++)

rData[n * 4+I]= temp[3-I];

}

void DecodeData(int *str,int *lData,int * rData){//decode data from binary

int I;int a,b;int data[64];

a=0,b = 0;

for(I = 0;我& lt32;i++){

data[I]= lData[I];

data[I+32]= rData[I];

}

for(I = 0;我& lt32;i++){

lData[I]= data[IP2[I]-1];

rData[I]= data[IP2[I+32]-1];

}

for(I = 0;我& lt32;i++){

a =(lData[I]& amp;0x 1)+(a & lt;& lt1);

b =(rData[I]& amp;0x 1)+(b & lt;& lt1);

if((i+1)%8==0){

str[I/8]= a;a = 0;//printf("%d ",I/8);

str[I/8+4]= b;b = 0;//printf("%d ",I/8+4);

}

}

}

void Encode(int *str,int *keychar){ //encode:輸入8個字符,8個keychar

int lData[32],rData[32],temp[32],RDA tap[48];

int i,j;

key build(key char);

EncodeData(lData,rData,str);

for(I = 0;我& lt16;i++){

for(j = 0;j & lt32;j++)

temp[j]= rData[j];

F(rData,key[I]);

for(j = 0;j & lt32;j++){

rdata[j]=rdata[j]^ldata[j];

}

for(j = 0;j & lt32;j++)

lData[j]= temp[j];

}

DecodeData(str,rData,lData);

}

void Decode(int *str,int *keychar){ //decode:輸入8個字符,8個keychar

int lData[32],rData[32],temp[32],RDA tap[48];

int i,j;

key build(key char);

EncodeData(lData,rData,str);//這個位置

for(I = 0;我& lt16;i++){

for(j = 0;j & lt32;j++)

temp[j]= rData[j];

F(rData,key[15-I]);

for(j = 0;j & lt32;j++){

rdata[j]=rdata[j]^ldata[j];

}

for(j = 0;j & lt32;j++){

lData[j]= temp[j];

}

}

DecodeData(str,rData,lData);

}

如果有任何問題。

給我發壹封站內信。

  • 上一篇:MFC和C語言是什麽關系?具體,不要用術語
  • 下一篇:在線修復源代碼
  • copyright 2024編程學習大全網