注意编译需要引用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;
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; } }