[计算机类论文精品]DES数据加密算法实验报告.doc
《[计算机类论文精品]DES数据加密算法实验报告.doc》由会员分享,可在线阅读,更多相关《[计算机类论文精品]DES数据加密算法实验报告.doc(16页珍藏版)》请在三一办公上搜索。
1、 实验报告课程名称 信息安全/计算机安全 实验项目 实验一 DES数据加密算法 姓名 学号 班级 专业 电子信息工程 同组人姓名 指导教师姓名 实验日期 2011年 月 日 一、实验目的通过本实验的学习,深刻理解DES加密标准,提高算法设计能力,为今后继续学习密码技术和数字签名奠定基础。二、实验内容根据DES加密标准,用C+设计编写符合DES算法思想的加、解密程序,能够实现对字符串和数组的加密和解密。三、实验步骤1. 在操作系统环境下启动VC+集成环境(Microsoft Visual C+ 6.0 ,其中6.0为版本号,也可为其它版本),则产生如图1所示界面。图1 VC+ 集成环境界面2.
2、选择“文件”菜单下的“新建”命令,出现如图2所示界面(不可直接按“新建”按钮,此按钮是新建一个文本文件)。此界面缺省标签是要为新程序设定工程项目,但编辑小的源程序也可以不建立项目,可以直接选择其左上角的“文件”标签,产生如图3所示界面。3. 在图3所示的界面中左边选定文件类型为“C+ Source File”,右边填好文件名并选定文件存放目录,然后单击“确定”按钮,出现如图4所示编程界面,开始输入程序。4. 输入完源程序后,按编译菜单下的编译命令,对源程序进行编译。系统将在下方的窗口中显示编译信息。如果无此窗口,可按Alt + 2键或执行查看菜单下的输出命令。如果编译后已无提示错误,则可按编译
3、菜单下的构件命令来生成相应的可执行文件,随后可按编译菜单下的执行命令运行的程序。图2 新建VC+工程项目界面图3 新建VC+源程序文件界面图4 VC+源程序编辑界面四、 DES算法的过程1. 处理密钥:1.1 从用户处获得64位密钥Key。(每第8位为校验位,为使密钥有正确的奇偶校验,每个字节要有奇数个“1”位。1.2 处理过程:1.2.1 对密钥实施变换,经过子密钥换位表PC-1的变换后,Key 的位数由64 位变成了56位。1.2.2 把变换后的密钥等分成两部分,前28位记为C0,后28位记为D0。1.2.3 计算子密钥(共16个), 从i=1开始。1.2.3.1 分别对Ci-1、Di-1
4、作循环左移来生成Ci、Di(共16次)。1.2.3.2 串联Ci、Di,得到一个56位数,然后对此数作子密钥换位表PC-2变换以产生48位子密钥Ki 。1.2.3.3 按以上方法计算出16个子密钥。 2对64位数据块的处理:21 把数据分成64位的数据块,不够64位的以适当方式填补。22 对数据块利用初始变换IP表作变换。23 将变换后的数据块等分成前后两部分,前32位记为L0,后32位记为R0。 24 用16个子密钥对数据加密。241 利用扩展置换E,将32位R(i-1)数据扩展成48位。242 用ER (i-1)与子密钥K(i)作按位异或运算。243 把所得的48位数分成8个6位数组。1-
5、6位为Z1,7-12位为Z2,43-48位为Z8。244 从j=1开始,用S盒里的值替换Zj。S盒里的值为4位数,共8个S盒,输出32位数。2441 取出Z j的第1和第6位串联起来成一个2位数,记为m。m即是Sj盒里用来替换Z j的数所在的行数。2442 取出Z j的第2至第5位串联起来成一个4位数,记为n。n即是Sj盒里用来替换Z j的数所在的列数。2443 用坐标(m,n)在S盒中查找出相应的值作为S盒的输出。245 八个选择函数Sj(1j8)的输出拼接为32位二进制数据,把它作为P盒置换的输入,得到输出246 把得到的结果与L(i-1)作异或运算。把计算结果賦给R(i)。247 把R(
6、i-1)的值賦给L(i),完成1轮乘积变换。248 从241起循环执行16次,直到K(16)也被用到。25 把R(16)和L(16) 顺序串联起来得到一个64位数。对这个数实施22变换的逆变换IP-1。五算法实现(1)源程序:#ifndef _DES_ENCRYPT_DECRYPT #define _DES_ENCRYPT_DECRYPT #define BYTE unsigned char #define LPBYTE BYTE* #define LPCBYTE const BYTE* #define BOOL int class DES public: BOOL CDesEnter(LPC
7、BYTE in, LPBYTE out, int datalen, const BYTE key8, BOOL type); BOOL CDesMac(LPCBYTE mac_data, LPBYTE mac_code, int datalen, const BYTE key8); private: void XOR(const BYTE in18, const BYTE in28, BYTE out8); LPBYTE Bin2ASCII(const BYTE byte64, BYTE bit8); LPBYTE ASCII2Bin(const BYTE bit8, BYTE byte64)
8、; void GenSubKey(const BYTE oldkey8, BYTE newkey168); void endes(const BYTE m_bit8, const BYTE k_bit8, BYTE e_bit8); void undes(const BYTE m_bit8, const BYTE k_bit8, BYTE e_bit8); void SReplace(BYTE s_bit8); ; /* * CDesEnter 函数说明: * des加密/解密入口 * 返回: * 1则成功,0失败 * 参数: * in 需要加密或解密的数据 * 注意:in缓冲区的大小必须和d
9、atalen相同. * out 加密后或解密后输出。 * 注意:out缓冲区大小必须是8的倍数而且比datalen大或者相等。 * 如datalen=7,out缓冲区的大小应该是8,datalen=8,out缓冲区的大小应该是8, * datalen=9,out缓冲区的大小应该是16,依此类推。 * datalen 数据长度(字节)。 * 注意:datalen 必须是8的倍数。 * key 8个字节的加密或解密的密码。 * type 是对数据进行加密还是解密 * 0 表示加密 1 表示解密 */ BOOL DES:CDesEnter(LPCBYTE in, LPBYTE out, int da
10、talen, const BYTE key8, BOOL type) /判断输入参数是否正确,失败的情况为: /!in: in指针(输入缓冲)无效 /!out: out指针(输出缓冲)无效 /datalen1: 数据长度不正确 /!key: 加/解密密码无效 /type & (datalen % 8) !=0:选择解密方式但是输入密文不为8的倍数 if(!in) | (!out) | (datalen1) | (!key) | (type & (datalen % 8) !=0) return false; if(type=0) /选择的模式是加密 / 用于存储待加密字串最后的若干字节 / D
11、ES算法是以8个字节为单位进行加密,如果待加密字串以8为单位分段加密时,最后一段不足 /8字节,则在后面补0,使其最后一段的长度为8字节 / te8bit是作为存储待加密字串最后一段(不足8字节)的变量 BYTE te8bit8=0,0,0,0,0,0,0,0; / 这是待加密字串的调整长度 / 如果原始长度是8的整数倍,则调整长度的值和原来的长度一样 / 如果原始长度不是8的整数倍,则调整长度的值是能被8整除且不大于原来长度的最大整数。 /也就是不需要补齐的块的总长度 int te_fixlen = datalen - (datalen % 8); / 将待加密密文以8为单位分段,把最后长度
12、不足8的一段存储到te8bit中 for(int i = 0; i (datalen % 8); i+) te8biti = inte_fixlen + i; / 将待加密字串分以8字节为单位分段加密 for(i = 0; i te_fixlen; i += 8) endes(in + i, key, out + i); / 如果待加密字串不是8的整数倍,则将最后一段补齐(补0)后加密 if(datalen % 8 != 0) endes(te8bit, key, out + datalen / 8 * 8); else /选择的模式是解密 / 将密文以8字节为单位分段解密 for(int i
13、 = 0; i datalen; i += 8) undes(in + i, key, out + i); return true; /* * CDesMAC 函数说明: * DESMAC 数据验校 * 返回: * 1则成功,0失败 * 参数: * mac_data MAC验校数据 * 注意:Mac_data缓冲区的大小(16字节以上)必须和datalen相同,而且应是8的倍数。 * out_mac MAC验校输出(8字节) * dadalen 数据长度(字节)。 * 注意:datalen 必须是16以上而且是8的倍数。 * key 8个字节的验校密码。 */ BOOL DES:CDesMac
14、(LPCBYTE mac_data, LPBYTE mac_code, int datalen, const BYTE key8) /判断输入参数是否正确,失败的情况为: /!mac_data: mac_data指针(输入缓冲)无效 /!mac_code: mac_code指针(输出缓冲)无效 /datalen16: 数据长度不正确 /datalen % 8 != 0: 数据长度不为8的整数倍 /!key:密码不符合要求 if(!mac_data) | (!mac_code) | (datalen 16) | (datalen % 8 != 0) | (!key) return false;
15、endes(mac_data, key, mac_code); for(int i = 8; i datalen; i += 8) XOR(mac_code, mac_data + i, mac_code); endes(mac_code, key, mac_code); return true; /* * XOR 函数说明: * 将输入的两个8字节字符串异或 * 返回: * 无 * 参数: * const BYTE in18 输入字符串1 * const BYTE in28 输入字符串2 * BYTE out8 输出的结果字符串 */ void DES:XOR(const BYTE in18
16、, const BYTE in28, BYTE out8) for(int i = 0; i 8; i+) outi = in1i in2i; /* * Bin2ASCII 函数说明: * 将64字节的01字符串转换成对应的8个字节 * 返回: * 转换后结果的指针 * 参数: * const BYTE byte64 输入字符串 * BYTE bit8 输出的转换结果 */ LPBYTE DES:Bin2ASCII(const BYTE byte64, BYTE bit8) for(int i = 0; i 8; i+) biti = bytei * 8 * 128 + bytei * 8 +
17、 1 * 64 + bytei * 8 + 2 * 32 + bytei * 8 + 3 * 16 + bytei * 8 + 4 * 8 + bytei * 8 + 5 * 4 + bytei * 8 + 6 * 2 + bytei * 8 + 7; return bit; /* * ASCII2Bin 函数说明: * 将8个字节输入转换成对应的64字节的01字符串 * 返回: * 转换后结果的指针 * 参数: * const BYTE bit8 输入字符串 * BYTE byte64 输出的转换结果 */ LPBYTE DES:ASCII2Bin(const BYTE bit8, BYTE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机类论文精品 计算机 论文 精品 DES 数据 加密算法 实验 报告
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3932943.html