logo资料库

DES密码的实现.doc

第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
资料共19页,剩余部分请下载后查看
南华大学 《信息安全原理》实验指导 2012 / 2013 学年 第 1 学期 实验四 对称密码算法 DES 班 组 级: 号: 网络 2 班 实验地点: 寝室 指导教师: 黄欣阳 计算机科学与技术学院 2012 年 10 月 实验四、对称密码算法 DES
一.实验目的 通过用 DES 算法对实际数据进行加密和解密来深刻了解 DES 的运行原理。 二.实验环境 运行 Windows 或 Linux 操作系统的 PC 机,具有 GCC(Linux)、VC(Windows) 、Java 等语 言编译环境。 三.实验内容及要求 1、算法分析。对加密解密时主要用到的五个函数进行分析。 密钥生成函数 加密函数 解密函数 测试函数 密钥长度检验函数 2、使用实例分析。 小组共同做此实验,但分别写实验总结与心得(要写清楚自己做的工作),放在同一实验报 告里。 四.实验过程与结果 在做实验前我们将 DES 算法做了仔细的研究 DES 算法把 64 位的明文输入块变为 64 位的密文输出块,它所使用的密钥也是 64 位,其功能 是把输入的 64 位数据块按位重新组合,并把输出分为 L0 、R0 两部分,每部分各长 32 位, 其置换规则见下表: 58,50,12,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, 即将输入的第 58 位换到第一位,第 50 位换到第 2 位,……,依此类推,最后一位是原来的 第 7 位。 L0、R0 则是换位输出后的两部分,L0 是输出的左 32 位,R0 是右 32 位,
例:设置换前的输入值为 D1D2D3……D64,则经过初始置换后的结果为:L0=D550……D8; R0=D57D49...D7。 经过 26 次迭代运算后,得到 L16、R16,将此作为输入,进行逆置换,即得到密文输出。 逆置换正好是初始置的逆运算,例如,第 1 位经过初始置换后,处于第 40 位,而通过逆置 换,又将第 40 位换回到第 1 位,其逆置换规则如下表所示: 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, 放大换位表 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, 单纯换位表 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, 在 f(Ri,Ki)算法描述图中,S1,S2...S8 为选择函数,其功能是把 6bit 数据变为 4bit 数据。 下面给出选择函数 Si(i=1,2......8)的功能表: 选择函数 Si 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, 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, 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, 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, 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, S2: S3: S4: S5:
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: S7: S8: 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, 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, 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, 子密钥 Ki(48bit)的生成算法 初始 Key 值为 64 位,但 DES 算法规定,其中第 8、16、......64 位是奇偶校验位,不参 与 DES 运算。故 Key 实际可用位数便只有 56 位。即:经过缩小选择换位表 1 的变换后, Key 的位数由 64 位变成了 56 位,此 56 位分为 C0、D0 两部分,各 28 位,然后分别进行 第 1 次循环左移,得到 C1、D1,将 C1(28 位)、D1(28 位)合并得到 56 位,再经过缩小 选择换位 2,从而便得到了密钥 K0(48 位)。依此类推,便可得到 K1、K2、......、K15,不 过需要注意的是,16 次循环左移对应的左移位数要依据下述规则进行: 循环左移位数 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 以上介绍了 DES 算法的加密过程。 DES 算法的解密过程是一样的,区别仅仅在于第一 次迭代时用子密钥 K15,第二次 K14、……,最后一次用 K0,算法本身并没有任何变化。 #include #include
#include //IP 置换 int IP[]= { 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}; 4, 8, 5, 9, 3, 7, 2, 6, //扩展变换 E 1, int E[48]={32, 5, 4, 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}; //P 置换 int P[32]={16, 7, 20, 21, 29, 12, 28, 17, 5, 18, 31, 10, 1, 15, 23, 26, 2, 9, 19, 13, 30, 6, 22, 11, 4, 25}; 8, 24, 14, 32, 27, 3, //置换选择 1 int PC_1[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}; //置换选择 2 int PC_2[48]={14, 17, 11, 24, 1, 5, 3, 28, 4, 2, 6, 21, 10, 23, 19, 12, 7, 27, 20, 13, 8, 16, 15, 26, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32}; //8 个 s 盒 int S1[4][16]={14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 7, 0, 15, 4, 1, 14, 15, 12, 8, 4, 14, 8, 13, 2, 4, 2, 13, 6, 9, 2, 11, 15, 12, 1, 7, 1, 10, 6, 12, 5, 6, 12, 11, 9, 9, 7, 9, 5, 3, 10, 0, 7, 0, 8, 3, 5, 0, 6, 13}, 5, 11, 3, 15, 10, S2[4][16]={15, 8, 14, 4, 7, 15, 7, 11, 10, 1, 3, 13, 0, 14, 13, 8, 10, 1, 3, 15, 6, 11, 3, 4, 9, 8, 14, 12, 5, 1, 2, 11, 6, 7, 0, 8, 12, 2, 13, 12, 1, 10, 6, 9, 6, 7, 12, 0, 2, 4, 13, 4, 0, 5, 10, 9, 11, 5, 2, 15, 3, 5, 14, 9}, 9, 14, S3[4][16]={10, 9, 0, 13, 4, 9, 13, 0, 1, 10, 13, 0, 7, 6, 3, 15, 6, 3, 4, 8, 15, 9, 6, 5, 6, 10, 3, 8, 1, 13, 12, 2, 8, 0, 11, 1, 7, 4, 15, 14, 7, 11, 4, 2, 5, 14, 12, 11, 15, 2, 12, 5, 10, 14, 11, 5, 3, 8, 1, 7, 2, 12}, S4[4][16]={ 0, 3, 6, 7, 13, 14, 8, 11, 5, 6, 15, 13, 10, 6, 3, 15, 1, 4, 0, 12, 11, 7, 13, 15, 6, 10, 9, 9, 10, 3, 0, 1, 13, 9, 0, 8, 2, 7, 1, 4, 5, 11, 12, 4, 15, 8, 9, 1, 10, 14, 2, 12, 8, 3, 14, 4, 5, 2, 14}, 5, 11, 12, 2, 7, S5[4][16]={ 2, 12, 1, 4, 14, 11, 2, 12, 4, 4, 11, 8, 12, 1, 11, 10, 13, 7, 1, 14, 8, 7, 10, 11, 6, 1, 5, 8, 15, 7, 13, 7, 2, 13, 2, 5, 3, 15, 13, 0, 15, 10, 3, 9, 12, 5, 6, 9, 10, 0, 6, 15, 0, 14, 9, 3, 4, 9, 8, 6, 0, 14, 5, 3}, S6[4][16]={12, 1, 10, 15, 2, 5, 2, 12, 10, 15, 4, 9, 14, 15, 4, 3, 3, 2, 9, 7, 12, 2, 9, 8, 5, 3, 6, 1, 13, 14, 9, 4, 10, 8, 12, 0, 5, 15, 10, 11, 14, 1, 7, 0, 13, 6, 7, 7, 5, 11, 0, 11, 3, 8, 1, 13, 11, 6, 6, 8, 13}, 0, 4, 14, S7[4][16]={ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 1, 6, 11, 13, 0, 11, 7, 4, 4, 11, 13, 12, 8, 1, 9, 3, 4, 10, 1, 10, 14, 7, 14, 10, 15, 7, 9, 3, 5, 6, 5, 12, 8, 2, 15, 5, 0, 0, 15, 14, 2, 6, 8, 9, 2, 3, 12},
S8[4][16]={13, 2, 8, 1, 15, 13, 7, 11, 4, 1, 14, 2, 3, 6, 15, 11, 1, 10, 4, 12, 2, 0, 4, 8, 10, 7, 1, 9, 12, 14, 7, 4, 10, 8, 13, 15, 12, 5, 9, 5, 6, 10, 13, 15, 3, 3, 14, 6, 11, 0, 14, 3, 5, 0, 12, 7, 9, 2, 5, 8, 6, 11}; 9, 0, void erjinzhi(char z[8],int *q);//二进制转换 void PC_1_bianhuan(int *Key,int *pc_1);//PC_1 变换 void CD(int *pc_1,int (*c)[28],int (*d)[28]);//把明文分组为 C、D void LS_yiwei(int (*p)[28],int i);//密钥 L、S 的移位 void CD_hebin(int *pc_1,int (*c)[28],int (*d)[28],int i);//C、D 变换 void PC_2_bianhuan(int (*kout)[48],int *pc_1,int a);//PC_2 变换 void IP_change(int *ip,int *Data);//IP 置换 void L__R(int (*l)[32],int (*r)[32],int i);//把 56 位密钥分为 L、S 两组 void E_change(int *r_change,int (*r)[32],int a);//E 的扩展变换 void yihuo1(int *r_change,int (*kout)[48],int a);//异或 1 void S_replace(int *r_change,int *s1);//S 变换 void P_replace(int *p,int *s1);//P 变换 void yihuo2(int (*l)[32],int (*r)[32],int *p,int a);//异或 2 void IP2(int (*l)[32],int (*r)[32],int *ip_1,int i);//IP 逆置换 void miwen(int *ip_1);//得出密文 void yihuo3(int *r_change,int (*kout)[48],int a);// 异或 3 //定义三个数组存放 明文 密钥 密文 char mingwen[8],key_Origion[8],miwens[8]; /******************************************************************** **********/ //二进制转换 void erjinzhi(char z[8],int *q) { char ch; int i,j,a=7; for(i=0;i<8;i++) { ch=z[i]; for(j=0;j<8;j++) { *(q+a)=ch%2; ch=ch/2; a--; }
a=a+16; } for(i=0;i<=63;i++) { if(i%8==0) printf( " "); printf("%d",*(q+i)); } printf("\n"); } /******************************************************************** ***********************************/ //IP 变换 void IP_change(int *ip,int *Data) { int i,j; for(i=1;i<=64;i++) { j=58-i/33+2*(((i-1)/8)%4)-8*((i-1)%8); *(ip+(i-1))=*(Data+(j-1)); } } /******************************************************************** ***********************************/ //提取 L0,R0 分组 void L0_R0(int *ip,int (*l)[32], int (*r)[32]) { int i; for(i=0;i<=31;i++) { *(*l+i)=*(ip+i); } for(i=0;i<=31;i++) { *(*r+i)=*(ip+i+32); } } /******************************************************************** **************************************/
分享到:
收藏