80 lines
1.8 KiB
C++
80 lines
1.8 KiB
C++
|
||
#pragma once
|
||
|
||
#include <string.h>
|
||
#include "_osdef.h"
|
||
#include "CRC16.h"
|
||
|
||
class Encrypt
|
||
{
|
||
public:
|
||
Encrypt()
|
||
{
|
||
Reset();
|
||
}
|
||
|
||
//重置
|
||
inline void Reset()
|
||
{
|
||
memset(this,0,sizeof(*this));
|
||
}
|
||
void SetSelfSalt(unsigned int salt); //设置自己的随机数
|
||
|
||
/*
|
||
* Comments: 设置目标的key
|
||
* Parameter: unsigned int salt:目标的salt
|
||
* Parameter: bool isClient:自身是作为客户端还是服务器,使用了不对称的key生成算法
|
||
* @Return void:
|
||
*/
|
||
void SetTargetSalt(unsigned int salt,bool isClient=false); //设置通信方的随机数,同时会生成key
|
||
|
||
unsigned int GetSelfSalt(){return m_nSelfSalt;} //获取自身的随机数
|
||
|
||
unsigned int GetTargetSalt() {return m_nTargetSalt; } //获取目标的随机数
|
||
|
||
bool Encode( char *pInBuff,size_t len,char *pOutBuff ); //加密数据
|
||
|
||
bool Decode( char *pInBuff,size_t len,char *pOutBuff ); //解密数据
|
||
|
||
inline bool IsKeyCrcCorrect( WORD nKeyCRC) //
|
||
{
|
||
return (GetKeyCRC()== nKeyCRC);
|
||
}
|
||
|
||
inline static UINT_PTR CRC16(LPCVOID lpBuffer, size_t len) //计算CRC-16的Checksum
|
||
{
|
||
return CRC16Calc((unsigned char *)lpBuffer,len);
|
||
}
|
||
inline unsigned int GetKey()
|
||
{
|
||
return m_nKey;
|
||
}
|
||
WORD GetKeyCRC() //获取key的crc值
|
||
{
|
||
return (CRC16(m_sKeybuff,4) & 0xffff);
|
||
}
|
||
unsigned int GenSalt(); // 产生salt
|
||
|
||
//增长checksum
|
||
inline void IncreaseCheckSum()
|
||
{
|
||
m_wCheckSum += 1;
|
||
}
|
||
|
||
inline WORD GetCheckSum()
|
||
{
|
||
return m_wCheckSum;
|
||
}
|
||
|
||
private:
|
||
void GenKey(bool isClient=false); //产生密钥
|
||
|
||
|
||
private:
|
||
unsigned int m_nSelfSalt; //自己产生的随机数
|
||
unsigned int m_nTargetSalt; //通信方的随机数
|
||
unsigned int m_nKey; //密钥
|
||
unsigned char m_sKeybuff[4] ; //密钥的buff,添加这个为了方便计算
|
||
WORD m_wCheckSum; //一个数,自增长的,用于防止重复发包
|
||
};
|