DES_加密解密算法的C++实现_第1页
DES_加密解密算法的C++实现_第2页
DES_加密解密算法的C++实现_第3页
DES_加密解密算法的C++实现_第4页
DES_加密解密算法的C++实现_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、ISMDEEPDES一、目标:学习和了解DES加密算法,设计一个基于DES加密算法的加解密软件二.意义:炼团队合作能力,加强对网络安全技术的了解,学习新的编程软件的使用方法与技术三、理论基础:DES加密算法DES使用一个56位的密钥以及附加的8位奇偶校验位,产生最大 64位的分组大小。这是一个迭代的分组密码,使用称为Feistel的技术, 其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然 后将输出与另一半进行"异或"运算:接着交换这两半,这一过程会继续下去, 但绘后一个循环不交换。DES使用16个循环,使用异或,置换,代换, 移位操作四种基本运算。其入口参数

2、有三个:key、data, mode。 key为加密解密使用的密钥, data为加密,解密的数据,mode为其工作模式。当模式为加密模式时,明文 按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模 式时,key用于对数据解密。实际运用中,密钥只用到了 64位中的56位, 这样才具有高的安全性。本次里面用到计算有三种:置换,移位和异或。算法的整体结构:有16个相同的处理过程,称为“回次,并在首位各 有一次置换。在主处理回次前,数据块被分成两个32位的半块,并被分别 处理。图中的符号代表异或操作。“F函数将数据半块与某个子密钥进行 处理。然后,一个F函数的输出与另一个半块异或之后

3、,再与原本的半块 组合并交换顺序,进入下一个回次的处理。在最后一个回次完成时,两个 半块不必交换顺序。扩张一用扩张置换将32位的半块扩展到48位,其输出包括8个6位的 块,每块包含4位对应的输入位,加上两个邻接的块中紧邻的位。与密钥混合一用异或操作将扩张的结果和一个子密钥进行混合。16个 48位的子密钥一每个用于一个回次的F变换一是利用密钥调度从主密钥生 成的。S盒一在与子密钥混合之后,块被分成8个6位的块,然后使用“S盒, 或称"置换盒进行处理。8个S盒的每一个都使用以査找表方式提供的非线 性的变换将它的6个输入位变成4个输出位。S盒提供了 DES的核心安全性 一如果没有S盒,密码

4、会是线性的,很容易破解。P置换一最后,S盒的32个输出位利用固定的置换,“P置换进行重组。 这个设计是为了将每个S盒的4位输出在下一回次的扩张后,使用4个不 同的S盒进行处理。密钥调度右图显示了加密过程中的密钥调度一产生子密钥的算法。首 先,使用选择置换1(PC1)从64位输入密钥中选出56位的密钥一剩下的 8位要么直接丢弃,要么作为奇偶校验位。然后,56位分成两个28位的半 密钥;每个半密钥接下來都被分别处理。在接下來的回次中,两个半密钥 都被左移1或2位(由回次数决定),然后通过选择置换2 (PC-2)产生481/15ISMDEEPDES位的子密钥一每个半密钥24位。移位(图中由<&

5、lt;标示)表明每个子密钥中 使用了不同的位,每个位大致在16个子密钥中的14个出现。解密过程中,除了子密钥输出的顺M相反外,密钥调度的过程与加密 完全相同。详细设计:1头文件 DES.h设计方法;类的共有接口只设计一个,即加密解密函数,用一个bool参数 区分是加密还是解密。其他像读文件,写文件,加密变换函数等等设置为 私有涉及内容:文件操作,STL向量,数制变换,位操作及函数设计等等。 代码:include <fstream>#inelude <string>#in elude <iostream>include <strstream>#in

6、elude <vector>#include <assert.h>using namespace std;/* DES类声明/class DESpublic:DES();/*构造函数*/void encryptfbool flag = true);/*加解密函数*7private:string plaintextFilePath_;/*明文文件路径/ string ciphertextFilePath _;/* 密文文件路径 */ string keyFilename_;/*密钥文件路径*/string plaintext/* 明文存储*/string cipherte

7、xt厂密文存储"7string key_;/*密钥存储*/vector<vector<int> > subkey_;/* 子密钥存储 *7 void getsubkeyj);/* 计算子密钥"72/15ISMDEEPDESvoid setPlaintextFilePath_();/* 设置明文路径拿/void setCiphertextFilePathJ);/* 设置密文路径 */void setKeyFilePath_();/* 设置密钥路径 */string read Data Jstring filename);/*读取文件拿/void sav

8、eDataJstring filename,string data);/*保存文件*/vector<int> string2bit_(string str); /*string 类型转为 ASCII 二进制数*/ string bit2string_(vector<int> v);/*ASCII 进制数转为 string 类型*/ vector<int> int2bit_(vector<int> veclnt);/*整形数 0-15 化为:进制未/vector<int> vecXorJvector<int> vL, vec

9、tor<int> vR);/* 向量异或"/vector<int> leftlterMove_(vector<int> movVecJnt loopStep);/*数据左移 loopStep 位/ vector<int> vecReplace_(vector<int> v,const unsigned int vArray);/*向杲数据按 vArray 中数据 重排序*/一vector<int> vecMerge_(vector<int> vL# vector<int> vR);/合并两

10、个向量*7vector<int> f_(vector<int> vecR, vector<int> vecKey);/*f 函数/vector<int> S_(vector<int> vecRKey);/*S 盒函数*/*变换矩阵./static const unsigned int PC_1_56;static const unsigned int PC_2_48;static const unsigned int L00P_16;static const unsigned int IP_64);static const unsig

11、ned int IPR64;static const unsigned int SBOX 81 41 (161;static const unsigned int E_48;static const unsigned int P_32;;2. DES加密代码创建基于DES加解密的函数,以备后面的代码调用。 代码:include "DES.h"3/15ISMDEEPDES#/15ISMDEEPDES#/15ISMDEEPDES/*静态常量放在这里*/const unsigned int DES:IP_64=5& 50, 42, 34, 26, 18, 10, 2, 6

12、0, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 3& 30, 22t 14, 6, 64, 56, 4& 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, 4&16, 56, 24,64, 32, 39,7, 47,15, 55, 23, 63, 31,3&

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

14、 27,19,11,3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23,15,1, 62, 54, 46, 38, 30, 22,14,6, 61, 53, 45, 37, 29, 21, 13,5, 28, 20,12,4750, 43, 36, 29, 22,15,&1, 51, 44, 37, 30, 23,16,9,2, 52, 45, 3& 31, 24, 17, 10,3, 53, 46, 39, 32,56, 49,42, 35, 2& 21,14,7, 55, 48, 41, 34, 27, 20,13,6, 54, 47,

15、 40, 33, 26,19, 12,5, 25,18,11,4;const unsigned int DES:PC_2_48=厂注释的部分是对应64位带奇偶校验的-7厂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*/14.17.11.24, 1,5,3,28,15,6,21,10,23,19,12, 4, 26,8,16

16、,7,27,20,13,2,13.24, 3,9, 19,27,2,12,23,17,5,20,16, 21,11, 2&6,15,14,12,8,1,4;const unsigned int DES:LOOP_16=5/15ISMDEEPDES1,1,2, 2, 2, 2, 2, 2,1, 2, 2, 2, 2, 2, 2,1 const unsigned int DES:SBOX_8416=/SI14,4,13,1,2,15,11,&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

17、,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,13t 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,1,11, 4, 2, 8

18、,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,I, 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, & 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,

19、10,1,13,8, 9,4, 5,11,12, 7, 2,14,/S52.12, 4,1, 7,10,11, 6, & 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,II, & 12,1,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,

20、1,13,14, 0,11,3, &9.14.15, 5, 2,8,12, 3, 7, 0, 4,10,1, 13,11, 6,4, 3,2,12, 9, 5,15,10z 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, & 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,

21、 3,12,/S813, 2, 8, 4, 6,15,11,1,10,9, 3,14, 5, 0,12, 7,8,10, 3, 7,4,12, 5, 6,11, 0,14, 9, 2,6/15ISMDEEPDES7,11, 4, 1, 9Z12,14,乙 0, 6,10,13,15, 3, 5, &2,1,14,1. 4,10, & 13,15,12,9,0, 3, 5Z 6,11 const unsigned int DES:EJ48=32,1,2,3,4,5,4,5,6,1,8,9,&9,10,11,12,13,12,13,14,15,16,17,16,17,18,

22、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=16z lt 20, 21, 29z 12, 2& 17,1, 15, 23, 26,5,18, 31,10,2. & 24,14, 32, 27,3,9,19,13, 30,6, 22, llz 4, 25 y*#*审專*車*專療車車>|()|(*拿*床4(專療4<車*拿療車拿审拿*拿4<4(拿*拿*拿車嘟拿* /* DES类实现/DES:DE

23、S():subkey_(16/vector<int>(48)厂构造函数"/void DES:encrypt(bool flag /* = true */)严加密函数*/厂读取文件*/vector<int> textBit;if (flag)厂加密/setPlaintextFilePathJ);plaintext. = readData JplaintextFilePath;textBit = string2bit_(plaintext_);/*不够 64bit 的整数,补 0,如 E*/unsigned int zeroFill = (textBit.size

24、()%64) ? (64 - textBit.size()%64): 0;for (unsigned int i = 0; i < zeroFill; i+)textBit. push_back(0);6/15ISMDEEPDESelse广解密*/setCiphertextFilePathJ);ciphertext. = readData_(ciphertextFilePath_); textBit = string2bitjciphertext_);/*读取密钥文件/getsubkey_();厂循环读取64bit加密"7 unsigned int len = textBit.

25、size(); unsigned int count = 0;vector<int> secret;/* 保存密文*/while ( count < (len / 64)vector<int> textBitTmp;for (unsigned int i = 64*count; i < 64*count+64; i+) textBitTmp.push_back(textBiti);/ip置换*7vector<int> textBitTmpJP;textBitTmp IP = vecReplace (textBitTmpJP );广划分L0和RO*

26、/vector<vector<int> > L(17,vectorvint>(32); vector<vector<int> > R(17#vector<int>(32); for (int i = 0; i < 32; i+)L0i = textBitTmp叩;for (int i = 0; i < 32; i+)R0i = textBitTmp_IPi+32;厂迭代生成L1-L16ZR1-R167for (int i = 1; i < 17; i+)Li = R";if (flag)Ri = ve

27、cXorjLfi-l, f_(Ri-l,subkey_i-l);elseRi = vecXor_(Lil, f_(Ri-l,subkey_16i);vector<int> RL = vecMerge_(R16zL16);for (unsigned int i = 0; i < 64; i+)secret.push_back(RLIPR Ji-1); count+;if (flag)ciphertext_ = bit2stringjsecret); setCiphertextFilePathJ);saveData_(ciphertextFilePath_,ciphertext;

28、elseplain text = bit2string (secret); setPlaintextFilePathJ); saveDataJplaintextFilePathplaintext;void DES:setPlaintextFilePath_()厂设置明文路径/string plaintextFilePath;cout« "请输入明文文件路径(例如:c:/plaintext.txt):"cin » plaintextFilePath;plaintextFilePath_ = plaintextFilePath;void DES:setCip

29、hertextFilePath_()厂设置密文路径审/string ciphertextFilePath;cout« "请输入密文文件路径(例如:c:/ciphertext.txt):"cin » ciphertextFilePath;ciphertextFilePath_ = ciphertextFilePath;void DES:setKeyFilePath_()厂设置密钥路径*/string keyFilename;cout« ”请输入密钥文件路径(例如:c:/key.txt):"cin >> keyFilename

30、;keyFilename_ = keyFile name;string DES:readData_(string filename)厂通用函数:读取文件内容到string中,包含空格和回车符等*7 ifstream in;ostrstream os;in.op en (filename.c_str()Jos:in);os « in.rdbuf() « ends;in.close();return os.str();void DES:saveData (string filename.string data)厂通用函数:保存数据到文件中,包含空格和回车*7of st ream

31、 out(filename.c_str();outwrite(data.c_str(),datasize();out.close();vector<int> DES:string2bit_(string str)/string转为:进制*/vector<int> v;for (unsigned int i = 0; i < str.length(); i+)int mask = 128;while (mask > 0)v.push_back( (mask&stri) > 0);mask = mask » 1;return v;stri

32、ng DES:bit2string_(vector<int> v)/* :进制转为string*/assert(v.size()%8 = 0);unsigned int count = OJen = v.sizef);string str;while ( count < (len)int mask = 128;int ch = 0;for (unsigned int i = 8*count; i < 8*count+8;i+) ch += (mask & (vi*mask);mask = mask » 1;str += (char)ch;cou nt+

33、;return str;vector<int> DES:int2bit_(vector<int> veclnt)厂整形数0-15化为二进制/vector<int> v;for (unsigned int i = 0; i < veclnt.size(); i+)int mask = 8;while (mask > 0)v.push_back( (mask&veclnti( > 0); mask = mask » 1;return v;vector<int> DES:vecXor_(vector<int&g

34、t; vL, vector<int> vR)厂向量逐位异或*/assert(vL.size() = vR.size();for (unsigned int i = 0; i < vL.size(); i+)vLi A= vRi;return vL;vector<int> DES:leftlterMove_(vector<int> movVecJnt loopStep)/*数据左移loopStep位*/unsigned int len = movVec.sizef);for (int i = 0; i < loopStep; i+)movVec.p

35、ush_back(movVeci);for (unsigned int i = 0; i < len; i+)movVecfi = movVeci+loopStep;movVec.eraselmovVec.endO-loopStep.movVec.endf);return movVec;vector<int> DES:vecReplaceJvector<int> yconst unsigned int vArray)厂通用函数:数据按照数组元素换位*/vector<int> vTmp;for (unsigned int i = 0; i < v.

36、sizef); i+)vTmp.push_back(vvArrayi-l);return vTmp;vector<int> DES:vecMerge_(vector<int> vL, vector<int> vR)厂合并两个向量*/vector<int> vLR;for (unsigned int i = 0; i < vL.size(); i+)vLR.push_back(vLi);for (unsigned int i = 0; i < vR.size(); i+)vLR.push_back(vRi);return vLR;vec

37、tor<int> DES:f_(vector<int> vecR, vector<int> vecKey)/*f函数,DES加密的核心*7assertf (vecR.size() = 32) && (vecKey.sizef) = 48);vector<int> vecR_E,vecR_E_P;for (unsigned int i = 0; i < 48; i+)vecR_E.push_back(vecREil);vecR_E = S_(vecXor_(vecR_E.vecKey);vecR_E_P = vecReplac

38、e_(vecR_E,P_);return vecR E P;vector<int> DES:S_(vector<int> vecRKey)/*S 函数,6bit 入 4bit 出*7assert(vecRKey.size() = 48);vector<vector<int> > S_out(8#vector<int>(6);vector<int> tmp;for (unsigned int i = 0; i < 8; i+)for (unsigned int j = 0; j < 6; j+)S_outiD =

39、 vecRKey6*i+j;int a = 2 * S_outi0 + S_outi;int b = 8 * S_outil + 4 * S_outi2 + 2 * S_outi3 + S_outi4; tmp.push_back(SBOX_i ab);return int2bit_(tmp);void DES:getsubkey_()厂函数功能:获得子密钥*/厂读取密钥文件*/setKeyFilePathJ);key_ = readData_(keyFilename_);vector<int> keyBit = string2bit_(key_);厂生成子密胡*/I-keybit

40、 通过 PC/vector<int> keyBit_PC_l = vecReplace_(keyBit,PC_l_);/*2 -迭代 C,D*/vector<vector<int> > C(17/vector<int>(28);vector<vector<int> > D(17/vector<int>(28);for (int i = 0; i < 28; i+)C0i = keyBit_PC_li;for (int i = 0; i < 2& i+)D0i = keyBit_PC_li+28;/*3循坏

温馨提示

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

评论

0/150

提交评论