DES加密课程设计_第1页
DES加密课程设计_第2页
DES加密课程设计_第3页
DES加密课程设计_第4页
DES加密课程设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 信息安全课程设计方案 题 目: DES密码体系的数据加密解密实现 专 业: 姓 名: 学 号: 指导教师: 2014年 7月 8 日一、DES的背景和意义11.DES的背景12.DES的工作模式1二、DES算法的原理21DES的基本结构22.初始置换33. 每轮变换的详细过程44.密钥的产生7三、源程序8四、程序运行结果15五、总结15六、参考文献15一、DES的背景和意义1.DES的背景DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。在过去近20年的时间里,DES被广泛应用于美国联邦和各种商业信息

2、的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。加密算法要达到的目的通常称

3、为DES密码算法要求主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益;便于理解和掌握DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础实现经济,运行有效,并且适用于多种完全不同的应用。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。2.DES的工作模式 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Dat

4、a进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流

5、行做法。二、DES算法的原理1DES的基本结构DES算法是对称加密算法,加密时需要有两个输入:明文和密钥。明文的长度为64位,密钥的长度为64位(64密钥中只有56位是有效的,其他为校验位)。图1.1 DES算法流程示意图上图1.1中表明了DES加密算法的整个加密机制。图中可以看出,DES算法的明文处理共分了3个部分:首先,64位明文经过初始值换(IP)矩阵改变排列顺序,然后与右边产生的子密钥进行16轮迭代运算,对明文进行了置换和替代。16轮迭代运算结束后的结果对其左右两部分进行对换,产生一个预输出。最后对预输出的结果进行初始逆置换(IP-1)产生64位密文。图1.1中,右半部分是产生每轮迭代

6、所需的子密钥的方法,首先是64位密钥经过置换选择1,长度变为56位,然后每轮都进行循环左移并通过置换选择2产生一个48位的子密钥。图1.2 DES详细算法示意图上图1.2,更加详尽的给出了DES算法的实现细节,下面来对DES算法分步来进行分析。2.初始置换表2.1和表2.2分别给出了初始置换和初始逆置换。每个表中共有64个位子,对应了64位的数据,表中定义的是每一位的数据具体被哪一位的数据所置换。5850423426181026052443628201246254463830221466456484032241685749413325179159514335271911361534537292

7、1135635547393123157表2.1初始置换表40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725表2.2初始逆置换表3. 每轮变换的详细过程图3.1 单轮算法示意图将图1.2中中间部分抽取出来就得到了图3.1,其中可以看到每轮运算的细节实现。 64位的明文被分成了左右两个32位的明文块L和R。过程可以用公式简单的表达为: Li+1 = Ri Ri+1 = LiF(Ri,Ki+1)图3.2 S盒示意图

8、 上图3.2是具体F函数的操作细节:对右边的明文块R使用E(表3.3)扩展置换为48位,再与48位的子密钥进行异或,得到的结果再通过S盒还原为32位的数据,最后通过置换函数P(表3.4)得到F函数的输出。3212345456789891011121312131415161716171819202120212223242524252627282928293031321 表3.3(E扩展置换)167202191228171152326518311028241432273919133062211425 表3.4(P置换函数)如果仔细观察一下扩展置换矩阵E(表3.3)就会发现,他的作用其实是将32位数

9、据块分成4位4位的8份,然后每组与前后两组的末尾和开头组成6位,形成新的一行。例如有下面这么一些数据:asdf qwer zxcv qwer 扩展置换后变为 Rasdfq fqwerz rzxcvq vqwera在进行S盒变换的时候,每6位一组的外面2位代表着每个小S盒中4种可能中的一种,中间4位代表了这一行中具体选择哪一位来输出。8个S盒的32位输出经过置换,使得每个S盒的输出在下一轮中尽可能的影响更多的其他数据位 S1144131215118310612590701574142131106121195384114813621115129731050151282491751131410061

10、3S21518146113497213120510313471528141201106911501471110413158126932151381013154211671205149S31009146315511312711428137093461028514121115113649815301112125101471101306987415143115212S47131430691012851112415138115615034721211014910690121171315131452843150610113894511127214S5212417101168531513014914112

11、1247131501510398642111101378159125630141181271142136150910453S61211015926801334147511101542712956113140113891415528123704101131164321295151011141760813S74112141508133129751061130117491101435122158614111312371410156805926111381410795015142312S8132846151111093145012711513810374125611014927114191214206

12、1013153582114741081315129035611 表3.5(s盒)4.密钥的产生下图1.2.5中指出的子密钥的产生过程,可以看出:输入的初始密钥为64位的,但是其实真正使用的只有其中的56位被使用了,将64位划分成一个8X8矩阵,每行的第八位都是被舍去的,第8位是校验位。得到的56位密钥首先要经过置换选择1处理,之后每轮产生子密钥时56位密钥被分为左右28位,每次各自进行循环左移(或旋转)1位到2位,移位后的值作为下一轮的输入。同时对它们使用置换选择2,得到本轮的一个子密钥。图4.1 密钥产生示意图57494133251791585042342618102595143352719

13、113605244366355473931331576254463830221466153453729211352820124表4.2(PC-1表)1417112415328156211023191242681672720132415231374755304051453348444939563453464250362932表4.3(PC-2表)三、源程序1.头文件:DES.h设计方法:类的共有接口只设计一个,即加密解密函数,用一个bool参数区分是加密还是解密。其他像读文件,写文件,加密变换函数等等设置为私有涉及内容:文件操作,STL向量,数制变换,位操作及函数设计等等。代码:/ DES.h:

14、 interface for the DES class./#if !defined(AFX_DES_H_754699B6_9986_42CE_90B2_0DBFACEA51CD_INCLUDED_)#define AFX_DES_H_754699B6_9986_42CE_90B2_0DBFACEA51CD_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include #include #include #include #include #include using namespace std;/*/*/* DES类

15、声明 */class DESpublic:DES();/*构造函数*/void encrypt(bool flag = true);/*加解密函数*/private:string plaintextFilePath_;/*明文文件路径*/string ciphertextFilePath_;/*密文文件路径*/string keyFilename_;/*密钥文件路径*/string plaintext_;/*明文存储*/string ciphertext_;/*密文存储*/string key_;/*密钥存储*/vectorvector subkey_;/*子密钥存储*/void getsub

16、key_();/*计算子密钥*/void setPlaintextFilePath_();/*设置明文路径*/void setCiphertextFilePath_();/*设置密文路径*/void setKeyFilePath_();/*设置密钥路径*/string readData_(string filename);/*读取文件*/void saveData_(string filename,string data);/*保存文件*/vector string2bit_(string str); /*string类型转为ASCII二进制数*/string bit2string_(vect

17、or v);/*ASCII二进制数转为string类型*/vector int2bit_(vector vecInt);/*整形数0-15化为二进制*/vector vecXor_(vector vL, vector vR);/*向量异或*/vector leftIterMove_(vector movVec,int loopStep);/*数据左移loopStep位*/vector vecReplace_(vector v,const unsigned int vArray);/*向量数据按vArray中数据重排序*/vector vecMerge_(vector vL, vector vR

18、);/*合并两个向量*/vector f_(vector vecR, vector vecKey);/*f函数*/vector S_(vector vecRKey);/*S盒函数*/ /*/* 变换矩阵 */ static const unsigned int PC_1_56;static const unsigned int PC_2_48;static const unsigned int LOOP_16;static const unsigned int IP_64;static const unsigned int IPR_64;static const unsigned int SB

19、OX_8416;static const unsigned int E_48;static const unsigned int P_32;/*/;#endif / !defined(AFX_DES_H_754699B6_9986_42CE_90B2_0DBFACEA51CD_INCLUDED_)2. DES加密代码/ DES.cpp: implementation of the DES class./#include DES.h/*/*/* 静态常量放在这里 */const unsigned int DES:IP_64 = 58, 50, 42, 34, 26, 18, 10, 2, 60,

20、 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 unsigned int DES:IPR_64 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 3

21、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;const unsigned int DES:PC_1_56 = /*注释的部分是对应64位带奇偶校验的*/*57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,10, 2, 5

22、9, 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*/50, 43, 36, 29, 22, 15, 8, 1, 51, 44, 37, 30, 23, 16,9, 2, 52, 45, 38, 31, 24, 17, 10, 3, 53, 46, 39, 32,56, 49, 42, 35, 28, 21, 14, 7, 55, 48, 41,

23、34, 27, 20,13, 6, 54, 47, 40, 33, 26, 19, 12, 5, 25, 18, 11, 4;const unsigned int DES:PC_2_48 = /*注释的部分是对应64位带奇偶校验的*/*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*/1

24、4, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,13, 24, 3, 9, 19, 27, 2, 12, 23, 17, 5, 20,16, 21, 11, 28, 6, 15, 18, 14, 12, 8, 1, 4;const unsigned int DES:LOOP_16 = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1;const unsigned int DES:SBOX_8416 = / S1 14, 4, 13

25、, 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,/ S2 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

26、, 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,/ S3 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,

27、 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,/ S4 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,/ S5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 1

28、3, 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,/ S6 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

29、, 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,/ S7 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

30、, 12,/ S8 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;const unsigned int DES:E_48 = 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11

31、, 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 unsigned int DES:P_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;/*/*/* DES类实现 */DES:DES():s

32、ubkey_(16,vector(48)/*构造函数*/void DES:encrypt(bool flag /* = true */)/*加密函数*/*读取文件*/vector textBit;if (flag) /*加密*/ setPlaintextFilePath_(); plaintext_ = readData_(plaintextFilePath_); textBit = string2bit_(plaintext_);/*不够64bit的整数,补0,如下*/ unsigned int zeroFill = (textBit.size()%64) ? (64 - textBit.s

33、ize()%64) : 0; for (unsigned int i = 0; i zeroFill; i+) textBit.push_back(0); else /*解密*/ setCiphertextFilePath_(); ciphertext_ = readData_(ciphertextFilePath_); textBit = string2bit_(ciphertext_);/*读取密钥文件*/getsubkey_();/*循环读取64bit加密*/unsigned int len = textBit.size();unsigned int count = 0;vector s

34、ecret;/*保存密文*/while ( count (len / 64) ) vector textBitTmp;int i; for (i= 64*count; i 64*count+64; i+) textBitTmp.push_back(textBiti); /*IP置换*/ vector textBitTmp_IP; textBitTmp_IP = vecReplace_(textBitTmp,IP_); /*划分L0和R0*/ vectorvector L(17,vector(32); vectorvector R(17,vector(32); for (i = 0; i 32;

35、 i+) L0i = textBitTmp_IPi; for (i = 0; i 32; i+) R0i = textBitTmp_IPi+32; /*迭代生成L1-L16,R1-R16*/ for (i = 1; i 17; i+) Li = Ri-1; if (flag) Ri = vecXor_(Li-1, f_(Ri-1,subkey_i-1); else Ri = vecXor_(Li-1, f_(Ri-1,subkey_16-i); vector RL = vecMerge_(R16,L16); for (i = 0; i 64; i+) secret.push_back(RLIP

36、R_i-1); count+;if (flag) ciphertext_ = bit2string_(secret); setCiphertextFilePath_(); saveData_(ciphertextFilePath_,ciphertext_);else plaintext_ = bit2string_(secret); setPlaintextFilePath_(); saveData_(plaintextFilePath_,plaintext_);void DES:setPlaintextFilePath_()/*设置明文路径*/string plaintextFilePath

37、;cout plaintextFilePath;plaintextFilePath_ = plaintextFilePath;void DES:setCiphertextFilePath_()/*设置密文路径*/string ciphertextFilePath;cout ciphertextFilePath;ciphertextFilePath_ = ciphertextFilePath;void DES:setKeyFilePath_()/*设置密钥路径*/string keyFilename;cout keyFilename;keyFilename_ = keyFilename;stri

38、ng DES:readData_(string filename)/*通用函数:读取文件内容到string中,包含空格和回车符等*/ifstream in;ostrstream os;in.open(filename.c_str(),ios:in);os in.rdbuf() ends;in.close();return os.str();void DES:saveData_(string filename,string data)/*通用函数:保存数据到文件中,包含空格和回车*/ofstream out(filename.c_str();out.write(data.c_str(),data

39、.size();out.close();vector DES:string2bit_(string str)/*string转为二进制*/vector v;for (unsigned int i = 0; i 0) v.push_back( (mask&stri) 0) ); mask = mask 1; return v;string DES:bit2string_(vector v)/*二进制转为string*/assert(v.size()%8 = 0);unsigned int count = 0,len = v.size();string str;while ( count (len

40、/8) ) int mask = 128; int ch = 0; for (unsigned int i = 8*count; i 1; str += (char)ch; count+;return str;vector DES:int2bit_(vector vecInt)/*整形数0-15化为二进制*/vector v;for (unsigned int i = 0; i 0) v.push_back( (mask&vecInti) 0) ); mask = mask 1; return v;vector DES:vecXor_(vector vL, vector vR)/*向量逐位异或

41、*/assert(vL.size() = vR.size();for (unsigned int i = 0; i vL.size(); i+) vLi = vRi;return vL;vector DES:leftIterMove_(vector movVec,int loopStep)/*数据左移loopStep位*/unsigned int len = movVec.size();int i;for (i = 0; i loopStep; i+) movVec.push_back(movVeci);for (i = 0; i len; i+) movVeci = movVeci+loop

42、Step;movVec.erase(movVec.end()-loopStep,movVec.end();return movVec;vector DES:vecReplace_(vector v,const unsigned int vArray)/*通用函数:数据按照数组元素换位*/vector vTmp;int i;for (i = 0; i v.size(); i+) vTmp.push_back(vvArrayi-1);return vTmp;vector DES:vecMerge_(vector vL, vector vR)/*合并两个向量*/vector vLR;int i;for (i = 0; i vL.size(); i+) vLR.push_back(vLi);for (i = 0; i vR.size();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论