DES源代码C语言实现.docx

上传人:b****6 文档编号:6507300 上传时间:2023-01-07 格式:DOCX 页数:18 大小:17.63KB
下载 相关 举报
DES源代码C语言实现.docx_第1页
第1页 / 共18页
DES源代码C语言实现.docx_第2页
第2页 / 共18页
DES源代码C语言实现.docx_第3页
第3页 / 共18页
DES源代码C语言实现.docx_第4页
第4页 / 共18页
DES源代码C语言实现.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

DES源代码C语言实现.docx

《DES源代码C语言实现.docx》由会员分享,可在线阅读,更多相关《DES源代码C语言实现.docx(18页珍藏版)》请在冰豆网上搜索。

DES源代码C语言实现.docx

DES源代码C语言实现

#include<>

/*初始置换表IP*/

intIP_Table[64]={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,

56,48,40,32,24,16,8,0,

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6};

/*逆初始置换表IP*/

intIP_1_Table[64]={39,7,47,15,55,23,63,31,

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,

32,0,40,8,48,16,56,24};

/*扩充置换表E*/

intE_Table[48]={31,0,1,2,3,4,

3,4,5,6,7,8,

7,8,9,10,11,12,

11,12,13,14,15,16,

15,16,17,18,19,20,

19,20,21,22,23,24,

23,24,25,26,27,28,

27,28,29,30,31,0};

/*置换函数P*/

intP_Table[32]={15,6,19,20,28,11,27,16,

0,14,22,25,4,17,30,9,

1,7,23,13,31,26,2,8,

18,12,29,5,21,10,3,24};

/*S盒*/

intS[8][4][16]=/*S1*/

{{{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}},

/*S2*/

{{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}},

/*S3*/

{{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}},

/*S4*/

{{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}},

/*S5*/

{{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}},

/*S6*/

{{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}},

/*S7*/

{{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}},

/*S8*/

{{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}}};

/*置换选择1*/

intPC_1[56]={56,48,40,32,24,16,8,

0,57,49,41,33,25,17,

9,1,58,50,42,34,26,

18,10,2,59,51,43,35,

62,54,46,38,30,22,14,

6,61,53,45,37,29,21,

13,5,60,52,44,36,28,

20,12,4,27,19,11,3};

/*置换选择2*/

intPC_2[48]={13,16,10,23,0,4,

2,27,14,5,20,9,

22,18,11,3,25,7,

15,6,26,19,12,1,

40,51,30,36,46,54,

29,39,50,44,32,47,

43,48,38,55,33,52,

45,41,49,35,28,31};

//把8X6的数组变成一个一维数组

voidchange1(intE[8][6],intr[48])

{

inti,j;

for(i=0;i<8;i++)

{

for(j=0;j<6;j++)

{

r[i*6+j]=E[i][j];

}

}

}

//把一维数组变成8X6的矩阵

voidchange2(intr[48],intE[8][6])

{

inti,j;

for(i=0;i<8;i++)

{

for(j=0;j<6;j++)

{

E[i][j]=r[i*6+j];

}

}

}

//输入16进制明文

voidinput(intM[8][8])

{

inti,j,k;

charc[16];

ints[16],d[64],a[16][4];

printf("请输入16位16进制数:

");

for(i=0;i<16;i++)

{

scanf("%c",&c[i]);

}

for(i=0;i<16;i++)

{

if(c[i]>=48&&c[i]<=58)

s[i]=c[i]-48;

elseif(c[i]>='A'&&c[i]<='Z')

s[i]=c[i]-55;

elseif(c[i]>='a'&&c[i]<='z')

s[i]=c[i]-87;

else

{

puts("error\n");

return;

}

}

//把16进制数组c[]转化为二进制数:

k=0;

while(k<16)//每一位分解为四位,注意输出顺序就可以了

{

for(j=3;j>=0;j--)

{

a[k][j]=s[k]%2;

s[k]/=2;

}

k++;

}

//把a[16][4]转化成a[8][8]类型数组

for(k=0;k<16;k++)

{

for(j=0;j<4;j++)

{

d[k*4+j]=a[k][j];

}

}

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

M[i][j]=d[i*8+j];

}

}

/*

//打印密文二进制数组

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

printf("%2d",M[i][j]);

}

printf("\n");

}

*/

}

/*初始置换*/

voidStartedexchange(intMW[8][8],inttemp[8][8])

{

inti,j,a[64],b[64];

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

a[i*8+j]=MW[i][j];

}

for(i=0;i<64;i++)

{

b[i]=a[IP_Table[i]];

}

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

temp[i][j]=b[i*8+j];

}

}

/*for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

printf("%2d",temp[i][j]);

}

printf("\n");

}

*/

}

/*生成秘钥*/

voidbornkey(intMY[8][8],intn,intkey[48])

{

inti,j,m;

inttem,tem2;

intk[64],k1[56];

inta[8][7];

intc[28],d[28];

intlist[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

k[i*8+j]=MY[i][j];

}

}

for(i=0;i<8;i++)

{

for(j=0;j<7;j++)

{

a[i][j]=k[PC_1[i*7+j]];

}

}

/*

for(i=0;i<8;i++)

{

for(j=0;j<7;j++)

{

printf("%d",a[i][j]);

}

}

printf("\n");

*/

//c0,d0

for(i=0;i<4;i++)

{

for(j=0;j<7;j++)

{

c[i*7+j]=a[i][j];

}

}

for(i=4;i<8;i++)

{

for(j=0;j<7;j++)

{

d[i*7+j-28]=a[i][j];

}

}

//确定左移位数

m=0;

for(i=0;i

{

m+=list[i];

}

//循环左移处理

while(m)

{

tem=c[0];

for(i=0;i<27;i++)

{

c[i]=c[i+1];

}

c[27]=tem;

tem2=d[0];

for(i=0;i<27;i++)

{

d[i]=d[i+1];

}

d[27]=tem2;

m--;

}

/*

for(i=0;i<28;i++)

{

printf("%d",d[i]);

}

printf("\n");

*/

//合并

for(i=0;i<28;i++)

{

k1[i]=c[i];

}

for(i=0;i<28;i++)

{

k1[28+i]=d[i];

}

//置换选择2

for(i=0;i<48;i++)

{

key[i]=k1[PC_2[i]];

}

}

//第一次异或

voidfirstXOR(intkey[48],intR[48],intk2[48])

{

inti;

for(i=0;i<48;i++)

{

if(R[i]!

=key[i])

{

k2[i]=1;

}

else

k2[i]=0;

}

}

//S盒压缩变换

voidSchange(intk2[48],intk3[32])

{

inti,h,l,a,temp,k,m,j;

intb[8][6];

intnum[4];

change2(k2,b);

m=0;

//printf("\n");

for(i=0;i<8;i++)

{

h=2*b[i][0]+b[i][5];

l=8*b[i][1]+4*b[i][2]+2*b[i][3]+b[i][4];

a=S[i][h][l];

//printf("%d",a);

//把a装换成二进制输出

k=3;

while(a!

=0)

{

temp=a%2;

a=a/2;

num[k]=temp;

k--;

}

while(k>=0)

{

num[k]=0;

k--;

}

for(j=0;j<4;j++)

{

k3[m]=num[j];

m++;

}

}

}

//置换运算P

voidPchange(intk3[32],intp[32])

{

inti;

for(i=0;i<32;i++)

{

p[i]=k3[P_Table[i]];

}

}

//拓展变换

voidextension(inta[32],intb[48])

{

inti;

for(i=0;i<48;i++)

{

b[i]=a[E_Table[i]];

}

}

voidfeistel(intR[32],intkey[48],intp[32])

{

intb[48],k2[48],k3[32];

extension(R,b);

firstXOR(key,b,k2);//key后半部分出现问题

Schange(k2,k3);

Pchange(k3,p);

}

//第二次异或

voidSecondXOR(intL[32],intp[32],intR1[32])

{

inti;

for(i=0;i<32;i++)

{

if(L[i]!

=p[i])

{

R1[i]=1;

}

else

R1[i]=0;

}

}

/*把明文分成两部分32+32*/

voiddivideLR(inttemp[8][8],intL[32],intR[32])

{

inti,j;

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

L[i*8+j]=temp[i][j];

}

}

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

R[i*8+j]=temp[i+4][j];

}

}

}

voidexchange(intR[32],intL[32])

{

inti;

for(i=0;i<32;i++)

{

L[i]=R[i];

}

}

//逆初始置换

voidrestartexchange(intL[32],intR[32],intsecret[64])

{

inta[64];

inti;

for(i=0;i<32;i++)

{

a[i]=L[i];

}

for(i=0;i<32;i++)

{

a[32+i]=R[i];

}

for(i=0;i<64;i++)

{

secret[i]=a[IP_1_Table[i]];

}

}

//将二进制数转化为16进制

voidBtoOX(inta[64],charb[16])

{

inti,j,k,n,r;

n=0;

for(i=0;i<16;i++)

{

k=8;

r=0;

for(j=1;j<5;j++)

{

r+=a[n]*k;

k=k/2;

n++;

}

if(r<10)

b[i]=r+48;

else

b[i]=r+55;

}

}

voidmain()

{

inti,j,a;

intMW[8][8];//密文

intMY[8][8];//秘钥

inttemp[8][8];//过渡数组

intL[32];//左边加密部分

intR[32];//右边加密部分

intR1[32];

intkey[48];//生成的秘钥

intp[32];

intsecret[64];//密文二进制表示

charmiwen[16];

printf("请输入明文:

");

input(MW);

getchar();

Startedexchange(MW,temp);

divideLR(temp,L,R);

printf("请输入秘钥:

");

input(MY);

//打印密文二进制数组

a=1;

while(a<=15)

{

bornkey(MY,a,key);//true

feistel(R,key,p);

SecondXOR(L,p,R1);

exchange(R,L);

exchange(R1,R);

a++;

}

//第16次迭代

bornkey(MY,16,key);

feistel(R,key,p);

SecondXOR(L,p,R1);

exchange(R1,L);

restartexchange(L,R,secret);

BtoOX(secret,miwen);

printf("\n");

for(i=0;i<16;i++)

{

printf("%c",miwen[i]);

}

printf("\n");

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1