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

xx 工程大学

实验报告

(2015-2016学年第一学期)

报告题目: DES加密算法

课程名称: 密码学B

任课教员:

专 业:

学 号:

姓 名:

二O一六年一月十八日

一、课程概述

目的 :培养学员的编程能力 ,理解算法原理。

要求 :给出 DES算法的软件实现 ,测试 DES 的加密速度。

二、设计思路

使用 C++语言进行编程 ,简化了输入输出语句。预处理时加入了 iostream包。使

用了 std名字空间。

加密时程序输入的明文是 8个 ascii码 ,生成一个 16个 16进制数的密文。

脱密时程序输入的密文是 16个 16进制数 ,生成一个 8个 ascii码的明文。

加脱密所用密钥均由 16个 16进制数组成。

其中 16进制数全部使用大写字母。

程序中大量使用了的布尔数组 ,一个 bool型变量只占用一位存储空间 ,比 int 型、

char型变量要小的多。这降低了程序的空间复杂度。

三、采取的方案

本程序是将一个由8个 ascii码组成的明文分组加密 ,生成一个由 16个 16进制数

组成的密文。或将一个由 16个 16进制数组成的密文进行脱密 ,生成一个由8个 ascii

码组成的明文。所用密钥由 16个 16进制数组成。

本实验按照输入数据及初始置换、16 圈迭代、子密钥生成和逆初始置换及输出数

据四个步骤实现加密算法设计。

1、输入数据及初始置换

本程序首先会提示用户输入加密脱密识别码 ,加密输入 1 ,脱密输入 0 ,将此识别

码存入整形变量 o。根据 o 的不同值 ,提示用户输入 8个字符 (加密 )或 16个 16进

制数 (脱密 )。输入的明文或密文转化为二进制数后储存到布尔型数组 m[65]中。

初始置换通过函数 IP完成 ,函数输入为原始明文 m ,函数将输出结果保存到布尔

型数组 mip[65]中。函数思想为查表 ,含有一个整形变量数组 ip[64] ,保存初始变换表

IP。将 mip的第 i位赋值为 m的第 ip[i]位。

2、子密钥生成

输入 16个 16进制数的密钥后 ,将密钥保存在一个 16位字符数组 c 中 ,通过

ToEr 函数将之变为二进制数。ToEr 函数输入为字符数组 ,通过 switch语句逐个检查字

符数组的每一位 ,将对应的四位二进制数存在 64 位布尔数组 k 中。

64 bit 密钥去掉每个字节的最高位得到 56 bit 密钥输入 ,通过置换选择 1变换得

C D

0 0

到 和 各 28 bit ,通过 Zhihuan_1 函数实现置换选择一。Zhihuan_1 函数输入为

二进制密钥数组 k[64] ,输出为 C0和 D0 ,将 C0、D0分别储存在 28位布尔数组 C、

D 中。函数采用查表方式生成 C0和 D0。

根据迭代的轮数确定 C和 D移位循环的位数 ,主程序中利用一个 16位整形数组来

存放每一次循环左移的位数。循环左移通过 XunHuan 函数实现 ,函数输入为循环位数

和长度为 28 的布尔数组 (C或者 D ),函数运行一次只能改变一个布尔数组的值。为了

减低编程复杂度 ,程序使用串行方法 ,分两次进行 C、D的移位。

每完成一次 C和 D的移位 ,进行一次置换选择二。置换选择二利用 zhihuan_2 函

数完成。思想和Zhihuan_1函数类似。zhihuan_2函数输入为移位后的C、D ,zhihuan_2

函数将圈子密钥存放在 16*48 的二维布尔数组 kk[17][49] 中。kk[i][48]表示第 i 圈的

圈子密钥。原理图如图 1所示。

脱密 (o=0 时 )需要将圈子密钥交换 ,此时可利用 kk[0][49]充当中间变量 ,无需

定义新的变量减少了系统开销。

图 1 圈子密钥生成算法

3、16 圈迭代

DES 的每一圈迭代采用的是 Feistel模型 ,先将初始置换后的明文 mip数组分成 L

和 R两部分 ,先将

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值