DES源代码C语言实现(简洁易懂)_c语言实现des加解密
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
#include //标准输入、输出头文件 #include //包含字符串函数处理头文件 #include //包含acce函数的头文件 #define N //定义最多的航班数#define PRINT "%d\t\t%......
//C语言课程设计 职工信息管理系统—结构体数组实现 #include #include #include struct employee { char num[10]; char name[15]; char sex[5]; char bm[20]; cha......
Holle World # include int main(void) { printf("欢迎大家学习C语言!\n"); }一元二次方程# include # include int main(void) { //把三个系数保存到计算机中 int a......
课 程 设 计 课程设计名称: C语言程序设计 题 目:学籍管理系统 学 生 姓 名: 学生学号 : 学 院(系): 软件学院 专 业 班 级: 112021 指 导 教 师:设计时间: 2012 年 9 月 日 ......
C 语 言 课 程 设 计 实 验 报 告实验名称:文件加密解密 院系:软件学院学号:年9月3日—9月17日 日期:2012 一:设计题目1:设计图形用户界面。2:对文件进行加密并对加密文件进行保存......
