密码学实验三—DES算法的实现课案
实验三~DES加解密算法

实验一、DES实验报告●实验目的:●熟悉DES加密算法,熟悉加密体制的概念,了解加密算法的使用。
●2、实验原理●DES加密是对称加密机制中的一种方式,是单钥算法,是一种按分组方式工作的加密方式,是两种基本的加密组块替代和换位的结构。
它通过反复依次应用这两项技术来提高强度,经过16轮的替代和换位的变换,使得其他人无法获得该算法一般特性以外更多的信息。
●3、实验环境:●PC机一台●4、实验步骤●●●对设计好的程序结构和数据结构,在相应的平台下进行实现,对程序进行调试。
代码:#include "des.h"#include "stdio.h"#include "string.h"#include "memory.h"void main(){char key[8],buf[255],str[100];printf("请输入明文:");scanf("%s",&str);memset(buf, 0, sizeof(buf));strcpy(buf, str);printf("明文:");puts(buf);printf("请输入密钥:");scanf("%s",&key);Des_Go(buf, buf, sizeof(str), key, sizeof(key), jiami);puts("\n用密钥加密后:");puts(buf);Des_Go(buf, buf, sizeof(str), key, sizeof(key), jiemi);puts("\n解密后:");puts(buf);//getchar();}#include "memory.h"#include "des.h"////////////////////////////////////////////////////////////////////////// const static char IP_Table[64] = {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};const static char IPR_Table[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};static const char E_Table[48] = {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};const static char P_Table[32] = {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};const static char PC1_Table[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};const static char PC2_Table[48] = {14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32};const static char LOOP_Table[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};const static char S_Box[8][4][16] = {// S114, 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, // S215, 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, // S310, 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,// S47, 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,// S52, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,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, // S612, 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,// S74, 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,// S813, 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};////////////////////////////////////////////////////////////////////////// typedef bool (*PSubKey)[16][48];////////////////////////////////////////////////////////////////////////// static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES加/解密static void SetKey(const char* Key, int len);// 设置密钥static void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥static void F_func(bool In[32], const bool Ki[48]);// f 函数static void S_func(bool Out[32], const bool In[48]);// S 盒代替static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换static void Xor(bool *InA, const bool *InB, int len);// 异或static void RotateL(bool *In, int len, int loop);// 循环左移static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组bool Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type){if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )return false;SetKey(Key, keylen);//设置密钥if( !Is3DES ) { // 1次DESfor(long i=0,j=datalen>>3; i DES(Out, In,&SubKey[0], Type);} else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)for(long i=0,j=datalen>>3; i DES(Out, In,&SubKey[0], Type);DES(Out, Out, &SubKey[1], !Type);DES(Out, Out, &SubKey[0], Type);}}return true;}void SetKey(const char* Key, int len){memset(deskey, 0, 16);memcpy(deskey, Key, len>16?16:len);SetSubKey(&SubKey[0], &deskey[0]);if(Is3DES = len>8)Is3DES=(SetSubKey(&SubKey[1], &deskey[8]), true);elseIs3DES=false;}void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type) {static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];ByteToBit(M, In, 64);Transform(M, M, IP_Table, 64);if( Type == jiami ){for(int i=0; i<16; ++i) {memcpy(tmp, Ri, 32);F_func(Ri, (*pSubKey)[i]);Xor(Ri, Li, 32);memcpy(Li, tmp, 32);}}else{for(int i=15; i>=0; --i) {memcpy(tmp, Li, 32);F_func(Li, (*pSubKey)[i]);Xor(Li, Ri, 32);memcpy(Ri, tmp, 32);}}Transform(M, M, IPR_Table, 64);BitToByte(Out, M, 64);}void SetSubKey(PSubKey pSubKey, const char Key[8]){static bool K[64], *KL=&K[0], *KR=&K[28];ByteToBit(K, Key, 64);Transform(K, K, PC1_Table, 56);for(int i=0; i<16; ++i) {RotateL(KL, 28, LOOP_Table[i]);RotateL(KR, 28, LOOP_Table[i]);Transform((*pSubKey)[i], K, PC2_Table, 48);}}void F_func(bool In[32], const bool Ki[48]){static bool MR[48];Transform(MR, In, E_Table, 48);Xor(MR, Ki, 48);S_func(In, MR);Transform(In, In, P_Table, 32);}void S_func(bool Out[32], const bool In[48]) //S 盒代替{for(char i=0,j,k; i<8; ++i,In+=6,Out+=4) {j = (In[0]<<1) + In[5]; //计算1位与6位组成的数k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4]; // 计算2,3,4,5位组成的数ByteToBit(Out, &S_Box[i][j][k], 4);}}void Transform(bool *Out, bool *In, const char *Table, int len)//变换{for(int i=0; i Tmp[i] = In[ Table[i]-1 ]; //表中是以1为首memcpy(Out, Tmp, len);}void Xor(bool *InA, const bool *InB, int len) //位异或{for(int i=0; i {InA[i]=InA[i] ^ InB[i];}// InA[i] ^= InB[i];}void RotateL(bool *In, int len, int loop) //循环左移{memcpy(Tmp, In, loop);memcpy(In, In+loop, len-loop);memcpy(In+len-loop, Tmp, loop);}void ByteToBit(bool *Out, const char *In, int bits) //字节转换为位{for(int i=0; i Out[i] = (In[i>>3]>>(i&7)) & 1;}void BitToByte(char *Out, const bool *In, int bits)//位转换为字节{memset(Out, 0, bits>>3);for(int i=0; i {Out[i>>3]=(Out[i>>3] | In[i]<<(i&7));}//Out[i>>3] |= In[i]<<(i&7);}。
DES加密算法的简单实现实验报告

DES加密算法的简单实现实验报告一、实验目的本实验的主要目的是对DES加密算法进行简单的实现,并通过实际运行案例来验证算法的正确性和可靠性。
通过该实验可以让学生进一步了解DES算法的工作原理和加密过程,并培养学生对算法实现和数据处理的能力。
二、实验原理DES(Data Encryption Standard,数据加密标准)是一种对称密钥加密算法,它是美国联邦政府采用的一种加密标准。
DES算法使用了一个共享的对称密钥(也称为密钥),用于加密和解密数据。
它采用了分组密码的方式,在进行加密和解密操作时,需要将数据分成固定长度的数据块,并使用密钥对数据进行加密和解密。
DES算法主要由四个步骤组成:初始置换(Initial Permutation),轮函数(Round Function),轮置换(Round Permutation)和最终置换(Final Permutation)。
其中初始置换和最终置换是固定的置换过程,用于改变数据的顺序和排列方式。
轮函数是DES算法的核心部分,它使用了密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
通过多轮的迭代运算,DES算法可以通过一个给定的密钥对数据进行高强度的加密和解密操作。
三、实验步骤2.初始置换:将输入数据按照一定的规则重新排列,生成一个新的数据块。
初始置换的规则通过查表的方式给出,我们可以根据规则生成初始置换的代码。
3.轮函数:轮函数是DES算法的核心部分,它使用轮密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
在实际的算法设计和实现中,可以使用混合逻辑电路等方式来实现轮函数。
4.轮置换:轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
轮置换的规则也可以通过查表的方式给出。
5.最终置换:最终置换与初始置换类似,将最后一轮的结果重新排列,生成最终的加密结果。
DES算法程序实现课程设计

DES算法程序实现课程设计一、课程目标知识目标:1. 理解DES算法的基本原理和加密流程;2. 掌握DES算法中子密钥生成、初始置换、轮函数和逆初始置换等关键步骤;3. 了解DES算法在实际应用中的优势和局限性。
技能目标:1. 能够运用编程语言(如Python、C++等)实现DES算法加密和解密过程;2. 学会分析并解决DES算法程序实现过程中遇到的问题;3. 培养学生的团队协作能力,通过小组合作完成课程项目。
情感态度价值观目标:1. 培养学生对密码学领域的兴趣,激发学习积极性;2. 培养学生的信息安全意识,了解加密技术在保护信息安全中的重要性;3. 引导学生树立正确的价值观,认识到技术对社会发展的积极影响。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为计算机科学与技术专业的选修课程,以实践为主,理论联系实际;2. 学生特点:学生具备一定的编程基础和密码学理论知识,对实际应用有较高的兴趣;3. 教学要求:注重理论与实践相结合,培养学生动手能力和解决问题的能力。
课程目标分解为具体学习成果:1. 知识目标:学生能够阐述DES算法的原理和流程,掌握相关术语;2. 技能目标:学生能够独立编写DES算法的加密和解密程序,并进行调试优化;3. 情感态度价值观目标:学生能够认识到密码学在信息安全领域的应用价值,提高自身信息安全意识。
二、教学内容1. DES算法基本原理:介绍DES算法的历史背景、加密流程、密钥生成等基本概念。
2. 子密钥生成:讲解子密钥的生成过程,包括初始密钥的置换、压缩和轮密钥的计算。
3. 初始置换和逆初始置换:分析初始置换和逆初始置换的作用,讲解具体实现方法。
4. 轮函数:详细介绍轮函数的结构,包括扩展置换、S盒替换、P盒置换等步骤。
5. DES算法编程实现:指导学生使用编程语言(如Python、C++等)实现DES算法的加密和解密过程。
6. DES算法应用案例分析:分析实际应用中DES算法的优缺点,探讨其在新一代加密算法中的地位。
des算法实验报告

des算法实验报告DES算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司于1975年研发并被美国国家标准局(NBS)采纳为联邦信息处理标准(FIPS)。
二、算法原理DES算法采用了分组密码的方式,将明文数据划分为固定长度的数据块(64位),并通过密钥进行加密和解密操作。
其核心是Feistel结构,每轮加密操作包括置换和替代两个步骤。
1. 置换步骤DES算法的初始置换(IP)和逆初始置换(IP-1)通过一系列的位重排操作,将输入的64位明文数据打乱,以增加加密的强度。
2. 替代步骤DES算法中使用了8个S盒(Substitution Box),每个S盒接受6位输入,并输出4位结果。
S盒的作用是将输入的6位数据映射为4位输出,通过这种非线性的映射关系,增加了算法的安全性。
3. 轮函数DES算法的加密过程包含16轮迭代,每轮迭代中都会对数据进行一系列的位重排和替代操作。
其中,轮函数是DES算法的核心部分,它通过使用子密钥对数据进行异或操作,并通过S盒替代和P盒置换操作,产生新的数据块。
三、实验步骤为了更好地理解DES算法的加密过程,我们进行了以下实验步骤:1. 输入明文和密钥我们选择了一个64位的明文数据块和一个56位的密钥作为输入。
明文数据块经过初始置换(IP)后,得到L0和R0两个32位的数据块。
2. 生成子密钥通过对密钥进行置换和循环左移操作,生成16个48位的子密钥。
3. 迭代加密对明文数据块进行16轮的迭代加密,每轮加密包括以下步骤:a. 将R(i-1)作为输入,经过扩展置换(E-box),得到48位的扩展数据。
b. 将扩展数据和子密钥Ki进行异或操作,得到48位的异或结果。
c. 将异或结果分为8个6位的数据块,分别经过8个S盒替代操作,得到32位的S盒替代结果。
d. 将S盒替代结果经过P盒置换,得到32位的轮函数输出。
DES算法的原理与实现

实验项目与实验报告( 2 )学科:信息与网络安全 学号: 姓名: 时间: 月 日实验名称:DES算法的原理与实现实验目的:1.熟悉DES算法的实现程序和具体应用,加深对DES算法的了解。
实验内容:(写出实验内容要点或相关理论准备、实验估计)一、DES算法的简介DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国BM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位代替或交换的方法形成密文组的加密方法。
1、基本原理其入口参数有三个:key、data、mode。
Key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。
当模式为加密模式时,明文按照64为进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。
实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
2、DES特点DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。
而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。
然而,这并不等于说DES是不可破解的。
而实际上,随着硬件技术和Intemet的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。
为了克服DES密钥空间小的缺陷,人们又提出了三重DES的变形方式。
3、主要流程DES算法把64为的明文输入块变为64位的密文输入块,它所使用的密钥也是64位,整个算法的主要流程图如下:(1)置换规则表其功能是把输入的数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表: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,即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。
des 加密算法实验报告

des 加密算法实验报告DES加密算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称加密算法,由IBM公司于1975年研发并被美国联邦政府采用为标准加密算法。
DES算法具有高效、可靠、安全等特点,被广泛应用于信息安全领域。
本实验旨在通过对DES算法的实验研究,深入了解其原理、性能和应用。
二、DES算法原理DES算法采用对称密钥加密,即加密和解密使用相同的密钥。
其核心是Feistel结构,将明文分成左右两部分,经过16轮迭代加密后得到密文。
每一轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和密钥进行变换。
DES算法中使用了置换、代换和异或等运算,以保证加密的安全性。
三、DES算法实验过程1. 密钥生成在DES算法中,密钥长度为64位,但实际上只有56位用于加密,8位用于奇偶校验。
实验中,我们随机生成一个64位的二进制密钥,并通过奇偶校验生成最终的56位密钥。
2. 初始置换明文经过初始置换IP,将明文的每一位按照特定规则重新排列,得到初始置换后的明文。
3. 迭代加密经过初始置换后的明文分为左右两部分,每轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和子密钥进行变换。
函数f包括扩展置换、S盒代换、P盒置换和异或运算等步骤,最后与右半部分进行异或运算得到新的右半部分。
4. 逆初始置换经过16轮迭代加密后,得到的密文再经过逆初始置换,将密文的每一位按照特定规则重新排列,得到最终的加密结果。
四、DES算法性能评估1. 安全性DES算法的密钥长度较短,易受到暴力破解等攻击手段的威胁。
为了提高安全性,可以采用Triple-DES等加强版算法。
2. 效率DES算法的加密速度较快,适用于对大量数据进行加密。
但随着计算机计算能力的提高,DES算法的加密强度逐渐降低,需要采用更加安全的加密算法。
3. 应用领域DES算法在金融、电子商务、网络通信等领域得到广泛应用。
DES加密实验报告

DES加密实验报告实验目的:1.了解DES加密算法的原理和流程;2.掌握DES加密算法的编程实现方法;3.探究不同密钥长度对DES加密效果的影响。
实验设备和材料:1.计算机;2. Python编程环境。
实验步骤:1.DES加密算法原理和流程:DES(Data Encryption Standard)是一种对称加密算法,采用分组密码体制,密钥长度为56位,数据块长度为64位。
DES加密算法的流程如下:a)初始置换(IP置换):将明文分为左右两个32位的子块,并经过初始置换表IP进行置换;b)迭代加密:将初始置换结果分为左右两个子块,进行16轮迭代操作;c)轮函数:每轮迭代中,右子块与扩展置换表进行扩展置换,并与轮密钥进行异或运算,然后经过S盒替换、P置换和异或运算得到新的右子块;d)逆初始置换(IP逆置换):将最后一轮的结果进行逆初始置换,得到密文。
2.DES加密算法编程实现:首先,导入`pycrypto`库并生成合适长度的密钥;其次,定义初始置换表IP,扩展置换表E,S盒置换表S1-S8,P置换表P,以及逆初始置换表IP_inverse;然后,定义`des_encrypt`函数实现DES加密算法的逻辑:a)根据IP置换表对输入明文进行初始置换;b)将初始置换结果分为左右两个子块;c)进行16轮迭代操作,每轮迭代中更新左右子块的值;d)对最后一轮迭代结果进行逆初始置换;e)返回加密后的密文。
3.探究不同密钥长度对DES加密效果的影响:初始化明文和密钥,调用`des_encrypt`函数进行加密,并输出加密结果;分别改变密钥长度为56位、64位、128位,再次进行加密操作,并输出加密结果;比较不同密钥长度下的加密结果,进行效果分析。
实验结果:使用DES加密算法对明文进行加密,得到相应的密文。
实验结论:1.DES加密算法可以对密文进行可靠保护,提高数据的安全性;2.较长的密钥长度有助于增强DES加密算法的安全性,但同时也会增加加密和解密的运算成本;3.在实际应用中,根据需求和实际情况,选择合适的密钥长度,平衡安全性和性能的需求。
DES加密算法的简单实现实验报告

DES加密算法的简单实现实验报告苏州科技学院电子与信息工程学院实验报告实验一(实验)课程名称信息安全技术实验名称DES加密算法的简单实现实验报告一、实验室名称:电子学院213机房二、实验项目名称:DES加密算法的简单实现三、实验学时:2学时四、实验原理:DES的描述DES是一种分组加密算法,他以64位为分组对数据加密。
64位一组的明文从算法的一端输入,64位的密文从另一端输出。
DES是一个对称算法:加密和解密用的是同一个算法(除密钥编排不同以外)。
密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。
密钥可以是任意的56位数,且可以在任意的时候改变。
DES算法的入口参数有3个:Key,Data,Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或解密的数据:Mode为DES的工作方式,有两种:加密或解密。
DES算法的工作过程:若Mode为加密,则用Key对数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;若Mode为解密,则用Key 对密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
DES算法详述DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。
通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。
然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密钥相结合。
经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算法就完成了。
(1)初始置换其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位,即将输入的第58位换到第1位,第50位换到第2位,…,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。
DeS加解密课程设计

DeS加解密课程设计一、课程目标知识目标:1. 理解DeS加解密的基本概念,掌握其工作原理;2. 学会运用DeS算法进行加密与解密操作;3. 了解DeS算法在信息安全领域的应用。
技能目标:1. 能够运用所学知识,独立完成DeS加解密的实际操作;2. 能够分析并解决DeS加解密过程中遇到的问题;3. 能够运用DeS算法进行简单的信息安全保护。
情感态度价值观目标:1. 培养学生对信息安全领域的兴趣,提高信息安全意识;2. 培养学生的团队协作精神,学会在团队中分享与交流;3. 增强学生的国家网络安全意识,树立正确的网络道德观念。
课程性质:本课程为信息技术学科,旨在让学生掌握DeS加解密的基本原理和实际应用,提高学生的信息安全素养。
学生特点:六年级学生具备一定的计算机操作能力和逻辑思维能力,对新鲜事物充满好奇心,但注意力容易分散。
教学要求:结合学生特点,采用案例教学、任务驱动等方法,激发学生学习兴趣,注重理论与实践相结合,提高学生的实际操作能力。
在教学过程中,关注学生的个体差异,进行分层教学,确保每个学生都能达到课程目标。
通过课程学习,使学生能够将所学知识应用于实际生活,提高其信息安全保护能力。
二、教学内容1. 引言:介绍加密技术的基本概念、发展历程及其在信息安全中的重要性。
教材章节:第一章 加密技术概述2. DeS算法原理:讲解DeS算法的加密过程、解密过程及其工作原理。
教材章节:第二章 对称加密算法3. DeS算法实现:分析DeS算法的实现步骤,指导学生进行实际操作。
教材章节:第三章 DeS算法及其实现4. DeS加解密应用:介绍DeS算法在信息安全领域的具体应用,如数字签名、安全通信等。
教材章节:第四章 DeS算法应用实例5. 信息安全意识培养:通过案例分析,提高学生的信息安全意识,树立正确的网络道德观念。
教材章节:第五章 信息安全意识教学进度安排:第一课时:引言,了解加密技术的基本概念和发展历程。
C语言实现DES算法DES加密算法实验报告

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中。
实验报告 DES加密算法的实现

实验报告DES加密算法的实现班级自动化学号:姓名:2016年11月13日星期日一、DES加密简述:DES算法是一种对称密码体制,由美国IBM公司在1972年研发。
其明文按64位进行分组,密钥长64位(包含8位校验位),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
二、DES的实现过程首先通过初始置换表IP对明文进行置换intIP_Table[64] = { 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,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6};第一个57就是将明文中的第57个元素,放到第1的位置,然后把明文中第49个元素放到第2的位置,以此类推。
之后将换位后的输出分为两部分L0和R0,L0是输出的左32位,R0 是右32位。
intDES_IP_Transform(char data[64]){intcnt;char temp[64];for(cnt = 0; cnt< 64; cnt++){temp[cnt] = data[IP_Table[cnt]];}memcpy(data,temp,64);return 0;}之后加密函数,将R0通过位选择函数E置换,把本身是32位的R0扩充成48位,与生成的48位子密钥对应,按位运算。
intE_Table[48] = {31, 0, 1, 2, 3, 4,3, 4, 5, 6, 7, 8,7, 8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31, 0};intDES_E_Transform(char data[48]){intcnt;char temp[48];for(cnt = 0; cnt< 48; cnt++){temp[cnt] = data[E_Table[cnt]];}memcpy(data,temp,48);return 0;}然后,将扩充完的R0和子密钥K1进行模2加运算,得到48位的一个串,把这个串从左到右分为8组,每组6个字符。
DES算法实现课程设计

增加密钥长度:提高密钥长度可以增加破解难度,提高安全性
采用多轮加密:多轮加密可以提高安全性,防止攻击者破解
采用随机数生成器:随机数生成器可以提高安全性,防止攻击者预测密钥
采用分组密码:分组密码可以减少密钥长度,提高安全性
C语言具有高效的执行效率,适合实现高性能的加密算法
添加标题
添加标题
添加标题
添加标题
初始置换:将明文进行初始置换,得到初始置换后的明文
输入明文:将明文转换为二进制数据
16轮迭代:对初始置换后的明文进行16轮迭代,每轮迭代包括选择、扩展、置换和异或操作
输出密文:将迭代后的明文进行输出置换,得到密文
安全性高:采用分组密码体制,密钥长度可变,加密速度快
初始置换使用56个置换盒,每个置换盒有4行和16列
每个置换盒中的元素按照一定的规则进行排列,形成初始置换表
初始置换的目的是为了增加明文的复杂度,提高加密的安全性
初始化密钥:生成64位密钥
初始置换:将64位密钥转换为56位密钥
16轮迭代:每轮进行一轮加密操作
逆初始置换:将56位密钥转换为64位密钥
输出加密结果:得到加密后的数据
扩展:将输入数据扩展为48位
安全性改进:3DES算法通过增加密钥长度提高安全性
加密强度:56位密钥,理论上可以抵抗暴力破解
安全性分析:存在弱密钥和半弱密钥问题,可能导致破解
安全性评估:在现代计算能力下,DES算法的安全性已经降低
数据加密:DES算法广泛应用于数据加密,如电子邮件、文件传输等。
身份验证:DES算法可以用于身份验证,如登录密码、数字签名等。
Python的语法简洁明了,易于理解和实现
计算机网络安全基础-第三次实验-DES算法

毕节学院实验报告实验名称:DES算法实验报告序号:1第1页组别全班姓名王敏同组实验者个人实验项目DES算法实验日期2014年 5 月16日√1、验证性实验或基础性实验2、综合性实验实验类别3、设计性实验4、创新性实验和研究性实验教师评语实验成绩指导教师(签名)年月日一、实验目的:1、理解对称加密算法的原理和特点2、理解DES算法的加密原理二、实验环境:Windows操作系统计算机 VC++6.0 密码工具三、实验内容:在虚拟机上使用密码工具完成对称加密DES算法。
四、实验步骤:1、DES加密解密(1)、双击桌面上的虚拟机软件打开。
(2)、首先使用“快照X”恢复windows系统环境。
(3)、在本机中进入“密码工具”|“加密解密”|“DES加密算法”|“加密|解密”页签,在“明文输入区”输入明文:where are you?(4)、在密钥窗口输入8位(64位)个字符的密钥K,密钥K=abcdefgh,单击“加密”按钮。
实验名称:DES算法实验报告序号:1第1页将出现如下图:(5)、将密文导出到DES文件夹(D:\work\Encryption\DES\)中,通告同组主机获取密文,并将密钥K告诉同组主机。
如下图:(6)、单击“导入”按钮,从同组主机的DES共享文件集中将密文导入,然后在密钥窗口输入被同组主机通告的密钥K,点击“解密”实验名称:DES算法实验报告序号:1第1页按钮进行DES解密。
(7)、将破解后的明文与同组主机记录的明文比较,完全一致,解密成功。
2、DES算法(1)、进入到“演示”页签,向64位明文中输入8个字符,向64位密钥中输入8个字符,点击“加密”按钮,完成加密过程,分别点击“初始置换”、“密钥生成演示”等等,查看它们的详细加密操作流程。
如下图:3、源码应用设计DES加密工具,利用DES加密算法对文件进行加密:单击工具栏“VC6”按钮,启动VC++6.0,选择“Eile”\open workspace......”加载工程文件:“C:\ExpNIS\Encrypt-Lab\projects\DES\DES.dsw”,实验名称:DES算法实验报告序号:1第1页基于此工程进行程序设计。
DES加密算法实验报告

DES加密算法实验报告DES( Data Encryption Standard)算法是一种对称加密算法,是现代密码学的基础。
DES算法将64位明文数据分为两个32位的部分,将两部分通过一系列复杂的运算和替换操作,最终输出64位的密文。
DES算法的加密过程主要包括初始置换、16轮Feistel网络、逆初始置换等步骤。
首先是初始置换,将明文数据进行位重排列,使得加密的效果更加均匀。
然后是16轮Feistel网络的操作,每一轮都包括密钥的生成和密钥的运算。
密钥的生成过程是将64位的密钥进行重排列和选择运算,生成每一轮所需要的子密钥。
密钥的运算过程是将子密钥与32位明文数据进行异或操作,然后再通过一系列的替换和置换运算,得到新的32位数据。
最后是逆初始置换,将加密后的数据进行反向重排列,得到最终的64位密文数据。
实验中,对于给定的明文和密钥,我们首先需要将明文和密钥转换成二进制形式。
然后根据初始置换表和选择运算表,将明文和密钥进行重排列。
接下来进入16轮Feistel网络的循环中,每一轮都按照密钥的生成和运算过程进行操作。
最后通过逆初始置换表,将加密后的数据进行反向重排列,得到最终的密文。
DES算法的优点是运算速度较快,加密强度较高,安全可靠,广泛应用于网络通信和数据保密领域。
但DES算法也存在一些缺点,主要是密钥长度较短,为56位,容易受到暴力破解攻击;DES算法的设计和实现已经有一定历史了,现在已经有更安全和更高效的算法可供选择。
在实验中,我使用Python语言编写了DES算法的加密程序,在给定的明文和密钥下进行了测试。
实验结果表明,DES算法可以成功加密数据,并且在解密过程中能够准确还原原始数据。
总结来说,DES加密算法是一种经典的对称加密算法,通过初始置换、Feistel网络和逆初始置换等步骤,可以将明文数据加密成密文数据。
DES算法在保证加密强度和运算速度的同时,也有一些缺点需要注意。
因此,在实际应用中需要根据具体的需求和安全要求选择合适的加密算法。
现代密码学——DES算法(实验报告)

课程名称现代密码学实验实验项目名称 DES算法【实验目的】1.理解对称加密算法的原理和特点。
2.理解DES算法的加密原理。
【实验环境】1.实验人数:每组2人2.系统环境:Windows3.网络环境:交换网络结构4.实验工具:VC++6.0、密码工具【实验原理】一.对称密钥加密机制对称密钥加密机制即对称密码体系,也称为单钥密码体系和传统密码体系。
对称密码体系通常分为两大类,一类是分组密码(如DES、AES算法),另一类是序列密码(如RC4算法)。
对称密码体系加密和解密时所用的密钥是相同的或者是类似的,即由加密密钥可以很容易地推导出解密密钥,反之亦然。
同时在一个密码系统中,我们不能假定加密算法和解密算法是保密的,因此密钥必须保密。
发送信息的通道往往是不可靠的或者不安全的,所以在对称密码系统中,必须用不同于发送信息的另外一个安全信道来发送密钥。
图1描述了对称密码(传统密码)系统原理框架,其中M表示明文;C表示密文;E表示加密算法;D表示解密算法;K表示密钥;I表示密码分析员进行密码分析时掌握的相关信息;B表示密码分析员对明文M的分析和猜测。
图1 传统密码系统原理框架图对称密码体系的优点:●加密效率高,硬件实现可达每秒数百兆字节(软件实现略慢一些)。
●密钥相对比较短。
●可以用来构造各种密码机制。
●可以用来建造安全性更强的密码。
对称密码体系的缺点:●通信双方都要保持密钥的秘密性。
●在大型网络中,每个人需持有许多密钥。
●为了安全,需要经常更换密钥。
二.DES加密算法简介1973年5月15日,美国国家标准局在联邦注册报上发表一则启事,公开征集用来保护传输和静止存储的计算机数据的密码算法,这一举措最终导致了数据加密标准DES的出现。
DES采用分组乘积密码体制,它是由IBM开发的,是对早期Lucifer密码体制的改进。
DES 在1975年3月17日首次在联邦记录中公布,而且声明对此算法征求意见。
到1977年2月15日拟议中的DES被采纳为“非密级”应用的一个联邦标准。
des加密算法实验报告

des加密算法实验报告《des加密算法实验报告》摘要:本实验旨在研究和分析数据加密标准(Data Encryption Standard,DES)算法的原理和应用。
通过对DES算法的实验操作和结果分析,验证其在数据加密和解密过程中的可靠性和安全性。
一、实验目的1. 了解DES算法的基本原理和加密过程;2. 掌握DES算法的密钥生成和加密解密操作;3. 分析DES算法在数据加密中的应用和安全性。
二、实验原理DES算法是一种对称密钥加密算法,采用64位的明文和56位的密钥进行加密操作。
其基本加密过程包括初始置换、16轮的Feistel网络运算和最终置换。
在解密过程中,使用相同的密钥和逆向的Feistel网络运算来实现明文的恢复。
三、实验步骤1. 生成64位的明文和56位的密钥;2. 进行初始置换和16轮的Feistel网络运算;3. 进行最终置换并得到密文;4. 使用相同的密钥进行解密操作,恢复明文。
四、实验结果分析1. 经过实验操作,得到了正确的密文,并成功进行了解密操作;2. 分析了DES算法在数据加密中的安全性和可靠性,验证了其在信息安全领域的重要性和应用价值。
五、结论DES算法作为一种经典的对称密钥加密算法,具有较高的安全性和可靠性,在信息安全领域有着广泛的应用。
本实验通过对DES算法的实验操作和结果分析,验证了其在数据加密和解密过程中的有效性和实用性,为信息安全技术的研究和应用提供了重要的参考和借鉴。
综上所述,本实验对DES加密算法进行了深入研究和分析,得出了相应的实验结果和结论,为信息安全领域的相关研究和应用提供了有益的参考和借鉴。
密码学案例实验报告

一、实验背景随着信息技术的飞速发展,网络安全问题日益突出,加密技术作为保障信息安全的重要手段,在各个领域都得到了广泛应用。
本实验报告旨在通过实际操作,加深对密码学原理和算法的理解,提高加密和解密的能力。
二、实验目的1. 了解密码学的基本概念和分类;2. 掌握DES、AES等常用加密算法的原理和流程;3. 能够运用密码学工具进行加密和解密操作;4. 分析密码破解技术,提高安全意识。
三、实验内容1. 实验一:DES加密算法(1)实验原理DES(Data Encryption Standard)是一种经典的对称加密算法,它采用64位密钥和64位明文,经过16轮加密操作,生成64位密文。
(2)实验步骤① 编写程序实现DES加密算法的加解密功能;② 使用密钥对一段英文文本进行加密和解密;③ 分析加密和解密结果,验证算法的正确性。
2. 实验二:AES加密算法(1)实验原理AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它支持128位、192位和256位密钥长度,具有速度快、安全性高等优点。
(2)实验步骤① 编写程序实现AES加密算法的加解密功能;② 使用不同长度的密钥对一段英文文本进行加密和解密;③ 分析加密和解密结果,验证算法的正确性。
3. 实验三:密码破解技术(1)实验原理密码破解技术是指通过尝试各种可能的密钥,来破解加密信息的技术。
常见的密码破解方法有穷举攻击、字典攻击、暴力破解等。
(2)实验步骤① 使用密码破解工具对加密文本进行破解;② 分析破解结果,了解不同破解方法的特点和适用场景;③ 提高安全意识,防范密码破解攻击。
四、实验结果与分析1. 实验一和实验二的结果表明,DES和AES加密算法能够正确地对文本进行加密和解密,验证了算法的正确性。
2. 通过实验三,我们了解到密码破解技术的种类和特点,提高了安全意识。
在实际应用中,应选择合适的加密算法和密钥长度,以提高安全性。
DES加密算法的实现

实验课程:网络安全实验项目:DES加密算法的实现实验日期:系:数学与计算机学院班级:网络工程姓名:学号:指导教师:成绩:【实验目的】掌握DES加密算法的基本原理使用编程语言实现DES的加密和解密【实验环境】Windows 系统Java编程环境或者VC++编程环境【实验内容和步骤】第一步:变换明文。
对给定的64位比特的明文x,首先通过一个置换IP表来重新排列x,从而构造出64位比特的x0,x0=IP(x)=L0R0,其中L0表示x0的前32比特,R0表示x0的后32位。
第二步:按照规则迭代。
规则为Li = Ri-1Ri = Li⊕f(Ri-1,Ki) (i=1,2,3…16)经过第一步变换已经得到L0和R0的值,其中符号⊕表示的数学运算是异或,f表示一种置换,由S盒置换构成,Ki是一些由密钥编排函数产生的比特块。
f和Ki将在后面介绍。
第三步:对L16R16利用IP-1作逆置换,就得到了密文y。
代码如下:输入64位比特明文IP置换表LRLi= Ri-1Ri= Li⊕f(Ri-1,Ki)(i=1,2,…16)迭代16次IP逆置换表输出64位比特密文#include "stdio.h"#include "string.h"#define uchar unsigned char/***************明文转换声明部分**************///IP1置换表int IP_1[64]={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};//IP2逆置换表int IP_2[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};//E扩展置换表int E_case[48]={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};//S盒压缩int S1[4][16]={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};int S2[4][16]={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};int S3[4][16]={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}; int S4[4][16]={ 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}; int S5[4][16]={ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,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}; int S6[4][16]={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}; int S7[4][16]={ 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}; int S8[4][16]={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}; //P盒置换int Permute[32]={ 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};/************字节与二进制相互变换部分******************///字节转换成二进制int ByteToBit(char ch,char bit[8]){uchar x;for(x=0;x<8;x++){*(bit+x)=((ch<<x)&0x80)>>7;}return 0;}//字符串转换成二进制位串int Char8ToBit64(char ch[8],char bit[64]){uchar x;for(x=0;x<8;x++){ByteToBit(*(ch+x),bit+(x<<3));}return 0;}//二进制转换成字节int BitToByte(char bit[8],char *ch){uchar x;for(x=0;x<8;x++){*ch|=*(bit+x)<<(7-x);}return 0;}//将二进制串转换成字符串int Bit64ToChar8(char bit[64],char ch[8]){uchar x;memset(ch,0,8); //把ch[8]全部清零。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
//逆初始置换ip
InitReSwap(bdecipher);
//转成字符
Bit2Char(bdecipher, decipher);
};
四、
【开发环境】
Microsoft Visual Studio 2015
Microsoft Windows 10
}
};
//
voidDES::SubKeyOff(bool*_subkey,int_off)
{
booltemp;
for(inti = 0; i <_off; i++)
{
temp =_subkey[0];
for(inti = 0; i < 27; i++)
{
_subkey[i] =_subkey[i + 1];
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,
3.DES算法的解密过程是一样的,区别仅仅在於第一次迭代时用子密钥K15,第二次K14、......,最后一次用K0,算法本身并没有变化。
//16个子密钥
boolsubkey[16][48];
//l0 r0中间变量
boolrmsgi[32], lmsgi[32];//第i个
boolrmsgi1[32], lmsgi1[32];//第i+1个
//密文
boolbcryptedmsg[64];
charcryptedmsg[8];
//解密的结果
【算法流程图】
【功能模块】
1.输入明文:
voidDES::SetMsg(char*_msg,int_length)
{
if(_length>8)
{
return;
}
for(inti = 0; i <_length; i++)
{
msg[i] =_msg[i];
}
//转换成二进制
Char2Bit(msg, bmsg, 8);
voidDES::InitSwap(boolin[64])
{
//打乱
for(inti = 0; i < 32; i++)
{
lmsgi[i] =in[ip[i] - 1];
rmsgi[i] =in[ip[i + 32] - 1];
}
};
//
//初始逆置换函数
voidDES::InitReSwap(boolout[64])
19,11,3,60,52,44,36
};
constintDES::d0[28] = {
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,
private:
//字符转成二进制,并保存到64位bool数组中
voidChar2Bit(char* _carray,bool* _barray,intlength);
////二进制转成字符
//void Bit2Char(bool* _barray,char* _carray);//length=64
//置换运算p
POperation(temp3,out);
};
6.解密函数:
voidDES::Decipher()
{
booltemp1[32], temp2[32];
//初始置换ip
InitSwap(bcryptedmsg);
//16轮迭代加密
for(inti = 0; i < 16; i++)
{
if(i % 2 == 0)
{
//组合成64数组
booltemp[64];
for(inti = 0; i < 32; i++)
{
temp[i] = rmsgi[i];
temp[32 + i] = lmsgi[i];
}
//按照逆ip矩阵
for(inti = 0; i < 64; i++)
{
out[i] = temp[back_ip[i] - 1];
//总的的加密流程
voidCrypte();
//解密
voidDecipher();
//输出密文
voidOutPutCryptedMsg();
//二进制转成字符
voidBit2Char(bool* _barray,char* _carray);//length=64
//输出解密后的明文
voidOutPutDecipher();
//置换选择2
conststaticintdi[48];
//加密函数
//e运算
conststaticinte_operate[48];
//sbox
conststaticintsbox[8][64];
//置换运算p
conststaticintp_operate[32];
//逆初始置换ip
conststaticintback_ip[64];
{
//e操作
booltemp1[48];
EOperation(in, temp1);
booltemp2[48];
Mode2Add(temp1, (bool*)subkey[isubkey], temp2, 48);//ok
//盒子压缩
booltemp3[48];
DealSBox(temp2, temp3);
{
_in[j] =in[i * 6 + j];
}
//压缩
_DealSBox(_in, _out, i);
//放进out数组
for(intjj = 0; jj < 4; jj++)
{
out[i * 4 + jj] = _out[jj];
}
}
};
5.加密函数:
voidDES::CrypteFunction(boolin[32],intisubkey,boolout[32])
{
//L1=R0
CopyArray(rmsgi, lmsgi1, 32);
//f(R0,k0)
CrypteFunction(rmsgi, 15 - i, temp1);
//L0+f(R0,k0)
Mode2Add(lmsgi, temp1, temp2, 32);
//R1=L0+f(R0,k0)
CopyArray(temp2, rmsgi1, 32);
};
2.输入密钥:
voidDES::SetKey(char*_key,int_length)
{
if(_length>8)
{
return;
}
for(inti = 0; i <_length; i++)
{
key[i] =_key[i];
}
//转成二进制
Char2Bit(key, bkey, 8);
};
3.各种置换:
//初始置换
voidInitSwap(boolin[64]);
//初始逆置换
voidInitReSwap(boolout[64]);
//循环左移
voidSubKeyOff(bool* _subkey,int_off);
//e运算操作函数
voidEOperation(boola[32],boolb[48]);
boolbdecipher[64];
chardecipher[8];
private:
//静态常量
//不允许在类内初始化
//初始值换ip
conststaticintip[64];
//子密钥
//置换选择1
conststaticintc0[28];
conststaticintd0[28];
//循环左移表
conststaticintkeyoff[16];
//位掩码
conststaticcharbitmask[8];
public:
//设置明文和密钥
//_length要小于或等于8
voidSetMsg(char* _msg,int_length);
voidSetKey(char* _msg,int_length);
//生产子密钥
voidProduceSubKey();
}
else
{
//L2=R1
CopyArray(rmsgi1, lmsgi, 32);
//f(R1,k1)
CrypteFunction(rmsgi1, 15 - i, temp1);
//L1+f(R1,k1)
Mode2Add(lmsgi1, temp1, temp2, 32);
//R2=L1+f(R1,k1)
//模2相加
//相同为0不同为1
voidMode2Add(boola[],boolb[],boolc[],intlength);