实验内容:

通过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 <stdio.h>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<num;i++){if (a[i]==b[i])  a[i]=0;elsea[i]=1;}
}void left_move(int s[56], int n)         //左移
{int i;for (i=0;i<=28-n;i++) {s[i]=s[(i+n)%28];}for(i=28;i<=56-n;i++){s[i]=s[(i+n)%56];}
}void exchange(int *a, int *b, int *biao,int n)    //置换
{int i,loc;  for (i=0;i<n;i++){loc=biao[i];  b[i]=a[loc-1];}return;
}void shizhuaner(int *a,int x,int i,int n)
// a是存放二进制的数组,x是需要进行转换的十进制数,i是第i个十进制数,n是数组大小
{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<n;i++){j=8*a[4*i]+4*a[4*i+1]+2*a[4*i+2]+a[4*i+3];if(j>=10){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 < 8; i++){r = 2*b[6*i]+b[6*i+5];  c = 8*b[6*i+1]+4*b[6*i+2]+2*b[6*i+3]+b[6*i+4]; switch (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<32;i++)    r1[i] = r2[i];yihuo(r1,l,32); for (i=0;i<32;i++)    l[i] = r_a[i];  //准备下次循环的Lfor (i=0;i<32;i++)    r_a[i] = r1[i];  //准备下次循环的Rerzhuanshiliu(r_a,mi_r,32);  erzhuanshiliu(l,mi_l, 32);for (i=0;i<8;i++)     printf("%c ",mi_r[i]);  //第r轮R部分的密文for (i=0;i<8;i++)     printf("%c ",mi_l[i]);  //第r轮L部分的密文printf("\n\n");return;
}int main()
{char a[8];        //初始明文 char b[8];        //初始密钥int m_a[64],m_b[64];          //IP置换前后的明文 int s_a[64],s_b[56];          //置换1前后的二进制密钥 int r;            //轮数int s_c[48];      //置换2后的数组int r_a[32],r_b[48];          //E扩展前后的m_b的右半部分明文int l[32];        //m_b的左半部分char mi_r[8],mi_l[8];         //存储密文的十六进制int mi1[16],mi2[16];          //IP_1置换前后的密文 char miwen[16];   //最终密文 int i;int zhihuan1[56] = { 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<8;i++)  {scanf("%c",&a[i]);shizhuaner(m_a,(int)a[i],i,64);  }printf("\n请输入加密的密钥:\n");for (i=0;i<8;i++) {scanf("%c", &b[i]);shizhuaner(s_a,(int)b[i],i,64);}exchange(m_a,m_b,IP, 64); for(i=0;i<32;i++)l[i]=m_b[i];  for(i=32;i<64;i++)r_a[i-32]=m_b[i]; exchange(s_a,s_b,zhihuan1,56);  for (r=1;r<=16;r++) round(r,s_b,s_c,r_a,r_b,l,mi_r,mi_l);for(i=0;i<64;i++)  //将密文R的部分与密文L的部分合一起{mi1[i]=r_a[i];if(i>=32) mi1[i]=l[i-32];}exchange(mi1,mi2,IP_1,64);  erzhuanshiliu(mi2,miwen, 64);  //二进制转换成十六进制,得到最终密文printf("##########这是最终密文:##########\n");for (i=0;i<16;i++)printf("%c ", miwen[i]);printf("\n");return 0;
}

实验结果截图:

DES算法代码实现(C语言)相关推荐

  1. c语言des算法实验报告,c语言实现des算法des加密算法实验报告

    c语言实现des算法des加密算法实验报告 (23页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 xx 工程大学工程大学实验报告实验报告 ...

  2. c语言des算法实验报告,C语言实现DES算法实验报告解析.doc

    C语言实现DES算法实验报告解析 xx工程大学 实验报告 (2015-2016学年第一学期) 报告题目: DES加密算法 课程名称: 密码学B 任课教员: 专 业: 学 号: 姓 名: 二O一六年一月 ...

  3. 凸包问题的快包算法代码(C语言)

    二维凸包可以用来解决围栏问题.城市规划问题.聚类分析等等. 原文链接:http://blog.csdn.net/bone_ace/article/details/46239187 分治法 时间复杂度: ...

  4. 【安全算法之DES】DES算法(支持ECB/CBC模式)的C语言源码实现

    [安全算法之DES]DES算法(支持ECB/CBC模式)的C语言源码实现 概述 头文件定义 C语言版本的实现源码 数据分组模式:ECB模式和CBC模式 测试用例 github仓库 更多参考链接 概述 ...

  5. des实验报告c语言实现,C语言实现DES算法实验报告

    <C语言实现DES算法实验报告>由会员分享,可在线阅读,更多相关<C语言实现DES算法实验报告(29页珍藏版)>请在人人文库网上搜索. 1.xx工程大学实验报告(2015-20 ...

  6. DES算法 C语言实现

    DES算法C语言实现 算法概述 DES算法是一种对称块加密方法,加密和解密都使用一个长度为64位的密钥.以64位为一个分组长度,对于每个分组,通过置换.Feistel轮函数.子密钥生成等一系列操作,输 ...

  7. DES算法详解和代码 - IP置换

    DES算法,IP置换的功能是把输入的64位数据块按位重新组合,并把输出分为L0.R0两部分,每部分各长32位,其置换规则见下表: 58,50,42,34,26,18,10,2,60,52,44,36, ...

  8. DES算法C语言实现

    有关DES的加密流程详解des算法加密流程_lkw23333的博客-CSDN博客_des密钥加密过程 此处只做简略介绍,或者看代码注释 简要流程 (1)输入8位字符明文以及设定8位字符的加密密钥: ( ...

  9. java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

    所谓有权图,就是图中的每一条边上都会有相应的一个或一组值.通常情况下,这个值只是一个数字 如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字).不过,边上的权值也 ...

最新文章

  1. python代码安全扫描工具
  2. Opencv step by step - 加载视频
  3. Java报错InvalidDefinitionExceptio
  4. Redis工作笔记-持久化
  5. 无法将输入值传递给JavaScript变量
  6. leetcode - 801. 使序列递增的最小交换次数
  7. 关于新手的一个bug,pycharm和IDea的ctrl+C和ctrl+V不起作用
  8. 存定期还能加钱进去吗_购买支付宝的定期理财产品,会亏钱吗?
  9. Java 创建线程的4种方式
  10. nginx官方模块之http_random_index_module
  11. lintcode:Plus One 加一
  12. 人工智能实验bp神经网络,BP人工神经网络模型
  13. photoshop 证件照动作_国考报名确认及缴费进行中!证件照上传注意事项!
  14. UE4 虚幻引擎,光照系统。BP_Sky_Sphere 白天黑夜效果
  15. 民谣吉他之新手调音,弦音不对的问题
  16. android如何截屏快捷键,安卓手机怎么截图 各大品牌快捷键截屏大集合
  17. php tipask yii 单点登录_Tipask问答系统 php版 v3.3.1 正式版
  18. 萌新的C语言指针小结(1)
  19. 撑不住了,豆瓣用户需要实名制了
  20. 页面屏蔽backspace键

热门文章

  1. halo 开源项目源码学习
  2. JavaWeb Adv CH8 web服务的相互转接(多图猫杀)
  3. 操作系统及软件常用的日语单词
  4. Dockerfile搭建wordpress论坛
  5. 宝塔面板如何升级PHP版本?
  6. 2022-2028年中国齿轮行业投资分析及前景预测报告
  7. bzoj 4627 回转寿司(权值线段树)
  8. 微信私域流量社群搭建sop流程步骤运营管理方案计划书表格
  9. 中年危机难解,58同城如何继续“神奇”之路?
  10. Launcher3 实现桌面客制化---1