內容如下:
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);
}
好
如果有任何問題。
給我發壹封站內信。