标签:des blog ar 使用 数据 div on log ad
#ifndef _DIGESTCALC_H
#define _DIGESTCALC_H
/**********************************
/* 使用示例:(sm3算法)
/* DigestCalc hashcl;
/* hashcl.Init(DigestCalc::alg_id::sm3);
/* hashcl.Update(in,inl);
/* vector<unsigned int> out(hashcl.GetHashLength());
/* hashcl.Final(out.data());
/**********************************/
class _DigestCalc;
class DigestCalc
{
public:
class alg_id
{
friend class DigestCalc;
explicit alg_id(int i):_id(i){}
int _id;
public:
static const alg_id sm3;
static const alg_id sha;
static const alg_id sha1;
static const alg_id sha224;
static const alg_id sha256;
static const alg_id sha384;
static const alg_id sha512;
static const alg_id md2;
static const alg_id md4;
static const alg_id md5;
static const alg_id rc2;
static const alg_id rc4;
static const alg_id rc5;
static const alg_id dsa;
static const alg_id mdc2;
static const alg_id ecdsa;
};
public:
DigestCalc();
~DigestCalc();
//@param alg 算法标识
//@return 出错返回false,成功返回true
bool Init(alg_id id);
//@param in 输入缓冲区地址
//@param inl 输入数据长度
//@return 出错返回false,成功返回true
bool Update(const unsigned char *in,unsigned int inl);//增加被计算数据。
//@param out 输出缓冲区地址
//@return 出错返回false,成功返回true
bool Final(unsigned char *out);//计算出哈希结果,存放在out指向的缓冲区中。
int GetHashLength()const;//在调用Final前先调用此函数获取哈希长度,保证哈希的缓冲区够长。
private:
_DigestCalc *_impl;
DigestCalc(const DigestCalc &);
DigestCalc &operator=(const DigestCalc &);
};
#endif
#ifndef _CIPHERCALC_H
#define _CIPHERCALC_H
/**********************************
/* 使用示例:(sm4算法cbc模式加密)
/* CipherCalc cipher;
/* outl=0;
/* cipher.Init(CipherCalc::alg_id::sm4_cbc,key,iv,CipherCalc::ENCRYPT,CipherCalc::PADMODE::OPENSSL_PADDING);
/* cipher.Update(in,inl,out,&outl);
/* cipher.Final(out+outl,&outl);
/**********************************/
class _CipherCalc;
class CipherCalc
{
public:
//表示进行加密运算还是解密运算
class ENCMODE
{
friend class CipherCalc;
int enc;
explicit ENCMODE(int x):enc(x){}
public:
static const ENCMODE ENCRYPT;//加密
static const ENCMODE DECRYPT;//解密
};
//表示数据的填充方式
class PADMODE
{
friend class CipherCalc;
int padding;
explicit PADMODE(int x):padding(x){}
public:
static const PADMODE NO_PADDING;//用户自己填充数据,保证数据长度为分组长度的整数倍,否则运算出错。
static const PADMODE OPENSSL_PADDING;//openssl填充算法,填充数据至分组长度的整数倍。如果数据本身的长度就是分组
//长度的整数倍,就追加一个分组。填充的所有字节值都等于追加的数据的长度。
};
//表示使用哪种对称算法
class alg_id
{
friend class CipherCalc;
explicit alg_id(int id):_id(id){}
int _id;
public:
static const alg_id sm4_ecb;//国密SM4 ECB模式
static const alg_id sm4_cbc;//国密SM4 CBC模式
static const alg_id des_cfb;
static const alg_id des_cfb1;
static const alg_id des_cfb8;
static const alg_id des_ede_cfb;
static const alg_id des_ede3_cfb;
static const alg_id des_ede3_cfb1;
static const alg_id des_ede3_cfb8;
static const alg_id des_ofb;
static const alg_id des_ede_ofb;
static const alg_id des_ede3_ofb;
static const alg_id desx_cbc;
static const alg_id des_cbc; //单DES CBC模式
static const alg_id des_ede_cbc; //3DES CBC模式
static const alg_id des_ede3_cbc;
static const alg_id des_ecb; //单DES ECB模式
static const alg_id des_ede;
static const alg_id des_ede3; //3DES ECB模式
static const alg_id rc4;
static const alg_id rc4_40;
static const alg_id rc4_hmac_md5;
static const alg_id idea_ecb;
static const alg_id idea_cfb;
static const alg_id idea_ofb;
static const alg_id idea_cbc;
static const alg_id seed_ecb;
static const alg_id seed_cfb;
static const alg_id seed_ofb;
static const alg_id seed_cbc;
static const alg_id rc2_ecb;
static const alg_id rc2_cfb;
static const alg_id rc2_ofb;
static const alg_id rc2_cbc;
static const alg_id rc2_40_cbc;
static const alg_id rc2_64_cbc;
static const alg_id bf_ecb;
static const alg_id bf_cfb;
static const alg_id bf_ofb;
static const alg_id bf_cbc;
static const alg_id cast5_ecb;
static const alg_id cast5_cfb;
static const alg_id cast5_ofb;
static const alg_id cast5_cbc;
static const alg_id rc5_32_12_16_ecb;
static const alg_id rc5_32_12_16_cfb;
static const alg_id rc5_32_12_16_ofb;
static const alg_id rc5_32_12_16_cbc;
static const alg_id aes_128_ecb;
static const alg_id aes_128_cbc;
static const alg_id aes_128_cfb;
static const alg_id aes_128_cfb1;
static const alg_id aes_128_cfb8;
static const alg_id aes_128_ofb;
static const alg_id aes_128_ctr;
static const alg_id aes_128_gcm;
static const alg_id aes_128_xts;
static const alg_id aes_192_ecb;
static const alg_id aes_192_cbc;
static const alg_id aes_192_cfb;
static const alg_id aes_192_cfb1;
static const alg_id aes_192_cfb8;
static const alg_id aes_192_ofb;
static const alg_id aes_192_ctr;
static const alg_id aes_192_gcm;
static const alg_id aes_256_ecb;
static const alg_id aes_256_cbc;
static const alg_id aes_256_cfb;
static const alg_id aes_256_cfb1;
static const alg_id aes_256_cfb8;
static const alg_id aes_256_ofb;
static const alg_id aes_256_ctr;
static const alg_id aes_256_gcm;
static const alg_id aes_256_xts;
static const alg_id camellia_128_ecb ;
static const alg_id camellia_128_cbc ;
static const alg_id camellia_128_cfb ;
static const alg_id camellia_128_cfb1;
static const alg_id camellia_128_cfb8;
static const alg_id camellia_128_ofb ;
static const alg_id camellia_192_ecb ;
static const alg_id camellia_192_cbc ;
static const alg_id camellia_192_cfb ;
static const alg_id camellia_192_cfb1;
static const alg_id camellia_192_cfb8;
static const alg_id camellia_192_ofb ;
static const alg_id camellia_256_ecb ;
static const alg_id camellia_256_cbc ;
static const alg_id camellia_256_cfb ;
static const alg_id camellia_256_cfb1;
static const alg_id camellia_256_cfb8;
static const alg_id camellia_256_ofb ;
};
public:
CipherCalc();
~CipherCalc(void);
//@param alg 算法标识
//@param key 密钥
//@param iv cbc算法初始向量,如果iv==NULL,则表示iv值为全0。
//@param enc ENCRYPT表示加密运算,DECRYPT表示解密运算
//@param padding 数据填充方式,默认为用户自己填充,即CipherCalc不对输入数据做任何修正。
//@return 出错返回false,成功返回true
bool Init(alg_id alg,unsigned char *key,const unsigned char *iv, ENCMODE enc ,PADMODE padding = PADMODE::NO_PADDING);
//@param in 输入缓冲区地址
//@param inl 输入数据长度
//@param out 输出缓冲区地址
//@param outl 返回 *outl+输出数据长度
//@return 出错返回false,成功返回true
bool Update(const unsigned char *in,int inl,unsigned char *out,int *outl);
//@param out 输出缓冲区地址
//@param outl 返回 *outl+输出数据长度
//@return 出错返回false,成功返回true
bool Final(unsigned char *out,int *outl);
private:
_CipherCalc *_impl;
CipherCalc(const CipherCalc &);
CipherCalc &operator=(const CipherCalc &);
};
#endif
标签:des blog ar 使用 数据 div on log ad
原文地址:http://www.cnblogs.com/vsuu/p/4088377.html