密码学实验报告三

更新时间:2023-11-14 00:06:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《现代密码学》实验报告

年级、专业、班级 实验题目 实验时间 2014.11.20 实验成绩 2012级计算机科学与技术1班 姓名 陈康裕 对称密码算法DES 实验地点 实验性质 主教0410 ■验证性 □设计性 □综合性 教师评价: □算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理; □实验结果正确; □语法、语义正确; □报告规范; 其他: 评价教师签名: 一、 实验原理和目的 DES算法属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。混淆和扩散是它采用的两个最重要的安全特性。混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。 DES算法将明文分成64位大小的众多数据块,即分组长度为64位。同时用56位密钥对64位明文信息加密,最终形成64位的密文。需要注意的地方是掌握DES算法的16轮加、解密流程以及子密钥的产生流程。 通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。 报告创建时间:

二、实验项目内容 1、算法分析 (1)写出DES算法的16轮加、解密流程; (2)写出子密钥的产生流程; 2、下载DES算法的实现程序,并调用其程序对一个文件进行加密和解密,提交程序代码和执行结果。 3、调用下载的DES算法的实现程序对输入的十六进制数加密,比较输入和输出,当改变一个位时比较输出的变化,并说明原因。 三、实验过程或算法(源程序) 1、(1)DES算法的16轮加、解密流程: 加密流程 解密流程 (2)子密钥的产生流程:

子密钥产生流程 2、利用下列程序实现一个文件的加密和解密:(程序的主要代码,整个程序见附件) //密钥置换1 pc-1 int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){ int cnt; for(cnt = 0; cnt < 56; cnt++){ tempbts[cnt] = key[PC_1[cnt]]; } return 0; } //密钥置换2 pc-2 int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){ int cnt; for(cnt = 0; cnt < 48; cnt++){ tempbts[cnt] = key[PC_2[cnt]]; } return 0; } //E扩展置换 int DES_E_Transform(ElemType data[48]){ //这里data两种用处,故为48位极人臣 int cnt; ElemType temp[48]; for(cnt = 0; cnt < 48; cnt++){ temp[cnt] = data[E_Table[cnt]]; //这里data下标最高为32.

} memcpy(data,temp,48); return 0; } //P置换 int DES_P_Transform(ElemType data[32]){ int cnt; ElemType temp[32]; for(cnt = 0; cnt < 32; cnt++){ temp[cnt] = data[P_Table[cnt]]; } memcpy(data,temp,32); return 0; } //循环左移 //左右两边同时循环左移相同的位数. //10010循环左移1位为00101,左移2位为01010 int DES_ROL(ElemType data[56], int times){ ElemType temp[56]; //temp只保存将要循环到右边的位. //保存将要循环移动到右边的位 memcpy(temp,data,times); //保存前28位的移位 memcpy(temp+times,data+28,times); //保存后28位的移位极人臣 //前28位移动 memcpy(data,data+times,28-times); //一般移位 memcpy(data+28-times,temp,times); //循环位移动 //后28位移动 memcpy(data+28,data+28+times,28-times); memcpy(data+56-times,temp+times,times); return 0; } //生成子密钥 int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56]; int cnt; DES_PC1_Transform(key,temp);//PC1置换 for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥 DES_ROL(temp,MOVE_TIMES[cnt]);//Ci Di 左右两边,循环左移 DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥 } return 0; } //异或

int DES_XOR(ElemType R[48], ElemType L[48] ,int count){ int cnt; for(cnt = 0; cnt < count; cnt++){ R[cnt] ^= L[cnt]; //异或即为模2加法 } return 0; } //S盒置换 48=8*6 32=8*4 int DES_SBOX(ElemType data[48]){ int cnt; int line,row,output; int cur1,cur2; for(cnt = 0; cnt < 8; cnt++){ cur1 = cnt*6; cur2 = cnt<<2; //计算在S盒中的行与列 b1b2b3b4b5b6 b1b2 //b3b4b5b6 line = (data[cur1]<<1) + data[cur1+5]; row = (data[cur1+1]<<3) + (data[cur1+2]<<2) + (data[cur1+3]<<1) + data[cur1+4]; output = S[cnt][line][row]; //化为2进制 data[cur2] = (output&0X08)>>3; //取得output二进制倒数第4位为0还是1 data[cur2+1] = (output&0X04)>>2; //output=7=0111 oxo4=0100 data[cur2+2] = (output&0X02)>>1; //相&得到0100 右移2位得到1 data[cur2+3] = output&0x01; } return 0; } 3、调用下载的DES算法的实现程序对输入的十六进制数加密。 四、实验结果及分析和(或)源程序调试过程 1、对一个文件的加密和解密: 明文在d:\\\\plaint.txt中:

本文来源:https://www.bwwdw.com/article/5h4v.html

Top