Crypto++を用いて3 DES ECB EDE 2暗号化及びPOS MACアルゴリズムを実現
2442 ワード
注意コンパイルにはCrypto++を参照する静的ライブラリが必要です
ヘッダファイルのインポート:
パッケージのDES_EDE 2関数:
パッケージングされたPOS MACアルゴリズム:
ヘッダファイルのインポート:
#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_EDE 2関数:
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;
}
}