码迷,mamicode.com
首页 > 编程语言 > 详细

自己封装的openssl+国密算法的C++接口

时间:2014-11-10 23:02:20      阅读:922      评论:0      收藏:0      [点我收藏+]

标签:des   blog   ar   使用   数据   div   on   log   ad   

Digest

#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

  

Cipher

#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

  

自己封装的openssl+国密算法的C++接口

标签:des   blog   ar   使用   数据   div   on   log   ad   

原文地址:http://www.cnblogs.com/vsuu/p/4088377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!