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

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

  

时间: 2024-10-13 12:00:49

自己封装的openssl+国密算法的C++接口的相关文章

嵌入式设备中支持国密算法的方法

如今国密系列算法的应用已不仅仅局限于金融和电信等领域,诸如车载设备,消费类电子设备等越来越多的产品开始要求有国密算法的支持.但是国密算法的开源资料和应用案例少之又少,如何快速高效的在自己的设备中加入国密算法已经成为众多开发者必须要面对的难题.现在为大家准备了一个系列文章,介绍嵌入式设备中移植国密算法的方法.简单来说,分为三种方法:1.移植Miracl库2.移植Openssl库3.使用加密芯片下面进行简介:1.移植Miracl库MIRACL(Multiprecision Integer and R

嵌入式设备中支持国密算法的方法(三)

本篇文章是介绍国密算法在嵌入式设备中应用方法系列文章的第三篇,介绍移植openssl库到嵌入式设备中的具体方法,当然最终的目的还是使我们的设备能支持国密算法.同上一篇文章中介绍的miracl密码库相比,openssl库的应用更加广泛,资料支持度更好,但是代码体量要大于miracl库.需要再次说明的是,同miracl库一样,openssl的库也并不能直接提供国密算法的接口,我们是利用库中相应的API接口(如椭圆曲线等)来构建自己的国密算法,下面我们具体介绍移植的步骤.第一步 获取库作为应用广泛的开

国密算法SM2证书制作

国密算法sm2非对称算法椭圆曲线 原文:http://www.jonllen.cn/jonllen/work/162.aspx 前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密算法DES(AES)和摘要MD5(SHA1)也相应改变,分别对应SM1.SM3算法,SM1算法基于硬件实现,SM2.SM3算法已公开. SM2签名验证算法 SM2签名同样也

国密算法的ekey的使用--简述

一.龙脉GMTools的使用 1.产品介绍 mToken GM3000 国密身份认证锁是龙脉科技自主研发设计支持国密算法.完全遵照国家密码管理局颁布的<智能IC卡及智能密码钥匙密码应用接口规范>要求设计的USB Key,采用国产高性能智能卡芯片,内置SSF33.SM1.SM2.SM3.SM4等国产算法,支持高速数据国密算法加解密,提供CSP以及PKCS11和国密接口,完全符合国家密码管理局关于"密钥不落地"的技术规范要求,是电子政务.电子军务.CA厂商首选的USB Key产

国密算法的ekey基本使用的说明

概述 本次需要进行的实验研究是国密算法的ekey的使用.对于一个或者多个应用来说,每个应用可以包含一个或多个容器(Container),每个容器中可以存放两对分别用于加密和签名的密钥对,以及两个相应的证书或证书链.每一个容器只能为ECC或RSA一种类型,一个容器中不能混用ECC密钥和RSA密钥.根据个人的理解,ekey的作用就是生成容器,将需要加密的消息或文件利用相应的加密算法加密后,生成证书,将证书导入ekey的容器中.这样以便于在其他终端上用到该文件时,使用ekey,其容器中的对应的证书可以

嵌入式设备中支持国密算法的方法(二)

上一篇文章中我们为大家介绍了嵌入式设备中支持国密算法的几种方法.本篇我们详细的介绍一下第一种方法:移植Miracl库的具体操作步骤.第一步 获取源码MIRACL密码库是开源软件,可以直接到官网下载,也可在csdn等论坛中获取.第二步 利用MIRACL库函数实现SM2算法实现sm2的功能需要用到MIRACL库中的36个源文件,例如mraes.c.mrec2.c.mrarth0.c.mrcore.c.mrshs.c.mezzn2.c.mrxgcd.c.mrgcm.c.mrio1.c等.然后需要新建一

SM2证书的鉴定方法——续上文国密算法

上问说到了国家有自己的加密算法,那么本文就描述了如何鉴别SM2的证书算法是什么样的.. 国密局规定,SM2证书中签名算法OID为1.2.156.10197.1.501,公钥算法的OID为1.2.840.10045. 2.1.目前大部分的厂商都还不识别这两个算法,能识别的系统直接显示的是SM2算法. Windows鉴定 SM2证书在Windows系统上,可以通过查看证书属性中的签名算法和公钥算法来判断是否为SM2的证书.直接双击证书,安装到IE中,查看证书信息,XP系统2003 server以下的

2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对称密码算法原理 国密SM2算法是商用的ECC椭圆曲线公钥密码算法,其具有公钥加密.密钥交换以及数字签名的功能.椭圆曲线参数并没有给出推荐的曲线,曲线参数的产生需要利用一定的算法产生.但在实际使用中,国密局推荐使用素数域256 位椭圆曲线,其曲线方程为y^2= x^3+ax+b.参数如下: 其中p是大

国密算法

算法分类 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用. SM2为非对称加密,基于ECC.该算法已公开.由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA.ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA. SM3 消息摘要.可以用MD5作为对比理解.该算法已公