⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evp.h

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 H
字号:
// Evp.h: interface for the CEvp class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_)
#define AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include ".\Control\ProgressCtrlST\ProgressCtrlST.h"

class CEvp  
{
public:
	CEvp();
	virtual ~CEvp();
public:
	void static SetProgRess(CProgressCtrlST * pProgress);
	struct stuCertLink
	{
		char * pCert;//合法用户公钥
		UINT CertLen;//公钥长度
		stuCertLink * Link;
		stuCertLink()
		{
			memset(this,0,sizeof(stuCertLink));
		}
		
		stuCertLink(const stuCertLink & Link)
		{
			this->pCert = Link.pCert;
			this->CertLen = Link.CertLen;
			this->Link = Link.Link;
		}
		
		stuCertLink(const char * pcert, const UINT certLen)
		{
			this->CertLen = certLen;
			this->pCert = new char[strlen(pcert)+1];
			strcpy(this->pCert,pcert);
			Link = NULL;
		}
		
		~stuCertLink()
		{
			delete [] this->pCert;
		}
		
		
		void AddCert(stuCertLink *& Head, const char * pCert, const UINT uCertLen = 0)
		{
			stuCertLink * End = new stuCertLink(pCert, uCertLen);//钥增加的节点
			if(Head == NULL)
			{
				Head = End;
			}
			else 
			{
				stuCertLink * p = Head;
				while(p->Link != NULL)  
					p = p->Link;
				p->Link = End; 
			}
		}
		
		void RemoveAll(stuCertLink *& Head)
		{
			while(Head!=NULL)//遍历链表
			{
				stuCertLink * temp = NULL;
				temp = Head;
				Head = Head->Link;
				delete temp;
			}
		}
	};

	/*算法支持 内存 -> 内存  文件 -> 文件*/

	static BOOL Crypt(const char * cpName, const char * inStream, UINT inLen, 
		   char * outStream, UINT & outLen, char * pwd, const int type,
		   char * outMsg);


	/*消息摘要*/
	static BOOL Digest(const char * mdname/*摘要算法*/,
				const char * infoin/*输入,文件或内存*/,
				UINT inlen/*文件时候为0,内存为长度*/,
				unsigned char * md_value/*返回摘要*/,
				unsigned int * md_len/*摘要长度*/,
				char * outMsg);

	/*数字签名*/
	static BOOL Sign(const char * key/*私钥*/,
			  const int keylen/*0-内存私钥*/,
			  const char * pwd,
			  const char * mdname/*签名算法*/,
			  const char * infoin/*输入文件*/,
			  int inlen,/*输入长度,0->内存*/
			  char * infout/*输出*/,
			  UINT & outlen/*输出长度,输入文件时=0*/,
			  char * outMsg);

	/*数字签名验证*/
	static BOOL VerifySign(const char * cert/*公钥*/,
					const int certlen,
					const char * pwd,
					const char * mdname/*签名算法*/,
					const char * infoin,/*原始信息*/ 
					int inlen/*输入长度0->文件*/,
					char * sign/*签名结果*/,
					char * outMsg);

	/*数字信封 - 多证书 */
	static BOOL Seal(stuCertLink * pCERT/*[in]合法用户公钥链*/,
			  char * cpname/*算法名称*/,
			  char * filein/*输入文件*/, 
			  char * fileout/*输出文件*/,
			  char * outMsg);

	/*拆封数字信封 - 多证书*/
	static BOOL OpenSeal(char * key/*私钥*/, int keylen, char * pwd/*私钥密码*/, 
				   char * cpname/*算法名称*/, char * filein/*输入文件*/, 
				   char * fileout/*输出文件*/,char * outMsg);

	//公钥加密
	static BOOL RSAPubEnc(const BYTE * pCertBuf/*[in]公钥*/,
				   const UINT nCertLen/*[in]公钥长度*/,
				   const char * pPwd/*[in]公钥密码,只针对PFX包文件*/,
				   const BYTE * pInStream/*[in]输入文件或内存*/,
				   DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
				   BYTE * pOutStream/*[out]加密后的数据*/,
				   DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
				   char * OperMsg/*[out]返回操作错误信息*/);

	//私钥解密
	static BOOL RSAPrivDec(const BYTE * pKeyBuf/*[in]私钥*/,
					const UINT nKeyLen/*[in]私钥长度*/,
					const char * pPwd/*[in]私钥密码*/,
					const BYTE * pInStream/*[in]输入文件或内存*/,
					DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
					BYTE * pOutStream/*[out]解密后的数据*/,
					DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out解密后数据长度*/,
					char * OperMsg/*[out]返回操作错误信息*/);

	//私钥加密(签名)
	static BOOL RSAPrivEnc(const BYTE * pKeyBuf/*[in]私钥*/,
					const UINT nKeyLen/*[in]私钥长度*/,
					const char * pPwd/*[in]私钥密码*/,
					const BYTE * pInStream/*[in]输入文件或内存*/,
					DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
					BYTE * pOutStream/*[out]加密后的数据*/,
					DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
					char * OperMsg/*[out]返回操作错误信息*/);

	//公钥解密
	static BOOL RSAPubDec(const BYTE * pCertBuf/*[in]公钥*/,
				   const UINT nCertLen/*[in]公钥长度*/,
				   const char * pPwd/*[in]公钥密码,只针对PFX包文件*/,
				   const BYTE * pInStream/*[in]输入文件或内存*/,
				   DWORD nInlen/*[in]数据长度,为0表示pInStream为文件名*/,
				   BYTE * pOutStream/*[out]加密后的数据*/,
				   DWORD & nOutlen/*[in,out]in为0时候表示pOutStream为文件名,out加密后数据长度*/,
				   char * OperMsg/*[out]返回操作错误信息*/);

	//得到公钥加密后的缓冲区长度 加密 117 -> 128, 解密 128 -> 117 ,所以解密后缓冲区一定小于源缓冲区
	static DWORD GetEncLen(const char * pCertBuf, const UINT nCertLen, const DWORD nInlen);

	//目录操作
	static BOOL InitCrypt2(const CString strCpName, CString strPwd, const int type, EVP_CIPHER_CTX & cipherCtx);
	static DWORD Crypt2(EVP_CIPHER_CTX * pcipherCtx, const CString & strFileName,
						CFile & File, DWORD dBolckLen, CString & outStr);
	static void CleanCrypt2(EVP_CIPHER_CTX & cipherCtx);

	
	static BOOL InitDigest2(CString strMdName, EVP_MD_CTX & mdCtx);
	static DWORD Digest2(EVP_MD_CTX * mdCtx, const CString strFileName,
			CFile & File, CString & outStr);
	static BOOL VerifyDigest2(EVP_MD_CTX * mdCtx, const CString strFileName,
			CFile & File, DWORD dBolckLen, CString & outStr);
	static void CleanDigest2(EVP_MD_CTX & mdCtx);

	static BOOL InitSign2(CString strMdName, EVP_MD_CTX & md_Ctx, const char * key,
				  const int keylen, const char * pwd, X509 *& x509, EVP_PKEY *& pkey);
	static DWORD Sign2(EVP_MD_CTX * pCtx, EVP_PKEY *& pkey, const CString strFileName,
				  CFile & File, CString & outStr);
	static BOOL VerifySign2(EVP_MD_CTX * pCtx, EVP_PKEY *& pkey, const CString strFileName,
				  CFile & File, DWORD dBolckLen, CString & outStr);
	static void CleanSign2(EVP_MD_CTX & md_Ctx, X509 *& px509, EVP_PKEY *& pkey);


	static BOOL InitSeal2(stuCertLink * pCERT, const CString strCpName,
			  CFile & File, EVP_CIPHER_CTX & eCtx, CString & outStr);
	static DWORD Seal2(EVP_CIPHER_CTX * pCtx,const CString strFileName, CFile & File, CString & outStr);
	static void CleanSeal2(EVP_CIPHER_CTX & sealCtx);

	static BOOL InitOpenSeal2(char * key, int keylen, char * pwd, const CString strCpName,
			  CFile & File, EVP_CIPHER_CTX & eCtx, CString & outStr);
	static DWORD OpenSeal2(EVP_CIPHER_CTX & eCtx, CFile & File, DWORD dBolckLen, 
				const CString strFileName, CString & outStr);
	static void CleanOpenSeal2(EVP_CIPHER_CTX & eCtx);

	static BOOL GetPubRsa(const BYTE * pCertBuf, const UINT nCertLen, RSA *& pRsa);
	static BOOL GetPrivRsa(const BYTE * pKeyBuf,const UINT nKeyLen, const char * pPwd, RSA *& pRsa);

	static void FreeRsa(RSA *& pRsa);

	static DWORD RSAPubEnc2(RSA * pRsa, const CString strFileName, CFile & File, CString & outStr);
	static DWORD RSAPrivDec2(RSA * pRsa, CFile & File, DWORD dBolckLen, const CString strFileName, CString & outStr);

	static DWORD RSAPrivEnc2(RSA * pRsa, const CString strFileName, CFile & File, CString & outStr);
	static DWORD RSAPubDec2(RSA * pRsa, CFile & File, DWORD dBolckLen, const CString strFileName, CString & outStr);

private:
	static void DrawProg(float fPot);
	static CProgressCtrlST * m_pProgress;
};

#endif // !defined(AFX_EVP_H__3857E3C8_085F_4691_ABCF_5D7F2E9536BA__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -