nim_duilib/base/encrypt/des.h

183 lines
5.3 KiB
C
Raw Normal View History

2019-04-19 17:19:57 +08:00
#pragma once
#ifndef yxDESH
#define yxDESH
#include <string>
//support CBC ECB mode,you can padding PKCS5 or NOPKCS by yuzj 2010 5 10
#define NOPKCS 0 //Ĭ<><C4AC>
#define PKCS5 1
#define ECB_MODE 0 //Ĭ<><C4AC>
#define CBC_MODE 1
class yxDES
{
public:
static std::string Encrypt(const std::string &src, const char* key, int iMode = ECB_MODE,int iPKCS = PKCS5);
static std::string Decrypt(const std::string &src, const char* key, int iMode = ECB_MODE,int iPKCS = PKCS5);
private:
//<2F><EFBFBD><EFBFBD><ECBAAF>
yxDES(int length=8192);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
~yxDES();
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD>üӽ<C3BC><D3BD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>0
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int m_iMode<64><65>int m_iPkcs
void SetModeAndPKCS(int iMode = 0,int iPKCS = 0);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>IV,Ĭ<><C4AC>Ϊ{0,0,0,0,0,0,0,0}
//<2F><><EFBFBD><EFBFBD>:8λ<38>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>char szvi[8]<5D><>char szviRev[8]
void SetIV(char* srcBytes);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>16<31><36>28λ<38><CEBB>key
//<2F><><EFBFBD><EFBFBD>:Դ8λ<38><CEBB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>(key),<2C><><EFBFBD><EFBFBD>key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>private CreateSubKey<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>char SubKeys[keyN][16][48]
void InitializeKey(const char* srcBytes,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><38>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:8λ<38>ַ<EFBFBD><D6B7><EFBFBD>,ʹ<><CAB9>Key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>private szCiphertext[16]
// <20>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ciphertext<78>õ<EFBFBD>
void EncryptData(char* _srcBytes,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>16λʮ<CEBB><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:16λʮ<CEBB><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,ʹ<><CAB9>Key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>private szPlaintext[8]
// <20>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Plaintext<78>õ<EFBFBD>
void DecryptData(char* _srcBytes,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B3A4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><E2B3A4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD>,ʹ<><CAB9>Key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>private szFCiphertextAnyLength[8192]
// <20>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CiphertextAnyLength<74>õ<EFBFBD>
void EncryptAnyLength(char* _srcBytes,unsigned int _bytesLength,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B3A4>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><E2B3A4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD>,ʹ<><CAB9>Key<65><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>private szFPlaintextAnyLength[8192]
// <20>û<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PlaintextAnyLength<74>õ<EFBFBD>
void DecryptAnyLength(char* _srcBytes,unsigned int _bytesLength, unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:Bytes<65><73>Bits<74><73>ת<EFBFBD><D7AA>,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,Bits<74><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
void Bytes2Bits(const char *srcBytes, char* dstBits, unsigned int sizeBits);
//<2F><><EFBFBD><EFBFBD>:Bits<74><73>Bytes<65><73>ת<EFBFBD><D7AA>,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,Bits<74><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
void Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits);
//<2F><><EFBFBD><EFBFBD>:Int<6E><74>Bits<74><73>ת<EFBFBD><D7AA>,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
void Int2Bits(unsigned int srcByte, char* dstBits);
//<2F><><EFBFBD><EFBFBD>:Bits<74><73>Hex<65><78>ת<EFBFBD><D7AA>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,Bits<74><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
void Bits2Hex(char *dstHex, char* srcBits, unsigned int sizeBits);
//<2F><><EFBFBD><EFBFBD>:Bits<74><73>Hex<65><78>ת<EFBFBD><D7AA>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,Bits<74><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
void Hex2Bits(char *srcHex, char* dstBits, unsigned int sizeBits);
//szCiphertextInBinary<72><79>get<65><74><EFBFBD><EFBFBD>
char* GetCiphertextInBinary();
//szCiphertextInHex<65><78>get<65><74><EFBFBD><EFBFBD>
char* GetCiphertextInHex();
//Ciphertext<78><74>get<65><74><EFBFBD><EFBFBD>
char* GetCiphertextInBytes();
//Plaintext<78><74>get<65><74><EFBFBD><EFBFBD>
char* GetPlaintext();
//CiphertextAnyLength<74><68>get<65><74><EFBFBD><EFBFBD>
char* GetCiphertextAnyLength();
//PlaintextAnyLength<74><68>get<65><74><EFBFBD><EFBFBD>
char* GetPlaintextAnyLength();
//<2F>ַ<EFBFBD><D6B7><EFBFBD>ת16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
void ConvertCiphertext2Hex(char *szPlainInBytes);
//16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
int ConvertHex2Ciphertext(const char *szCipherInBytes);
//CiphertextData<74><61><EFBFBD><EFBFBD>
char* GetCiphertextData();
//hexCiphertextAnyLength<74><68><EFBFBD><EFBFBD>
char* GetHexCipherAnyLengthData();
private:
int m_iLength;
char szSubKeys[2][16][48];//<2F><><EFBFBD><EFBFBD>2<EFBFBD><32>16<31><36>48λ<38><CEBB>Կ,<2C><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3DES
char szCiphertextRaw[64]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(64<36><34>Bits) int 0,1
char szPlaintextRaw[64]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(64<36><34>Bits) int 0,1
char szCiphertextInBytes[8];//<2F><><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD>
char szPlaintextInBytes[8];//<2F><><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
char szCiphertextInBinary[65]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(64<36><34>Bits) char '0','1',<2C><><EFBFBD><EFBFBD>һλ<D2BB><CEBB>'\0'
char szCiphertextInHex[17]; //<2F><><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>һλ<D2BB><CEBB>'\0'
char szPlaintext[9];//<2F><><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD>һλ<D2BB><CEBB>'\0'
char* szFCiphertextAnyLength;//<2F><><EFBFBD><EFBFBD><E2B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* szFPlaintextAnyLength;//<2F><><EFBFBD><EFBFBD><E2B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
char* szCiphertextData;
char* hexCiphertextAnyLength;
char sziv[8];//<2F><><EFBFBD><EFBFBD>IV
char szivRev[8];//<2F><><EFBFBD><EFBFBD>IV
int m_iMode;//<2F>ӽ<EFBFBD><D3BD><EFBFBD>ģʽ
int m_iPkcs;//<2F><><EFBFBD><EFBFBD>ģʽ
int data_base_length_;//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><E6B3A4>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>PC1<43><EFBFBD><E4BBBB>56λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD>ɵ<EFBFBD>szSubKeys<79><73><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>char szSubKeys[16][48]
void CreateSubKey(char* sz_56key,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:DES<45>е<EFBFBD>F<EFBFBD><46><EFBFBD><EFBFBD>,
//<2F><><EFBFBD><EFBFBD>:<3A><>32λ,<2C><>32λ,key<65><79><EFBFBD><EFBFBD>(0-15),ʹ<>õ<EFBFBD>szSubKeys<79><73><EFBFBD><EFBFBD>0-1
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD>ڱ任<DAB1><E4BBBB><EFBFBD><EFBFBD>32λ
void FunctionF(char* sz_Li,char* sz_Ri,unsigned int iKey,unsigned int keyN);
//<2F><><EFBFBD><EFBFBD>:IP<49>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void InitialPermuteData(char* _src,char* _dst);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>32λ<32><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չλ48λ,
//<2F><><EFBFBD><EFBFBD>:ԭ32λ<32>ַ<EFBFBD><D6B7><EFBFBD>,<2C><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ExpansionR(char* _src,char* _dst);
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>1,<2C>ַ<EFBFBD><D6B7><EFBFBD>2,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void XOR(char* szParam1,char* szParam2, unsigned int uiParamLength, char* szReturnValueBuffer);
//<2F><><EFBFBD><EFBFBD>:S-BOX , <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>,
//<2F><><EFBFBD><EFBFBD>:48λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>:32λ<32>ַ<EFBFBD><D6B7><EFBFBD>
void CompressFuncS(char* _src48, char* _dst32);
//<2F><><EFBFBD><EFBFBD>:IP<49><50><EFBFBD>任,
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void PermutationP(char* _src,char* _dst);
};
#endif