1、/DES.h#pragma onceclass DESpublic:/类构造函数DES(); /类析构函数DES(); /功能:产生16个28位的key/参数:源8位的字符串(key),存放key的序号0-1/结果:函数将调用private CreateSubKey将结果存于char SubKeyskeyN1648void InitializeKey(char* srcBytes,unsigned int keyN);/功能:加密8位字符串/参数:8位字符串,使用Key的序号0-1/结果:函数将加密后结果存放于private szCiphertext16/ 用户通过属性Ciphertext得到
2、void EncryptData(char* _srcBytes,unsigned int keyN);/功能:解密16位十六进制字符串/参数:16位十六进制字符串,使用Key的序号0-1/结果:函数将解密候结果存放于private szPlaintext8/ 用户通过属性Plaintext得到void DecryptData(char* _srcBytes,unsigned int keyN);/功能:加密任意长度字符串/参数:任意长度字符串,长度,使用Key的序号0-1/结果:函数将加密后结果存放于private szFCiphertextAnyLength8192/ 用户通过属性Ciph
3、ertextAnyLength得到void EncryptAnyLength(char* _srcBytes,unsigned int _bytesLength,unsigned int keyN);/功能:解密任意长度十六进制字符串/参数:任意长度字符串,长度,使用Key的序号0-1/结果:函数将加密后结果存放于private szFPlaintextAnyLength8192/ 用户通过属性PlaintextAnyLength得到void DecryptAnyLength(char* _srcBytes,unsigned int _bytesLength, unsigned int key
4、N);/功能:Bytes到Bits的转换,/参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小void Bytes2Bits(char *srcBytes, char* dstBits, unsigned int sizeBits);/功能:Bits到Bytes的转换,/参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小void Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits);/功能:Int到Bits的转换,/参数:待变换字符串,处理后结果存放缓冲区指针void Int2Bits(un
5、signed int srcByte, char* dstBits);/功能:Bits到Hex的转换/参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小void Bits2Hex(char *dstHex, char* srcBits, unsigned int sizeBits);/功能:Bits到Hex的转换/参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小void Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits);/szCiphertextInBinary的get函数char* GetC
6、iphertextInBinary();/szCiphertextInHex的get函数char* GetCiphertextInHex();/Ciphertext的get函数char* GetCiphertextInBytes();/Plaintext的get函数char* GetPlaintext();/CiphertextAnyLength的get函数char* GetCiphertextAnyLength();/PlaintextAnyLength的get函数char* GetPlaintextAnyLength();CString EncryptCString(CString str
7、);CString DecryptCString(CString str);private:char szSubKeys21648;/储存2个16组48位密钥,第2个用于3DESchar szCiphertextRaw64; /储存二进制密文(64个Bits) int 0,1char szPlaintextRaw64; /储存二进制密文(64个Bits) int 0,1char szCiphertextInBytes8;/储存8位密文char szPlaintextInBytes8;/储存8位明文字符串char szCiphertextInBinary65; /储存二进制密文(64个Bits)
8、 char 0,1,最后一位存0char szCiphertextInHex17; /储存十六进制密文,最后一位存0char szPlaintext9;/储存8位明文字符串,最后一位存0char szFCiphertextAnyLength8192;/任意长度密文char szFPlaintextAnyLength8192;/任意长度明文字符串/功能:生成子密钥/参数:经过PC1变换的56位二进制字符串,生成的szSubKeys编号0-1/结果:将保存于char szSubKeys1648void CreateSubKey(char* sz_56key,unsigned int keyN);/
9、功能:DES中的F函数,/参数:左32位,右32位,key序号(0-15),使用的szSubKeys编号0-1/结果:均在变换左右32位void FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey,unsigned int keyN);/功能:IP变换/参数:待处理字符串,处理后结果存放指针/结果:函数改变第二个参数的内容void InitialPermuteData(char* _src,char* _dst);/功能:将右32位进行扩展位48位,/参数:原32位字符串,扩展后结果存放指针/结果:函数改变第二个参数的内容void Expan
10、sionR(char* _src,char* _dst);/功能:异或函数,/参数:待异或的操作字符串1,字符串2,操作数长度,处理后结果存放指针/结果: 函数改变第四个参数的内容void XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer);/功能:S-BOX , 数据压缩,/参数:48位二进制字符串,/结果:返回结果:32位字符串void CompressFuncS(char* _src48, char* _dst32);/功能:IP逆变换,/参数:待变换字符串,处
11、理后结果存放指针/结果:函数改变第二个参数的内容void PermutationP(char* _src,char* _dst);/DES.cpp#include “stdafx.h“#include “DES.h“/ permuted choice table (PC1)const static char PC1_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, 44, 36,63, 55, 47, 39, 31, 23, 1
12、5, 7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4;/ permuted choice key (PC2)const static char PC2_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, 56, 34, 53, 46,
13、 42, 50, 36, 29, 32;/ number left rotations of pc1 const static char Shift_Table16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/ initial permutation (IP)const static char IP_Table64 = 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,
14、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;/ expansion operation matrix (E)const static char E_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,
15、24, 25,24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1;/ The (in)famous S-boxes const static char S_Box8416 = / 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,
16、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, 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,1
17、3, 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,/ 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,
18、 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, 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,/ S6 12,
19、 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,/ 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,
20、 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,/ 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,
21、7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11;/ 32-bit permutation function P used on the output of the S-boxes 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, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25;/ final permutation IP-1 const static char I
22、PR_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;DES:DES()memset(szCiphertextRaw,0,64);memset
23、(szPlaintextRaw,0,64);memset(szCiphertextInBytes,0,8);memset(szPlaintextInBytes,0,8);memset(szCiphertextInBinary,0,65);memset(szCiphertextInHex,0,17);memset(szPlaintext,0,9);memset(szFCiphertextAnyLength,0,8192);memset(szCiphertextInHex,0,8192);DES:DES()void DES:InitializeKey(char* srcBytes,unsigned
24、 int keyN)/convert 8 char-bytes key to 64 binary-bitschar sz_64key64 = 0;Bytes2Bits(srcBytes,sz_64key,64);/PC 1char sz_56key56 = 0;for(int k=0;k37;void DES:Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits)memset(dstBytes,0,sizeBits3);for(unsigned int i=0; i 3 |= (srcBitsi 3;void DES:B
25、its2Hex(char *dstHex, char* srcBits, unsigned int sizeBits)memset(dstHex,0,sizeBits2);for(unsigned int i=0; i 2 += (srcBitsi 2);j+)dstHexj += dstHexj 9 ? 55 : 48; /convert to char 0-Fvoid DES:Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits)memset(dstBits,0,sizeBits);for(unsigned int i=0;
26、i 2);i+)srcHexi -= srcHexi 64 ? 55 : 48; /convert to char int 0-15for(unsigned int j=0; j 2 3;char* DES:GetCiphertextInBinary()for(unsigned int i=0;i 8)int iParts = _bytesLength3;int iResidue = _bytesLength % 8;char szLast8Bits8 = 0;for(int i=0;i 8)int iParts = _bytesLength3;int iResidue = _bytesLen
27、gth % 8;char szLast8Bits8 = 0;for(int i=0;i3) + 1) GetCiphertextAnyLength(),bitsCiphertextAnyLength,iBitsLen);Bits2Hex(hexCiphertextAnyLength,bitsCiphertextAnyLength,iBitsLen);for(int i=0;i2) + (strlen(c1) % 4 = 0 ? 0 : 1)3,0);char* cs= this-GetPlaintextAnyLength();CString pwd1=L“;pwd1.Format(L“%s“,A2T(cs);return pwd1;