DES算法代码实现(C语言)

您所在的位置:网站首页 des解密软件 DES算法代码实现(C语言)

DES算法代码实现(C语言)

2023-11-30 22:01| 来源: 网络整理| 查看: 265

实验内容:

通过C语言模拟DES算法的整个加密过程

初始明文(64位),首先通过IP置换表进行置换,然后将置换后的结果分成左半部分L0(32位)和右半部分R0(32位),右半部分R0直接进行交换为下一轮的L1,左半部分L0与作为输入参数R0和子密钥K1经过轮函数f生成的(32位)结果进行异或,异或后的结果作为下一轮的R1,总共经16轮,然后将R16与L16拼接起来作为输入,进入IP逆置换表中,结果即为密文。在这里插入图片描述

轮函数f

首先将明文的右半部分(32位)通过E扩展为(48位),再与生成的子密钥异或,然后通过分割为8段,每一段(6位)作为输入进入S盒(S1~S7),输出为(4位),将8段拼接在一起为(32位),然后通过P表进行置换得出。在这里插入图片描述

子密钥生成算法

将初始密钥(64位)经过置换表1,生成的序列为(56位),将其分为左半部分C0(28位)与右半部分D0(28位),根据其轮数对应其左移的位数,将这两部分均循环左移,得到C1与D1,然后将其拼接在一起,作为输入(56位)经过置换表2,生成48位的子密钥K1,然后将C1,D1左移进行相同的步骤,生成子密钥K1~K16。在这里插入图片描述

实验步骤(代码): #include int get(int r); void yihuo(int *a, int *b,int num); void left_move(int s[56], int n); void exchange(int *a, int *b, int *biao,int n); void shizhuaner(int *a,int x,int i,int n); void erzhuanshiliu(int *a,char *b, int n); void s_box(int a[32],int b[48]); void round(int r, int a[56], int b[48], int r_a[32], int r_b[48], int l[32], char mi_r[8], char mi_l[8]); int get(int r) //得到第r轮的移位数 { int i; if (r==1||r==2||r==9||r==16) i=1; else i=2; return i; } void yihuo(int *a, int *b,int num) //异或 { int i; for (i=0;i int i; for (i=0;i s[i]=s[(i+n)%56]; } } void exchange(int *a, int *b, int *biao,int n) //置换 { int i,loc; for (i=0;i int j;n=n/8;j=n-1; do{ a[i*n+j]=x%2; x=x/2; j--; } while(x!=0); while (j>=0) { a[i*n+j]=0; j--; } return; } void erzhuanshiliu(int *a,char *b, int n) // a是二进制数组,b是存放十六进制的数组,n是二进制数组的大小 { int i,j; n=n/4; for(i=0;i if(j==10) b[i]='a'; else if(j==11) b[i]='b'; else if(j==12) b[i]='c'; else if(j==13) b[i]='d'; else if(j==14) b[i]='e'; else if(j==15) b[i]='f'; } else { j=j+48; b[i]=(char)j; } } return; } void s_box(int a[32],int b[48]) //S盒 { int i,r,c,s; int s1[4][16] = { { 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[4][16] = { { 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[4][16] = { { 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[4][16] = { { 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, 3 },{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } }, s5[4][16] = { { 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[4][16] = { { 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][16] = { { 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[4][16] = { { 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 } }; for (i = 0; i case 0:s = s1[r][c]; break; case 1:s = s2[r][c]; break; case 2:s = s3[r][c]; break; case 3:s = s4[r][c]; break; case 4:s = s5[r][c]; break; case 5:s = s6[r][c]; break; case 6:s = s7[r][c]; break; case 7:s = s8[r][c]; break; } shizhuaner(a,s,i,32); } } void round(int r, int a[56], int b[48], int r_a[32], int r_b[48], int l[32], char mi_r[8], char mi_l[8]) { int i, n, r1[32],r2[32]; //r1,r2为中间数组 int zhihuan2[48] = { 14, 17, 11, 24, 1, 5, 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 }; //置换2 int e[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 }; //E盒 int P[32] = { 16, 7, 20, 21, 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 }; //P盒 printf("这是第%d轮密文:\n", r); n = get(r); left_move(a, n); exchange(a, b, zhihuan2, 48); exchange(r_a,r_b,e,48); yihuo(r_b, b,48); s_box(r1,r_b); exchange(r1,r2,P,32); for (i=0;i 57, 49, 41, 33, 25, 17, 9, 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, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 }; //置换1 int IP[64] = { 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 }; //IP置换 int IP_1[64] = { 40, 8, 48, 16, 56, 24, 64, 32, 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 }; //IP_1置换 printf("*---------------DES加密--------------\n\n"); printf("请输入需要加密的明文:\n"); for (i=0;i scanf("%c", &b[i]); shizhuaner(s_a,(int)b[i],i,64); } exchange(m_a,m_b,IP, 64); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3