1 / 11
文档名称:

DES加密算法实验报告.doc

格式:doc   大小:176KB   页数:11页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

DES加密算法实验报告.doc

上传人:xgs758698 2016/8/4 文件大小:176 KB

下载得到文件列表

DES加密算法实验报告.doc

文档介绍

文档介绍:网络安全作业题目 DES 加密算法学号专业及班级网络工程 0902 班姓名日期 一. DES 简介: DES 是一个分组密码算法,使用 64 位密钥(除去 8 位奇偶校验,实际密钥长度为 56 位)对 64 比特的数据分组(二进制数据)加密,产生 64 位密文数据。 DES 是一个对称密码体制, 加密和解密使用同意密钥, 解密和加密使用同一算法( 这样, 在硬件与软件设计时有利于加密单元的重用)。 DES 的所有的保密性均依赖于密钥。二. DES 算法过程: 1. DES 的加密过程: 第一阶段: 初始置换 IP。在第一轮迭代之前, 需要加密的 64 位明文首先通过初始置换 IP 的作用, 对输入分组实施置换。最后, 按照置换顺序, DES 将 64 位的置换结果分为左右两部分,第 1 位到第 32 位记为 L0 ,第 33 位到第 64 位记为 R0 。第二阶段: 16 次迭代变换。 DES 采用了典型的 Feistel 结构, 是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的 16 次迭代变换。 DES 算法的 16 才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥 Ki 作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数 f 后将其输出, 与输入数据的左半部分进行异或运算, 并将得到的结果作为新的有半部分, 原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程( 假设第 i 次迭代所得到的结果为 LiRi ): Li= Ri-1; Ri= Li-1 ⊕ f(Ri-1,Ki); 在最后一轮左与右半部分并未变换,而是直接将 R16 L16 并在一起作为未置换的输入。第三阶段:逆( 初始) 置换。他是初始置换 IP 的逆置换, 记为 IP-1 。在对 16 次迭代的结果( R16 L16 )再使用逆置换 IP-1 后,得到的结果即可作为 DES 加密的密文 Y 输出, 即Y= IP-1 ( R16 L16 )。 2. DES 解密过程: DES 的解密算法与其加密算法使用的算法过程相同。两者的不同之处在于解密时子密钥 Ki 的使用顺序与加密时相反,如果子密钥为 K1K2 … K16, 那么解密时子密钥的使用顺序为 K16K15 … K1, 即使用 DES 解密算法进行解密时, 将以 64 位密文作为输入,第1 次迭代运算使用子密钥 K16 ,第2 次迭代运算使用子密钥 K15 , ……,第 16 次迭代使用子密钥 K1 ,其它的运算与加密算法相同。这样,最后输出的是 64 位明文。三. DES 代码实现(程序): 1. 新建头文件 内容如下: Void EncodeMain(); //EncodeMain function void DecodeMain(); //Sorry ,it has not used void Decode(int *str,int *keychar); //decode :input 8 chars,8 keychars void Encode(int *str,int *keychar); //encode: input 8 chars,8 keychars void keyBuild(int *keychar); //create key array void StrtoBin(int *midkey,int *keychar); //change into binary void keyCreate(int *midkey2,int movebit,int i); //call by keyBuild void EncodeData(int *lData,int *rData,int *srt); //encodedata function void F(int *rData,int *key); //F function void Expand(int *rData,int *rDataP); //Expand function void ExchangeS(int *rDataP,int *rData); //S-diagram change void ExchangeP(int *rData); //P change void FillBin(int *rData,int n,int s); void DecodeData(int *str,int *lData,int *rData); //DecodeData from binary int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28,