nim_duilib/base/encrypt/des.h
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

183 lines
5.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 //默认
#define PKCS5 1
#define ECB_MODE 0 //默认
#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:
//类构造函数
yxDES(int length=8192);
//类析构函数
~yxDES();
//功能:设置加解密和填充模式如果用户不调用默认模式都是0
//参数:整型
//结果:函数将结果存于int m_iMode和int m_iPkcs
void SetModeAndPKCS(int iMode = 0,int iPKCS = 0);
//功能:设置IV,默认为{0,0,0,0,0,0,0,0}
//参数:8位字符串
//结果:函数将结果存于char szvi[8]和char szviRev[8]
void SetIV(char* srcBytes);
//功能:产生16个28位的key
//参数:源8位的字符串(key),存放key的序号0-1
//结果:函数将调用private CreateSubKey将结果存于char SubKeys[keyN][16][48]
void InitializeKey(const char* srcBytes,unsigned int keyN);
//功能:加密8位字符串
//参数:8位字符串,使用Key的序号0-1
//结果:函数将加密后结果存放于private szCiphertext[16]
// 用户通过属性Ciphertext得到
void EncryptData(char* _srcBytes,unsigned int keyN);
//功能:解密16位十六进制字符串
//参数:16位十六进制字符串,使用Key的序号0-1
//结果:函数将解密候结果存放于private szPlaintext[8]
// 用户通过属性Plaintext得到
void DecryptData(char* _srcBytes,unsigned int keyN);
//功能:加密任意长度字符串
//参数:任意长度字符串,长度,使用Key的序号0-1
//结果:函数将加密后结果存放于private szFCiphertextAnyLength[8192]
// 用户通过属性CiphertextAnyLength得到
void EncryptAnyLength(char* _srcBytes,unsigned int _bytesLength,unsigned int keyN);
//功能:解密任意长度十六进制字符串
//参数:任意长度字符串,长度,使用Key的序号0-1
//结果:函数将加密后结果存放于private szFPlaintextAnyLength[8192]
// 用户通过属性PlaintextAnyLength得到
void DecryptAnyLength(char* _srcBytes,unsigned int _bytesLength, unsigned int keyN);
//功能:Bytes到Bits的转换,
//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小
void Bytes2Bits(const char *srcBytes, char* dstBits, unsigned int sizeBits);
//功能:Bits到Bytes的转换,
//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小
void Bits2Bytes(char *dstBytes, char* srcBits, unsigned int sizeBits);
//功能:Int到Bits的转换,
//参数:待变换字符串,处理后结果存放缓冲区指针
void Int2Bits(unsigned 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* GetCiphertextInBinary();
//szCiphertextInHex的get函数
char* GetCiphertextInHex();
//Ciphertext的get函数
char* GetCiphertextInBytes();
//Plaintext的get函数
char* GetPlaintext();
//CiphertextAnyLength的get函数
char* GetCiphertextAnyLength();
//PlaintextAnyLength的get函数
char* GetPlaintextAnyLength();
//字符串转16进制密文文本
void ConvertCiphertext2Hex(char *szPlainInBytes);
//16进制密文转字符串
int ConvertHex2Ciphertext(const char *szCipherInBytes);
//CiphertextData函数
char* GetCiphertextData();
//hexCiphertextAnyLength函数
char* GetHexCipherAnyLengthData();
private:
int m_iLength;
char szSubKeys[2][16][48];//储存2个16组48位密钥,第2个用于3DES
char szCiphertextRaw[64]; //储存二进制密文(64个Bits) int 0,1
char szPlaintextRaw[64]; //储存二进制密文(64个Bits) int 0,1
char szCiphertextInBytes[8];//储存8位密文
char szPlaintextInBytes[8];//储存8位明文字符串
char szCiphertextInBinary[65]; //储存二进制密文(64个Bits) char '0','1',最后一位存'\0'
char szCiphertextInHex[17]; //储存十六进制密文,最后一位存'\0'
char szPlaintext[9];//储存8位明文字符串,最后一位存'\0'
char* szFCiphertextAnyLength;//任意长度密文
char* szFPlaintextAnyLength;//任意长度明文字符串
char* szCiphertextData;
char* hexCiphertextAnyLength;
char sziv[8];//加密IV
char szivRev[8];//解密IV
int m_iMode;//加解密模式
int m_iPkcs;//填充模式
int data_base_length_;//用于编解码需要的字符缓存长度
//功能:生成子密钥
//参数:经过PC1变换的56位二进制字符串,生成的szSubKeys编号0-1
//结果:将保存于char szSubKeys[16][48]
void CreateSubKey(char* sz_56key,unsigned int keyN);
//功能: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 ExpansionR(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逆变换,
//参数:待变换字符串,处理后结果存放指针
//结果:函数改变第二个参数的内容
void PermutationP(char* _src,char* _dst);
};
#endif