DES源代码C语言实现(简洁易懂)_c语言实现des加解密

2020-02-27 其他范文 下载本文

DES源代码C语言实现(简洁易懂)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言实现des加解密”。

#include /* 初始置换表IP */ int IP_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 */

int IP_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 */

int E_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 */

int P_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盒 */

int S[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 */

int PC_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 */

int PC_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的数组变成一个一维数组

void change1(int E[8][6],int r[48]){ int i,j;for(i=0;i

for(j=0;j

{

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

} } } //把一维数组变成8X6的矩阵 void change2(int r[48],int E[8][6]){ int i,j;for(i=0;i

for(j=0;j

{

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

} } } //输入16进制明文

void input(int M[8][8]){

int i,j,k;char c[16];int s[16],d[64],a[16][4];

printf(“请输入16位16进制数:”);for(i=0;i

scanf(“%c”,&c[i]);}

for(i=0;i

{

if(c[i]>=48&&c[i]

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

else if(c[i]>='A'&&c[i]

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

else if(c[i]>='a'&&c[i]

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

else

{

puts(“errorn”);

return;

}

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

k=0;while(k

{

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

for(j=0;j

{

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

} }

for(i=0;i

for(j=0;j

{

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

} } /* //打印密文二进制数组 for(i=0;i

for(j=0;j

{

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

}

printf(“n”);} */ }

/*初始置换*/

void Startedexchange(int MW[8][8],int temp[8][8]){ int i,j,a[64],b[64];for(i=0;i

a[i*8+j] = MW[i][j];} for(i=0;i

temp[i][j] = b[i*8+j];} } /*for(i=0;i

printf(“%2d”,temp[i][j]);} printf(“n”);} */ }

/*生成秘钥*/ void bornkey(int MY[8][8],int n,int key [48]){

int i,j,m;int tem,tem2;int k[64],k1[56];int a[8][7];int c[28],d[28];int list[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};for(i=0;i

k[i*8+j] = MY[i][j];} } for(i=0;i

a[i][j] = k[PC_1[i*7+j]];} } /* for(i=0;i

printf(“%d”,a[i][j]);} } printf(“n”);*/ //c0,d0 for(i=0;i

c[i*7+j] = a[i][j];} } for(i=4;i

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

//确定左移位数 m = 0;for(i=0;i

tem=c[0];

for(i=0;i

{

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

}

c[27] = tem;

tem2 = d[0];

for(i=0;i

{

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

}

d[27] = tem2;

m--;} /* for(i=0;i

for(i=0;i

} //第一次异或

void firstXOR(int key[48],int R[48],int k2[48]){ int i;for(i=0;i

if(R[i]!=key[i])

{

k2[i] = 1;

}

else

k2[i] = 0;} } //S盒压缩变换

void Schange(int k2[48],int k3[32]){ int i,h,l,a,temp,k,m,j;

int b[8][6];int num[4];

change2(k2,b);

m=0;

//printf(“n”);

for(i=0;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

k3[m] = num[j];

m++;}

} } //置换运算P void Pchange(int k3[32],int p[32]){ int i;for(i=0;i

p[i] = k3[P_Table[i]];} } //拓展变换

void extension(int a[32],int b[48]){ int i;for(i=0;i

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

} } void feistel(int R[32], int key[48],int p[32]){ int b[48],k2[48],k3[32];extension(R,b);firstXOR(key,b,k2);//key后半部分出现问题

Schange(k2,k3);Pchange(k3,p);} //第二次异或

void SecondXOR(int L[32],int p[32],int R1[32]){ int i;for(i=0;i

if(L[i]!=p[i])

{

R1[i] = 1;

}

else

R1[i] = 0;} }

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

void divideLR(int temp[8][8],int L[32],int R[32]){ int i,j;for(i=0;i

for(j=0;j

{

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

}

} for(i=0;i

for(j=0;j

{

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

} } }

void exchange(int R[32],int L[32]){

int i;

for(i=0;i

{ L[i] = R[i];

} } //逆初始置换

void restartexchange(int L[32],int R[32],int secret[64]){ int a[64];int i;for(i=0;i

a[i] = L[i];} for(i=0;i

a[32+i] = R[i];} for(i=0;i

secret[i] = a[IP_1_Table[i]];} } // 将二进制 数转化为16进制 void BtoOX(int a[64], char b [16]){ int i,j,k,n,r;n=0;

for(i=0;i

k=8;

r=0;

for(j=1;j

{

r+=a[n]*k;

k=k/2;

n++;

}

if(r

b[i]=r+48;

else

b[i]=r+55;

} } void main(){ int i,j,a;int MW[8][8];//密文 int MY[8][8];//秘钥

int temp[8][8];//过渡数组 int L[32];//左边加密部分 int R[32];//右边加密部分 int R1[32];int key[48];//生成的秘钥 int p[32];int secret[64];//密文二进制表示 char miwen[16];printf(“请输入明文:”);input(MW);getchar();Startedexchange(MW,temp);divideLR(temp,L,R);

printf(“请输入秘钥:”);input(MY);//打印密文二进制数组 a = 1;while(a

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

C语言课程设计——飞机订票系统源代码

#include //标准输入、输出头文件 #include //包含字符串函数处理头文件 #include //包含acce函数的头文件 #define N //定义最多的航班数#define PRINT "%d\t\t%......

C语言课程设计 职工信息管理系统 结构体数组实现程序源代码

//C语言课程设计 职工信息管理系统—结构体数组实现 #include #include #include struct employee { char num[10]; char name[15]; char sex[5]; char bm[20]; cha......

郝斌老师C语言[教学视频源代码]

Holle World # include int main(void) { printf("欢迎大家学习C语言!\n"); }一元二次方程# include # include int main(void) { //把三个系数保存到计算机中 int a......

c语言课程设计学籍管理系统(含源代码)

课 程 设 计 课程设计名称: C语言程序设计 题 目:学籍管理系统 学 生 姓 名: 学生学号 : 学 院(系): 软件学院 专 业 班 级: 112021 指 导 教 师:设计时间: 2012 年 9 月 日 ......

c语言课程设计文件加密解密(含源代码)

C 语 言 课 程 设 计 实 验 报 告实验名称:文件加密解密 院系:软件学院学号:年9月3日—9月17日 日期:2012 一:设计题目1:设计图形用户界面。2:对文件进行加密并对加密文件进行保存......

《DES源代码C语言实现(简洁易懂).docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
DES源代码C语言实现(简洁易懂)
点击下载文档
相关专题 c语言实现des加解密 易懂 源代码 简洁 c语言实现des加解密 易懂 源代码 简洁
[其他范文]相关推荐
[其他范文]热门文章
下载全文