C++ 信息系统框架集成第三方产品

模拟公司信息系统框架继承第三方产品

头文件

CSocketProtocol.h

#pragma once
#include <iostream>
using namespace std;

class CSoketProtocl
{
public:
	CSoketProtocl()
	{
		;
	}
	virtual ~CSoketProtocl()
	{
		;
	}

	//客户端初始化 获取handle
	virtual int cltSoketInit(/*out*/) = 0;

	//客户端发报文
	virtual int cltSoketSend(unsigned char* buf/*in*/, int buflen/*in*/) = 0;

	//客户端收报文
	virtual int cltSoketRev(unsigned char* buf/*in*/, int* buflen/*in out*/) = 0;

	//客户端释放资源
	virtual int cltSoketDestroy() = 0;

};

CSckFactoryImp1.h

#pragma once
#include "CSocketProtocol.h"

class CSckFactoryImp1 :public CSoketProtocl
{
public:
	//客户端初始化 获取handle
	virtual int cltSoketInit(/*out*/);

	//客户端发报文
	virtual int cltSoketSend(unsigned char* buf/*in*/, int buflen/*in*/);

	//客户端收报文
	virtual int cltSoketRev(unsigned char* buf/*in*/, int* buflen/*in out*/);

	//客户端释放资源
	virtual int cltSoketDestroy();

private:
	unsigned char* p;
	int len;
};

DES.h (用于Des加密解密)

#ifndef _DES_H_
#define _DES_H_

#include <string>

#define BITS_PER_CHAR 8
#define KEY_SZIE 8
#define SUBKEY_NUM 16
#define SUBKEY_LENGHT 48
#define EXPAND_SIZE 48
#define PC_2_SIZE 48
#define PC_1_SIZE 56
#define BIT_STR_SIZE 64

class DES
{
public:
	DES();
	~DES();

	//加密
	int Encrypt(unsigned char* plain, int plainlen, unsigned char* cipher, int* cipherlen, const std::string& key);
	//解密
	int Decrypt(unsigned char* cipher, int cipherlen, unsigned char* plain, int* plainlen, const std::string& key);

private:
	//生成16个子秘钥
	bool CreateSubKey(const std::string& key, char subKey[SUBKEY_NUM][SUBKEY_LENGHT]);

	//加密8字节数据块
	bool EncryptBlock(std::string& block, char subKey[SUBKEY_NUM][SUBKEY_LENGHT]);
	//解密8字节数据块
	bool DecryptBlock(std::string& block, char subKey[SUBKEY_NUM][SUBKEY_LENGHT]);


private:
	//----------------------------------转换工具-----------------------------------------------
	bool PC1_Transform(const std::string& bitStr, std::string& PC1BitStr);

	bool PC2_Transform(const std::string& PC1BitStr, char subKey[SUBKEY_LENGHT]);

	bool IP_Transform(std::string& bitStr);

	bool Expand_Transform(const std::string& halfBitStr, std::string& eBitStr);

	bool SBox_Transform(const std::string& eBitStr, std::string& halfBitStr);

	bool Permute_Transform(std::string& halfBitStr);

	bool IP_1_Transform(std::string& bitStr);

private:
	//------------------------------------基础工具------------------------------------------------
	bool Char8ToBit64(const std::string& str, std::string& bitStr);
	bool Bit64ToChar8(const std::string& bitStr, std::string& str);

	bool XOR(std::string& strFirst, std::string& strSecond, size_t num);

	bool LeftCycle(std::string& str, size_t beginSection, size_t endSection, size_t step);

private:
	//------------------------------------生成秘钥需要的表----------------------------------------
	//置换选择表1
	//压缩换位去掉每个字节的第8位,用作奇偶校检,基本上第8位可忽略
	static char PC1_Table[PC_1_SIZE];
	//左循环距离表
	static char Move_Table[SUBKEY_NUM];
	//置换选择表2
	//选择其中的某些位将其减少到48位
	static char PC2_Table[PC_2_SIZE];


	//----------------------------------加密或解密需要的表--------------------------------------------
	//初始置换表
	//表中的数值表示输入为被置换后的新位置
	static char IP_Table[BIT_STR_SIZE];
	//扩展表
	//通过重复某些位将32位的右半部分按照表扩展成48位
	static char Expand_Table[EXPAND_SIZE];
	//单纯置换表
	static char Permute_Table[BIT_STR_SIZE / 2];
	//反置换表
	static char IP_1_Table[BIT_STR_SIZE];
	//置换盒
	static char SBox_Table[KEY_SZIE][4][16];
};

#endif

CEncDesProtocol.h

#pragma once
class CEncDesProtocol
{
public:
	CEncDesProtocol()
	{
	}

	virtual ~CEncDesProtocol()
	{
	}
	virtual int EncData(unsigned char* plain, int plainlen, unsigned char* cryptdata, int* cryptlen) = 0;
	virtual int DecData(unsigned char* cryptdata, int cryptlen, unsigned char* plain, int* plainlen) = 0;

};

HwEncDec.h

#pragma once
#include <iostream>
#include "CEncDesProtocol.h"
using namespace std;

class HwEncDec :public CEncDesProtocol
{
public:
	virtual int EncData(unsigned char* plain, int plainlen, unsigned char* cryptdata, int* cryptlen);
	virtual int DecData(unsigned char* cryptdata, int cryptlen, unsigned char* plain, int* plainlen);

};

源文件

CSckFactoryImp1.cpp

#include "CSckFactoryImp1.h"

//客户端初始化 获取handle
int CSckFactoryImp1::cltSoketInit(/*out*/)
{
	p = NULL;
	len = 0;
	return 0;
}

//客户端发报文
int CSckFactoryImp1::cltSoketSend(unsigned char* buf/*in*/, int buflen/*in*/)
{
	p = new unsigned char[buflen];
	if (p == NULL)
	{
		return -1;
	}
	memcpy(p, buf, buflen);
	len = buflen;
	return 0;
}

//客户端收报文
int CSckFactoryImp1::cltSoketRev(unsigned char* buf/*in*/, int* buflen/*in out*/)
{
	if (buf == NULL || buflen == NULL)
	{
		return -1;
	}

	*buflen = this->len;
	memcpy(buf, this->p, this->len);
	return 0;
}

//客户端释放资源
int CSckFactoryImp1::cltSoketDestroy()
{
	if (p != NULL)
	{
		delete[] p;
		p = NULL;
		len = 0;
	}
	return 0;
}

DES.cpp

#define _CRT_SECURE_NO_WARNINGS
#include "DES.h"


//------------------------------------生成秘钥需要的表----------------------------------------

char DES::PC1_Table[PC_1_SIZE] = {
						56,48,40,32,24,16,8,
						0,57,49,41,33,25,17,
						9,1,58,50,42,34,26,
						18,10,2,59,51,43,35,
						62,54,46,38,30,22,14,
						6,61,53,45,37,29,21,
						13,5,60,52,44,36,28,
						20,12,4,27,19,11,3 };

char DES::Move_Table[SUBKEY_NUM] = { 23,10,2,5,9,2,3,2,3,2,5,7,2,9,2,7 };

char DES::PC2_Table[PC_2_SIZE] = {
						13,16,10,23,0,4,2,27,
						14,5,20,9,22,18,11,3,
						25,7,15,6,26,19,12,1,
						40,51,30,36,46,54,29,39,
						50,44,32,46,43,48,38,55,
						33,52,45,41,49,35,28,31 };


//----------------------------------加密或解密需要的表--------------------------------------------

char DES::IP_Table[BIT_STR_SIZE] = {
						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,
						56,48,40,32,24,16,8,0,
						58,50,42,34,26,18,10,2,
						60,52,44,36,28,20,12,4,
						62,54,46,38,30,22,14,6 };

char DES::Expand_Table[EXPAND_SIZE] = {
						31, 0, 1, 2, 3, 4,
						3,  4, 5, 6, 7, 8,
						7,  8, 9,10,11,12,
						11,12,13,14,15,16,
						15,16,17,18,19,20,
						19,20,21,22,23,24,
						23,24,25,26,27,28,
						27,28,29,30,31, 0 };

char DES::Permute_Table[BIT_STR_SIZE / 2] = {
						15, 6,19,20,28,11,27,16,
						0,14,22,25, 4,17,30, 9,
						1, 7,23,13,31,26, 2, 8,
						18,12,29, 5,21,10, 3,24 };

char DES::IP_1_Table[BIT_STR_SIZE] = {
						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,
						32,0,40,8,48,16,56,24 };

char DES::SBox_Table[KEY_SZIE][4][16] = {
	//S1
	{{14,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,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},
	{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},
	{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,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,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,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,7,4,10,8,13,15,12,9,0,3,5,6,11}} };

DES::DES() {}

DES::~DES() {}


int DES::Encrypt(unsigned char* plain, int plainlen, unsigned char* cipher, int* cipherlen, const std::string& key)
{
	std::string result;
	if (plain == NULL || key.empty())
		return -1;

	char subKey[16][48];
	if (!CreateSubKey(key, subKey))
		return -1;

	std::string s1((char*)plain, plainlen);
	for (size_t i = 0; i < s1.size() / 8; ++i)
	{
		std::string block = s1.substr(i * 8, 8);
		EncryptBlock(block, subKey);
		result.append(block);
	}
	int remainder = s1.size() % 8;
	if (remainder)
	{
		std::string block = s1.substr(s1.size() - remainder, remainder);
		block.append(8 - remainder, '\0');
		EncryptBlock(block, subKey);
		result.append(block);
	}

	*cipherlen = (int)result.size();
	cipher = new unsigned char[*cipherlen];
	strcpy((char*)cipher, result.c_str());
	(unsigned char*)cipher;
	return 0;
}

int DES::Decrypt(unsigned char* cipher, int cipherlen, unsigned char* plain, int* plainlen, const std::string& key)
{
	std::string result;
	if (cipher == NULL || plain == NULL || plainlen == NULL || key.empty())
		return -2;
	
	if (sizeof(cipher) % 8)
		return -3;

	char subKey[16][48];
	CreateSubKey(key, subKey);

	std::string s2((char*)cipher);
	for (size_t i = 0; i < s2.size() / 8; ++i)
	{
		std::string block = s2.substr(i * 8, 8);
		DecryptBlock(block, subKey);
		result.append(block);
	}

	*plainlen = result.size();
	plain = new unsigned char[*plainlen];
	strcpy((char*)plain, result.c_str());
	(unsigned char*)plain;
	return 0;
}


bool DES::EncryptBlock(std::string& block, char subKey[SUBKEY_NUM][SUBKEY_LENGHT])
{
	if (block.size() != KEY_SZIE)
		return false;

	std::string bitStr;
	bitStr.resize(BIT_STR_SIZE);
	Char8ToBit64(block, bitStr);

	IP_Transform(bitStr);

	std::string halfBitStr;
	halfBitStr.resize(bitStr.size() / 2);
	std::string eBitStr;
	eBitStr.resize(EXPAND_SIZE);
	for (size_t i = 0; i < SUBKEY_NUM; ++i)
	{
		Expand_Transform(bitStr.substr(bitStr.size() / 2), eBitStr);

		std::string s2(subKey[i], SUBKEY_LENGHT);
		XOR(eBitStr, s2, SUBKEY_LENGHT);

		SBox_Transform(eBitStr, halfBitStr);

		Permute_Transform(halfBitStr);

		XOR(bitStr, halfBitStr, halfBitStr.size());

		if (i != SUBKEY_NUM - 1)
			LeftCycle(bitStr, 0, bitStr.size(), bitStr.size() / 2);
	}
	IP_1_Transform(bitStr);

	Bit64ToChar8(bitStr, block);

	return true;
}

bool DES::DecryptBlock(std::string& block, char subKey[SUBKEY_NUM][SUBKEY_LENGHT])
{
	if (block.size() != KEY_SZIE)
		return false;

	std::string bitStr;
	bitStr.resize(BIT_STR_SIZE);
	Char8ToBit64(block, bitStr);

	IP_Transform(bitStr);

	std::string halfBitStr;
	halfBitStr.resize(bitStr.size() / 2);
	std::string eBitStr;
	eBitStr.resize(EXPAND_SIZE);
	for (int i = SUBKEY_NUM - 1; i >= 0; --i)
	{
		Expand_Transform(bitStr.substr(bitStr.size() / 2), eBitStr);
		std::string s1(subKey[i], SUBKEY_LENGHT);
		XOR(eBitStr, s1, SUBKEY_LENGHT);

		SBox_Transform(eBitStr, halfBitStr);
		Permute_Transform(halfBitStr);

		XOR(bitStr, halfBitStr, halfBitStr.size());

		if (i != 0)
			LeftCycle(bitStr, 0, bitStr.size(), bitStr.size() / 2);
	}
	IP_1_Transform(bitStr);
	Bit64ToChar8(bitStr, block);

	return true;
}



bool DES::CreateSubKey(const std::string& key, char subKey[SUBKEY_NUM][SUBKEY_LENGHT])
{
	std::string tmpKey(key);
	if (tmpKey.size() < KEY_SZIE)
		tmpKey.append(KEY_SZIE - tmpKey.size(), '\0');
	else if (tmpKey.size() > KEY_SZIE)
		tmpKey = tmpKey.substr(0, KEY_SZIE);

	std::string bitStr;
	bitStr.resize(BIT_STR_SIZE);//64
	Char8ToBit64(tmpKey, bitStr);

	std::string PC1BitStr;
	PC1BitStr.resize(PC_1_SIZE);//56
	if (!PC1_Transform(bitStr, PC1BitStr))
		return false;

	for (int i = 0; i < SUBKEY_NUM; ++i)
	{
		LeftCycle(PC1BitStr, 0, PC_1_SIZE / 2, Move_Table[i]);
		LeftCycle(PC1BitStr, PC_1_SIZE / 2, PC_1_SIZE, Move_Table[i]);

		PC2_Transform(PC1BitStr, subKey[i]); // 48
	}

	return true;
}


//-------------------------------------------------------------------------------------转换工具-----------------------------------------------

bool DES::PC1_Transform(const std::string& bitStr, std::string& PC1BitStr)
{
	if (bitStr.size() != BIT_STR_SIZE || PC1BitStr.size() != PC_1_SIZE)
		return false;

	for (size_t i = 0; i < PC1BitStr.size(); ++i)
		PC1BitStr[i] = bitStr[PC1_Table[i]];

	return true;
}

bool DES::PC2_Transform(const std::string& PC1BitStr, char subKey[SUBKEY_LENGHT])
{
	if (PC1BitStr.size() != PC_1_SIZE)
		return false;

	for (size_t i = 0; i < PC_2_SIZE; ++i)
		subKey[i] = PC1BitStr[PC2_Table[i]];

	return true;
}


bool DES::IP_Transform(std::string& bitStr)
{
	if (bitStr.size() != BIT_STR_SIZE)
		return false;

	std::string tmpBitStr;
	tmpBitStr.resize(bitStr.size());
	for (size_t i = 0; i < bitStr.size(); ++i)
		tmpBitStr[i] = bitStr[IP_Table[i]];

	bitStr.swap(tmpBitStr);

	return true;
}

bool DES::Expand_Transform(const std::string& halfBitStr, std::string& eBitStr)
{
	if (halfBitStr.size() != BIT_STR_SIZE / 2 || eBitStr.size() != EXPAND_SIZE)
		return false;

	for (size_t i = 0; i < eBitStr.size(); ++i)
		eBitStr[i] = halfBitStr[Expand_Table[i]];

	return true;
}

bool DES::SBox_Transform(const std::string& eBitStr, std::string& halfBitStr)
{
	if (eBitStr.size() != EXPAND_SIZE || halfBitStr.size() != BIT_STR_SIZE / 2)
		return false;

	for (size_t i = 0; i < KEY_SZIE; ++i)
	{
		size_t j = i * 6;
		size_t row = (eBitStr[j] << 1) + eBitStr[j + eBitStr.size() / KEY_SZIE - 1];
		size_t column = (eBitStr[j + 1] << 3) + (eBitStr[j + 2] << 2) + (eBitStr[j + 3] << 1) + eBitStr[j + 4];

		int x = SBox_Table[i][row][column];


		halfBitStr[i * 4] = x >> 3;
		halfBitStr[i * 4 + 1] = (x >> 2) & 0x1;
		halfBitStr[i * 4 + 2] = (x >> 1) & 0x1;
		halfBitStr[i * 4 + 3] = x & 0x1;

	}
	return true;
}

bool DES::Permute_Transform(std::string& halfBitStr)
{
	if (halfBitStr.size() != BIT_STR_SIZE / 2)
		return false;

	std::string tmpStr;
	tmpStr.resize(halfBitStr.size());

	for (size_t i = 0; i < halfBitStr.size(); ++i)
		tmpStr[i] = halfBitStr[Permute_Table[i]];

	halfBitStr.swap(tmpStr);

	return true;
}

bool DES::IP_1_Transform(std::string& bitStr)
{
	if (bitStr.size() != BIT_STR_SIZE)
		return false;

	std::string tmpStr;
	tmpStr.resize(BIT_STR_SIZE);
	for (size_t i = 0; i < bitStr.size(); ++i)
		tmpStr[i] = bitStr[IP_1_Table[i]];

	bitStr.swap(tmpStr);

	return true;
}


//-------------------------------------------------------------------------------------基础工具------------------------------------------------

bool DES::Char8ToBit64(const std::string& str, std::string& bitStr)
{
	if (str.size() != KEY_SZIE || bitStr.size() != BIT_STR_SIZE)
		return false;

	for (size_t i = 0; i < str.size(); ++i)
	{
		for (size_t j = 0; j < BITS_PER_CHAR; ++j)
			bitStr[i * BITS_PER_CHAR + j] = (str[i] >> j) & 0x1;
	}
	return true;
}

bool DES::Bit64ToChar8(const std::string& bitStr, std::string& str)
{
	if (bitStr.size() < BIT_STR_SIZE || str.size() != KEY_SZIE)
		return false;

	str = "";
	str.resize(KEY_SZIE);

	for (size_t i = 0; i < KEY_SZIE; ++i)
	{
		for (size_t j = 0; j < BITS_PER_CHAR; ++j)
			str[i] |= bitStr[i * KEY_SZIE + j] << j;
	}

	return true;
}

bool DES::LeftCycle(std::string& str, size_t beginSection, size_t endSection, size_t step)
{
	if (endSection > str.size())
		return false;

	size_t tmpStep = step % (endSection - beginSection);
	std::string tmpStr = str.substr(beginSection + tmpStep, endSection - beginSection - tmpStep);

	tmpStr.append(str.substr(beginSection, tmpStep));

	for (size_t i = beginSection; i < endSection; ++i)
		str[i] = tmpStr[i - beginSection];

	return true;
}

bool DES::XOR(std::string& strFirst, std::string& strSecond, size_t num)
{
	if (strFirst.size() < num || strSecond.size() < num)
		return false;

	for (size_t i = 0; i < num; ++i)
		strFirst[i] ^= strSecond[i];

	return true;
}

HwEncDec.cpp

#pragma once
#include <iostream>
#include "HwEncDec.h"
#include "DES.h"

using namespace std;

//

int HwEncDec::EncData(unsigned char* plain, int plainlen, unsigned char* cryptdata, int* cryptlen)
{
	int ret = 0;
	std::string s1((char*)plain);
	std::string key = "19970505";
	DES p;

	//加密
	ret = p.Encrypt(plain, plainlen, cryptdata, cryptlen, key);
	if (ret != 0)
	{
		cout << "Encrypt() err:" << ret << endl;
		return ret;
	}
	return ret;
}

int HwEncDec::DecData(unsigned char* cryptdata, int cryptlen, unsigned char* plain, int* plainlen)
{
	int ret = 0;
	std::string s1((char*)plain);
	std::string key = "19970505";
	DES p;

	//解密
	ret = p.Decrypt(cryptdata, cryptlen, plain, plainlen, key);
	if (ret != 0)
	{
		cout << "HwEncDec Encrypt() err:" << ret << endl;
		return ret;
	}
	return ret;
}

mainclass03.cpp (框架类)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "CSocketProtocol.h"
#include "CSckFactoryImp1.h"
#include "CSckFactoryImp2.h"
#include "HwEncDec.h"
using namespace std;

class MainOp
{
public:
	MainOp()
	{
		sp = NULL;
		ed = NULL;
	}
	MainOp(CSoketProtocl* sp, CEncDesProtocol* ed)
	{
		this->sp = sp;
		this->ed = ed;
	}

	void setSP(CSoketProtocl* sp)
	{
		this->sp = sp;
	}

	void setED(CEncDesProtocol* ed)
	{
		this->ed = ed;
	}

	int SckSendAndRec_EncDec3(CSoketProtocl* sp, CEncDesProtocol* ed, unsigned char* in, int inlen, unsigned char* out, int* outlen);
	int SckSendAndRec_EncDec3(unsigned char* in, int inlen, unsigned char* out, int* outlen);
private:
	CSoketProtocl* sp;
	CEncDesProtocol* ed;
};

//面向抽象类编程,框架实现完毕
int MainOp::SckSendAndRec_EncDec3(CSoketProtocl* sp, CEncDesProtocol* ed, unsigned char* in, int inlen, unsigned char* out, int* outlen)
{
	int ret = 0;
	unsigned char data[4096];
	int datalen = 0;

	ret = sp->cltSoketInit();
	if (ret != 0)
	{
		goto End;
	}

	ret = ed->EncData(in, inlen, data, &datalen);
	if (ret != 0)
	{
		goto End;
	}

	ret = sp->cltSoketSend(data, datalen);//发送加密数据
	if (ret != 0)
	{
		goto End;
	}

	ret = sp->cltSoketRev(data, &datalen);//接收密文
	if (ret != 0)
	{
		goto End;
	}

	ret = ed->DecData(data, datalen, out, outlen);
	if (ret != 0)
	{
		goto End;
	}

End:
	ret = sp->cltSoketDestroy();

	return 0;
}

int MainOp::SckSendAndRec_EncDec3(unsigned char* in, int inlen, unsigned char* out, int* outlen)
{
	int ret = 0;
	unsigned char data[4096];
	int datalen = 0;

	ret = this->sp->cltSoketInit();
	if (ret != 0)
	{
		goto End;
	}

	ret = this->ed->EncData(in, inlen, data, &datalen);
	if (ret != 0)
	{
		goto End;
	}

	ret = this->sp->cltSoketSend(data, datalen);//发送加密数据
	if (ret != 0)
	{
		goto End;
	}

	ret = this->sp->cltSoketRev(data, &datalen);//接收密文
	if (ret != 0)
	{
		goto End;
	}

	ret = this->ed->DecData(data, datalen, out, outlen);
	if (ret != 0)
	{
		goto End;
	}

End:
	ret = this->sp->cltSoketDestroy();

	return 0;
}

int main()
{
	int ret = 0;
	unsigned char in[4096];
	int inlen;
	unsigned char out[4096];
	int outlen = 0, outlen2 = 0;

	strcpy((char*)in, "I am the best one!");
	inlen = (const int)strlen((char*)in);

	MainOp* myMainOp = new MainOp;

	CSoketProtocl* sp = NULL;
	CEncDesProtocol* ed = NULL;

	sp = new CSckFactoryImp1;
	ed = new HwEncDec;

	myMainOp->setSP(sp);//注入框架
	myMainOp->setED(ed);

	ret = myMainOp->SckSendAndRec_EncDec3(in, inlen, out, &outlen);
	if (ret != 0)
	{
		cout << "SckSendAndRec() err:" << ret << endl;
	}

	delete ed;
	delete sp;
	delete myMainOp;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

banjitino

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值