当前位置: 首页 > 工具软件 > EDE > 使用案例 >

使用Crypto++实现3DES ECB EDE2加密及POS MAC算法

琴刚豪
2023-12-01

注意编译需要引用Crypto++的静态库


引入头文件:

#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include "default.h" 
#include "modes.h"
#include "cryptlib.h"
#include "filters.h"
#include "hex.h"
#include "bench.h"
#include "osrng.h"
#include "md5.h"
#include "cmac.h"
#include "ttmac.h"
#include "vmac.h"
#include "hmac.h"
#include "cbcmac.h"
#include "dmac.h"
#include "files.h"
using namespace std;
using namespace CryptoPP;

封装的DES_EDE2函数:


bool DES_EDE2(bool enc, const char* keystr, int datalen, char* data, char **encdata)
	{
		// 得到密钥
		StringSource sskey(keystr, true, new HexDecoder);
		SecByteBlock key((size_t)sskey.MaxRetrievable());
		sskey.Get(key, key.size());
		//
		ECB_Mode<CryptoPP::DES_EDE2>::Encryption DES_ECB_ENC;
		ECB_Mode<CryptoPP::DES_EDE2>::Decryption DES_ECB_DEC;
		DES_ECB_ENC.SetKey(key, key.size());
		DES_ECB_DEC.SetKey(key, key.size());
		//
		*encdata = new char[datalen];
		memset(*encdata, 0, 8);
		//
		if (enc) DES_ECB_ENC.ProcessData((byte*)*encdata, (byte*)data, datalen);
		else DES_ECB_DEC.ProcessData((byte*)*encdata, (byte*)data, datalen);
		//
		return true;
	}


封装的POS MAC算法:

	// POS 终端MAC算法
	bool POS_MAC(const char* keystr, const char* data, UINT datalen, byte *encdata)
	{
		char* src;
		// 数据补位
		int mod = datalen % 8;
		UINT len = datalen;
		if (mod) len= datalen + 8 - mod;
		src = new char[len];
		memcpy(src, data, datalen);
		if(datalen!=len) memset(src + datalen, 0, len - datalen);
		// 每8字节进行XOR操作
		UINT g = len >> 3; // 得到分组数
		char BLOCK[8];
		memcpy(BLOCK, src, 8);
		UINT i, j;
		for (i = 1; i < g; i++)
		{
			for (j = 0; j < 8; j++)
			{
				BLOCK[j] = BLOCK[j] ^ *(src + j+ i * 8);
			}
		}
		//		
		char HI[8], LO[8];
		string BLOCKHEX=HexFromBytes((byte*)BLOCK, 8);
		memcpy(HI, BLOCKHEX.c_str(), 8);
		memcpy(LO, BLOCKHEX.c_str()+8, 8);
		// 前8字节加密
		char *desdata=NULL;
		DES_EDE2(true, keystr, 8, HI, &desdata);
		// 加密结果与后8字节XOR
		for (j = 0; j < 8; j++) LO[j] = LO[j] ^*(desdata + j);
		// 再次加密
		DES_EDE2(true, keystr, 8, LO, &desdata);
		// 结果转字符串
		BLOCKHEX = HexFromBytes((byte*)desdata, 8);
		//
		memcpy(encdata, BLOCKHEX.c_str(), 8);
		//
		delete[] src;
		return true;
	}
}


 类似资料: