版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息安全概论课程设计 DES加密的C语言实现学院:计算机科学与技术班级:网络工程06-1班姓名:吴志媛学号:3指导老师:刘琨目录摘要3Abstract3关键词31算法描述41.1加/解密算法的一般原理41.2加/解密机制的应用52S盒设计53DES程序实例与分析64DES实例运行结果165结语176.参考文献17DES加密的C语言实现C language achieve DES algorithm摘要DES算法是一种数据加密算法,自从1977年公布以来,一直是国际上的商用保密通信和计算机通信的最常用的加密标准。DES算法的实现一般用高级语言,DES作为美国国家标准研究所(American Na
2、tional Standard Institute,ANSI)的数据加密算法(Data Encryption Algorithm,DEA)和ISO的DEA 1,成为一个世界范围内的标准已经二十多年。尽管他带有过去时代的特征,但他很好地经受住了多年的密码分析 ,除了可能的最强有力的对手外,对其他的攻击具有较好的安全性。Abstract DES algorithm is a data encryption algorithm,Since the publication in 1977, it has been the international commercial confidentiality
3、 of communications and computer communications of the most commonly used encryption standard。DES algorithm with the general high-level language,DES American National Standards Institute as a data encryption algorithm of the ISO and the DEA 1, a worldwide standard has been more than two decades. Desp
4、ite his past with the characteristics of the times, but he stood a good many years of cryptanalysis, in addition to probably the most powerful opponent, other attacks have better security.关键词:加密算法 DES 1算法描述DES是一种分组加密算法,它以64位为分组对数据加密。64位一组的明文从算法的一端 输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法(除密钥编排不同以外)。
5、密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。密钥可以是任意的56位数,且可以在任意的时候改变。DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步: (1)初始置换 其功
6、能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长3 2位,其置换规则为将输入的第58位换到第一位,第50位换到第2位依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3D64,则经过初始置换后的结果为:L0=D58D50D8;R0=D57D49D7。 (2)逆置换 经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。1.1加/解密算法的一般原理密码体制从原理上可分为2大类,即单钥密码体制和双钥密码体制。 单钥密码
7、体制是指信息的发送方和接受方共享一把钥匙。在现代网络通信条件下,该 体制的一个关键问题是如何将密钥安全可靠地分配给通信的对方,并进行密钥管理。因此单钥密码体制在实际应用中除了要设计出满足安全性要求的加密算法外,还必须解决好密码的 产生、分配、传输、存储和销毁等多方面问题。单钥密码可分为古典密码、流密码和分组密 码,DES就属于分组密码中的一种。双钥密码体制又称公钥密码体制,其最大特点是采用2个密钥将加密、解密分开。在 双钥体制下,每个用户都拥有2把密钥,个公开,一个自己专用。当使用用户专用密钥加 密,而用该用户公开密钥解密时,则可实现一个被加密的消息能被多个用户解读;当使用 用户公开密钥加密,
8、而用该用户专用密钥解密时,则可实现传输的信息只被一个用户解读。 前者常被用于数字签名,后者常被用于保密通信。 1.2加/解密机制的应用在信息安全领域中,凡涉及到数据通信均采用加/解密机制。而目前日益发展的电子商 务正是充分展示加/解密机制的一个十分重要的领域。 在电子商务中,订单的保密性需用加密技术来处理,而订单的可靠性、时间性则需用 数字签名技术,有时还需双重签名。例如,刘先生要买张小姐的一处房产,他发给张小姐一 个购买报价单及他对银行的授权书的消息,如果张小姐同意按此价格出卖,则要求银行将钱 划到张小姐的帐上。但刘先生不想让银行看到报价,也不想让张小姐看到他的银行帐号信息 。此外,报价和付
9、款是相连的、不可分割的,仅当张小姐同意他的报价后,钱才会转移,要达到这个要求,采用双重签名即可实现。 2S盒设计通过时间分析发现,S盒在整个设计中占了很大的比重。S盒性能的提高对于整个设计性能会有很大的改善,因此S盒是整个设计优化的重点。DES的8个S盒分别是一个满足特殊性能的64位的变换。这是最简单的实现方法,但是HDL语言都属于高级语言,它们强烈依赖于编译器的优化能力,往往对设计者来说,涉及得越少、编程越简单,代码效率越不高,这对于高速实现来说是不可取的。S盒成了速度的瓶颈,为此,采用ROM来实现。XC2S100的LUT可以配置为161位的ROM,把输入的6位作为地址,对应的地址空间里存放
10、的就是输出的4位,从而实现了64位的查找表LUT,所需时间只是FPGA中CLB的传输时间加上传输线上的延时,如图1所示。3DES程序实例与分析在本次设计中,具体讲解DES加密和解密程序,并在程序中详细对程序进行了分析, 以下是DES加密和解密程序设计的详细过程以及分析说明。/*源文件:DES.cpp*/*本程序为本人实验程序*/#include #include #include / 初始置换表const static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 4
11、6, 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;上面程序主要定义了初始置换表IP_Table。初始置换在第一轮运算之前执行。将常量IP_Table看作是一个表结构。此表应该从左向右读。例如,初始置换把明文的第58位换到第1位的位置,把第50位换到第2位的位置,把第42位换到第3位的位置。/ 逆初始置
12、换表const static char IPR_Table64 = 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;上面程序主要定义了逆初始置换表IPR_Tab
13、le。逆初始置换是初始置换的逆过程。注意,DES在最后一轮后,左半部分和右半部分并未交换,而是R16和L16并在一起形成一个分组作为逆初始置换的输入。其实交换左右两部分并循环移动,仍将获得完全相同的结果。但这样做,能使该算法既能用作加密,又能用作解密。/ 扩展置换表static const char Extension_Table48 = 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,
14、24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1;上面程序主要定义了扩展置换表Extension_Table。扩展置换将数据的右半部分Ri从32bit扩展到了48bit,这个操作改变了位的次序,重复了某些位。这样做有两个方面的目的:一是产生了与密钥同长度的数据一进行异或运算:二是提供了更长的结果,使得在替代运算时能进行压缩。/ P盒置换表const static char P_Table32 = 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,2, 8, 24, 14, 32, 2
15、7, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25;上面程序主要定义了P盒置换表P_Table。P盒替代运算后的32bit输出依照P盒进行置换。该置换把每个输入位映射到输出位,任一位不能被映射两次,也不能省去。P盒置换表就给了每位移至的位置。例如,第21位移到了第4位处,同时第4位移到了第31位处。./ 密钥置换表 const static char PCK_Table56 = 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
16、, 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 PCC_Table48 = 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,
17、56, 34, 53, 46, 42, 50, 36, 29, 32;/ 每轮移动的位数 const static char LOOP_Table16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;上面程序主要定义了密钥置换表PCK_Table,每轮移动的位数表LOOP_Table和压缩置换表PCC_Table。由于开始时不考虑每个字节的第8位,因此DES的密钥由64bit减至56bit,如密钥置换表所示。每个字节第8位可作为奇校验以确保密钥不发生错误。在DES的每一轮中,从56bit密钥产生不同的48bit子密钥。子密钥产生过程是:首先,56bit密钥被分为两部分,每部
18、分28bit。然后根据轮数,这两部分分别循环左移1位或2位。LOOP_Table给出了每轮移动了的位数。移动后,就从56bit中选出58bit。因为这个运算不仅置换看了每位的顺序,同时也选择子密钥,所以被称为压缩置换。表PCC_Table提供了一组48bit的集,定义了压缩置换方式。例如,处在第33位位置的那一位在输出时移动了第35位的位置,而在第18位位置的那一位被省去了。/ S盒设计const static char S_Box8416 = / S盒1 14,4,13,1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 15, 7, 4, 14, 2,
19、 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,/ S盒2 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,
20、 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,/ S盒3 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,/ S盒4 7, 13, 14, 3,
21、 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,/ S盒5 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,
22、 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,/ S盒6 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,
23、 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,/ S盒7 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,/ S盒8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9
24、, 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;上面的程序主要定了s盒S-BOX.每个S盒是一个4行,16列的表。盒中是一个4bit 的数,S盒中的6个输入确定了其对应的输出在哪行哪列。typedef bool (*PSubKey)1648;enum ENCRYPT,DECRYPT
25、;static bool SubKey21648;/ 16圈子密钥static bool Is3DES;/ 3次DES标志static char Tmp256, deskey16;static void DES(char Out8, char In8, const PSubKey pSubKey, bool Type);/标准DES加/解密static void SetKey(const char* Key, int len);/ 设置密钥static void SetSubKey(PSubKey pSubKey, const char Key8);/ 设置子密钥static void F_f
26、unc(bool In32, const bool Ki48);/ f 函数static void S_func(bool Out32, const bool In48);/ 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 ByteToBi
27、t(bool *Out, const char *In, int bits);/ 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits);/ 位组转换成字节组/ TypeENCRYPT:加密,DECRYPT:解密/ 输出缓冲区(Out)的长度 = (datalen+7)/8)*8,即比datalen大的且是8的倍数的最小整数/ In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容/ 当keylen8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节bool DES
28、_Act(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);上面的函数主要声明了DES算法所需的函数。为了是读者有整体的理解,把这些函数罗列在次,下面具体讲解函数的实现。/ 字节转换函数void ByteToBit(bool *Out, const char *In, int bits) for(int i=0; i3(i&7) & 1;/ 比特转换函数void BitToByte(char *Out, const bool *In, int bits) memset(Out, 0,
29、bits3); for(int i=0; i3 |= Ini(i&7);上面的程序是实现字节组转换成位组和位组转换成字节组的功能函数。在大部分函数中都会使用这两个函数,因为转换后才能进行相应的算法操作。/ 变换函数void Transform(bool *Out, bool *In, const char *Table, int len) for(int i=0; ilen; +i) Tmpi = In Tablei-1 ; memcpy(Out, Tmp, len);/ 异或函数的实现void Xor(bool *InA, const bool *InB, int len) for(int
30、i=0; ilen; +i) InAi = InBi;/ 循环左移函数void RotateL(bool *In, int len, int loop) memcpy(Tmp, In, loop); memcpy(In, In+loop, len-loop); memcpy(In+len-loop, Tmp, loop);上面的程序实现了变换函数,异或函数,循环左移函数。变换函数Transform功能是实现各个表中的位置变换,以实现打乱顺序的作用。异或函数Xor的主要功能是将两个数组InA和InB进行异或运算,结果输出在数组InA中。循环左移函数Rotatel功能是输入的数组进行移位,参数In
31、是输入的数组,参数loop是移位的位数,参数len是移位的长度。/ S函数的实现void S_func(bool Out32, const bool In48) for(char i=0,j,k; i8; +i,In+=6,Out+=4) j = (In01) + In5; k = (In13) + (In22) + (In31) + In4;ByteToBit(Out, &S_Boxijk, 4); / F函数的实现void F_func(bool In32, const bool Ki48) static bool MR48; Transform(MR, In, Extension_Tab
32、le, 48); Xor(MR, Ki, 48); S_func(In, MR); Transform(In, In, P_Table, 32);上面的程序主要实现了S盒替换函数和F函数。S盒替换函数功能是根据S盒的设计将48bit的输入变为32bit的输出。参数In是输入的48bit数组,参数Out是输出的32bit数组。F函数是整个DES加密算法中最重要的部分。参数In是32bit的输入,参数Ki是由初始密钥导出的第i轮子密钥,F函数输出的32bit存在于In数组中。次函数的实现过程为,首先经过一个扩展运算,然后进行S盒替换,再进行P盒置换。其中,扩展运算和P盒置换的主要作用是增加算法的扩
33、展效果。/ 设置子密钥void SetSubKey(PSubKey pSubKey, const char Key8) static bool K64, *KL=&K0, *KR=&K28; ByteToBit(K, Key, 64); /转换格式 Transform(K, K, PCK_Table, 56); / 由56位密钥产生48位子密钥 for(int i=0; i16?16:len);SetSubKey(&SubKey0, &deskey0);Is3DES = len8 ? (SetSubKey(&SubKey1, &deskey8), true) : false;上面的程序主要实现
34、了设置子密钥函数和设置密钥函数。设置子密钥函数SetSubKey实现流程是:首先调用Transform函数根据密钥置换表将DES的密钥由64bit减至56bit,然后将56bit密钥分成两部分,每部分28bit。然后,根据轮数表,调用RotateL函数分别将两部分密钥循环左移1位或2位。最后根据压缩置换进行变换位置和选择子密钥。设置密钥函数SetKey功能是判断输入的密钥是否大于16bit,如果大于16bit,则采用取3次DES加密。/ DES加解密函数void DES(char Out8, char In8, const PSubKey pSubKey, bool Type) static
35、bool M64, tmp32, *Li=&M0, *Ri=&M32; ByteToBit(M, In, 64); Transform(M, M, IP_Table, 64); if( Type = ENCRYPT ) for(int i=0; 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);上面程序实现了DES加解密函数的功能函数。程序流程是:首先调
36、用Transform函数根据初始表进行位置变换。然后开始16轮的循环运算,每轮循环中,调用F函数进行加密或者解密。最后调用Transform根据逆初始置换进行位置变换,再进行组到字节组对的转换,输出的就是密文或者解密文了。/ DES加解密函数(可以对长明文分段加密)bool DES_Act(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=datalen3; i3; ij; +i,Out+=8,In+=8) DES(Out, In, &SubKey0, Type);DES(Out, Out, &SubKey1, !Type);DES(Out, Out, &SubKey0, Type);return true;上面的函数主要功能是调用DES函数对输入的明文进行加密操作。参数Out是输出的数组,参数In是输入的数组,参数da
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论