亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? evp.cpp

?? 關于小型CA系統的若干說明和DLL源碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Evp.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <OPENSSL/evp.h>
#include <openssl/pem.h>
#include <string.h>
#include <io.h>
#include "evp.h"
#include <openssl/pkcs12.h>
#include <openssl/rand.h>



BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

/*此函數可以將DER、PEM、P12文件公鑰讀出來*/
X509 *load_cert(BIO *cert/*輸入BIO*/, int format/*格式*/,char * pwd,/*P12密碼*/
				char * outMsg) //從DER、PEM、P12格式中讀取公鑰證書
{
	X509 * x=NULL;
	if 	(format == DER)
		x=d2i_X509_bio(cert,NULL);
	else if (format == PEM)
		x=PEM_read_bio_X509(cert,NULL,NULL,NULL);//PEM_read_bio_X509_AUX
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(cert, NULL);
		PKCS12_parse(p12, pwd, NULL, &x, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for input cert\n");
		goto end;
	}
end:
	if (x == NULL)
	{
		sprintf(outMsg,"unable to load certificate\n");
	}
	return(x);
}

X509 * LoadCert(char * cert,int certlen,char * outMsg)//枚舉DER/PEM格式
{
	BIO * in=NULL;
	X509 * x509=NULL;

	if(certlen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(cert, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(cert,certlen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}
	if((x509=load_cert(in,DER,NULL,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//恢復bio
		x509=load_cert(in,PEM,NULL,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return x509;
}

EVP_PKEY *load_key(BIO *bio, int format, char *pass,char * outMsg)//枚舉DER/PEM格式
{
	EVP_PKEY *pkey=NULL;

	if (format == DER)
	{
		pkey=d2i_PrivateKey_bio(bio, NULL);
	}
	else if (format == PEM)
	{
		pkey=PEM_read_bio_PrivateKey(bio,NULL,NULL,pass);
	}
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(bio, NULL);
		PKCS12_parse(p12, pass, &pkey, NULL, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for key\n");
		goto end;
	}
end:
	if (pkey == NULL)
		sprintf(outMsg,"unable to load Private Key\n");
	return(pkey);
}

EVP_PKEY * LoadKey(char * key,int keylen,char * pass,char * outMsg)
{
	EVP_PKEY *pkey=NULL;
	BIO * in=NULL;

	if(keylen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(key, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(key,keylen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}

	if((pkey=load_key(in,DER,pass,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//BIO是可讀寫的,那么該BIO所有數據都會被清空;
						//如果該BIO是只讀的,那么該操作只會簡單將指
						//針指向原始位置,里面的數據可以再讀.
		pkey=load_key(in,PEM,pass,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return pkey;
}

/*對稱算法*/
/*
關于加密模式
	電子密碼本 Electronic Code Book(ECB) -每64位使用的密鑰都是相同的,密文跟明文一一對
										 應的關系,容易破解
	加密塊鏈   Cipher Block Chaining(CBC)-需要一個初始化向量,密文跟明文不是一一對應的
	                                     關系,破解起來更困難,缺點:不能實時解密,也就是說,
										 必須等到每8個字節都接受到之后才能開始加密
    加密反饋   Cipher Feedback Mode(CFB)-能夠實現字符的實時加密和解密,1個比特發生錯誤了,
										會影響其本身對應的8個字節的數據,魯棒性太差
    輸出反饋   Output Feedback Mode(OFB)-沒有采用密文作為加密的數據;1個比特發生錯誤了,
										那么只會影響其本身對應的一個比特;數據之間相關性小,
										這種加密模式是比較不安全的,一般不提倡*/

bool Crypt(char * cpname/*算法名稱*/,char * filein/*輸入文件*/, char * fileout/*輸出文件*/,
		   char * pwd/*用于初始iv的密碼*/, int type/*1-加密、0-解密*/,char * outMsg,
		   PDrawProg DrawProg/*回調函數*/)
{
	unsigned char inbuf[1024]="";
	unsigned char outbuf[1024 + EVP_MAX_BLOCK_LENGTH]="";//所有算法最長的塊長度。
	unsigned char key[EVP_MAX_KEY_LENGTH]="";//算法最長的KEY長度
    unsigned char iv[EVP_MAX_IV_LENGTH]="";//算法最長的IV長度
	int inlen=0, outlen=0;
	bool ret=true;
	const EVP_CIPHER *cipher=NULL;
	EVP_CIPHER_CTX ctx;
	memset(&ctx,0,sizeof(ctx));
	double fileLen=0;//文件長度
	double finishLen=0;//完成長度
	FILE *outfd,*infd;
	
	if(strlen(filein)==0||strlen(fileout)==0)
	{
		strcpy(outMsg,"NO specify input or output file");
		return false;
	}

    if ((infd = fopen (filein, "rb")) == NULL)//原文
	{
		strcpy(outMsg,"open input file error");
		return false;
	}
	fileLen=filelength(fileno(infd));//得到文件長度
	if ((outfd = fopen (fileout, "wb")) == NULL)//密文
	{
		strcpy(outMsg,"open output file error");
		fclose(infd);
		return false;
	}

	OpenSSL_add_all_algorithms();//add digests   and ciphers
	cipher=EVP_get_cipherbyname(cpname);
	if(cipher==NULL)
	{
		sprintf(outMsg,"Unknown cipher name %s\n",cpname);
		ret=false;
		goto err;
	}
	
	//表示產生的 key 是給哪一種 cipher 用的
	//過程中所使用的 hash 演算法,
	//用來加密的 salt,至少為八個 bytes,否則必須NULL,
	//重覆幾次 hashing 的動作,愈多次愈花時間,但相對地也愈安全
	if(!EVP_BytesToKey(cipher,EVP_md5(),NULL,(unsigned char *)pwd,
		strlen(pwd),1,key,iv))
	{
		strcpy(outMsg,"初始化key or iv 失敗");
		ret=false;
		goto err;
	}
	
	EVP_CIPHER_CTX_init(&ctx);//初始化一個EVP_CIPHER_CTX結構體
	
	//type為1,則加密;如果type為0,則解密;如果type是-1,則不改變數據
	if(!EVP_CipherInit_ex(&ctx, cipher, NULL/*NULL使用缺省的實現算法*/,key,iv,type))//初始化
	{
		strcpy(outMsg,"初始化加解密結構體失敗");
		ret=false;
		goto err;		
	}
	
	//該函數進行加密算法結構EVP_CIPHER_CTX密鑰長度的設置。
	//如果算法是一個密鑰長度固定的算法,
	//那么如果設置的密鑰長度跟它固定的長度不一致,就會產生錯誤。
//	EVP_CIPHER_CTX_set_key_length(&ctx, 10); 		
//	EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, type);
	
	for(;;)
	{                       
		inlen = fread(inbuf, sizeof(char), 1024, infd);
		if(inlen <= 0) break;
		if(!EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen))//中間過程 
		{
			/* Error */              
			strcpy(outMsg,"中間過程錯誤");
			ret=false;
			goto err;
		}
		fwrite(outbuf, sizeof(char), outlen, outfd);
		finishLen+=inlen;
		if(DrawProg) DrawProg(finishLen*100/fileLen);
	}               
	if(!EVP_CipherFinal_ex(&ctx, outbuf, &outlen))    //最終步驟-處理最后(Final)的一段數據
	{   /* Error */                       
		strcpy(outMsg,"最終過程錯誤"); 
		ret=false;
		goto err;
	}               
	fwrite(outbuf, sizeof(char), outlen, outfd);
err:
	fclose(infd);
	fclose(outfd);
	if(ctx.cipher) EVP_CIPHER_CTX_cleanup(&ctx); //清除所有信息釋放內存
	EVP_cleanup();//frees all three stacks and sets their pointers to NULL ---- EVP_CIPHER
	return ret;
}

/*消息摘要*/
bool Digest(char * mdname/*摘要算法*/,char * filein/*輸入文件*/,unsigned char * md_value/*返回摘要*/,
			unsigned int * md_len/*摘要長度*/, char * outMsg,PDrawProg DrawProg/*回調函數*/)
{
	const EVP_MD *md=NULL;
	char inbuf[1024]="";
	int len=0;
	bool ret=true;
	EVP_MD_CTX md_ctx;
	memset(&md_ctx,0,sizeof(md_ctx));
	FILE *infd;
	double fileLen=0;//文件長度
	double finishLen=0;//完成長度

	if(strlen(filein)==0)
	{
		strcpy(outMsg,"NO specify input or output file");
		return false;
	}

    if ((infd = fopen (filein, "rb")) == NULL)//原文
	{
		strcpy(outMsg,"open input file error");
		return false;
	}
	fileLen=filelength(fileno(infd));//得到文件長度

	//使EVP_Digest系列函數支持所有有效的信息摘要算法
	OpenSSL_add_all_digests();
    
	//根據輸入的信息摘要函數的名字得到相應的EVP_MD算法結構
	md = EVP_get_digestbyname(mdname);  
	if(!md) 
	{
		sprintf(outMsg,"Unknown message digest %s",mdname);
		ret=false;
		goto err;
	}
	//初始化信息摘要結構md_ctx。
	EVP_MD_CTX_init(&md_ctx);

	//使用md的算法結構設置mdctx結構,impl為NULL,即使用缺省實現的算法(openssl本身提供的信息摘要算法)
	if(!EVP_DigestInit_ex(&md_ctx, md, NULL/*impl*/))
	{
		strcpy(outMsg,"初始化算法結構錯誤");
		ret=false;
		goto err;
	}

	//信息摘要運算
	for(;;)
	{
		len = fread(inbuf, 1, 1024, infd);
		if(len <= 0) break;          
		if(!EVP_DigestUpdate(&md_ctx, inbuf, len))
		{
			strcpy(outMsg,"中間過程錯誤");
			ret=false;
			goto err;
		}
		finishLen+=len;
		if(DrawProg) DrawProg(finishLen*100/fileLen);
	}
	//完成信息摘要計算過程,將完成的摘要信息存儲在md_value里面,長度信息存儲在md_len里面
	if(!EVP_DigestFinal_ex(&md_ctx, md_value, md_len))
	{	
		strcpy(outMsg,"最終過程錯誤");
		ret=false;
	}

err:
	//使用該函數釋放mdctx占用的資源,如果使用_ex系列函數,這是必須調用的。
	fclose(infd);
	if(md_ctx.digest) EVP_MD_CTX_cleanup(&md_ctx);
	EVP_cleanup();
	return ret;
}

/*數字簽名*/
bool Sign(char * key/*私鑰*/,int keylen/*0-內存內容*/,char * mdname/*簽名算法*/,
		  char * filein/*輸入文件*/,char * fileout/*輸出文件*/,
		  char * outMsg,PDrawProg DrawProg/*回調函數*/)
{
	bool ret=true;
	unsigned char * sig_buf=NULL;
	unsigned int sig_len,len=0;
	unsigned char inbuf[1024]="";
	EVP_PKEY * pkey=NULL;
	const EVP_MD *md=NULL;
	EVP_MD_CTX md_ctx;
	memset(&md_ctx,0,sizeof(md_ctx));
	BIO *in=NULL;
	FILE *outfd,*infd;
	double fileLen=0;//文件長度
	double finishLen=0;//完成長度
	if(strlen(filein)==0||strlen(fileout)==0)
	{
		strcpy(outMsg,"NO specify input or output file");
		return false;
	}
	
    if ((infd = fopen (filein, "rb")) == NULL)//原文
	{
		strcpy(outMsg,"open input file error");
		return false;
	}
	if ((outfd = fopen (fileout, "wb")) == NULL)//密文
	{
		strcpy(outMsg,"open output file error");
		fclose(infd);
		return false;
	}
	fileLen=filelength(fileno(infd));//得到文件長度


	OpenSSL_add_all_digests();

	pkey=LoadKey(key,keylen,NULL,outMsg);
	if (pkey == NULL)
	{ 
		ret=false;
		goto err;
	}
	
	/* Do the signature */
	md = EVP_get_digestbyname(mdname);  
	if(!md) 
	{
		sprintf(outMsg,"Unknown message digest %s",mdname);
		ret=false;
		goto err;
	}
	EVP_MD_CTX_init(&md_ctx);
	if(!EVP_SignInit_ex(&md_ctx,md,NULL))
	{
		strcpy(outMsg,"初始化算法結構出錯");
		ret=false;
		goto err;
	}

	for(;;)
	{
		len = fread(inbuf, sizeof(char), 1024, infd);
		if(len <= 0) break;
		if(!EVP_SignUpdate(&md_ctx, inbuf, len))
		{
			sprintf(outMsg,"中間過程出錯");
			ret=false;
			goto err;
		}
		finishLen+=len;
		if(DrawProg) DrawProg(finishLen*100/fileLen);
	}

	sig_len =EVP_PKEY_size(pkey);
	sig_buf=new unsigned char[sig_len];

	// 簽名後的結果,必須是個夠大視 private key 長度不同而不同,可以 EVP_PKEY_size() 取得
	if(!EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey))
	{
		sprintf(outMsg,"最終過程出錯");
		ret=false;
	}
	fwrite(sig_buf,sizeof(char),sig_len,outfd);

err:
	fclose(infd);
	fclose(outfd);
	BIO_free(in);

	if(pkey) EVP_PKEY_free (pkey);
	if(md_ctx.digest) EVP_MD_CTX_cleanup(&md_ctx);
	delete [] sig_buf;
	EVP_cleanup();
	return ret;
}

/*數字簽名驗證*/
bool VerifySign(char * cert/*公鑰*/,int certlen,char * mdname/*簽名算法*/,char * filesource,/*原始文件*/ 
				char * filesign/*簽名結果*/,char * outMsg,PDrawProg DrawProg/*回調函數*/)
{
	const EVP_MD *md=NULL;
	unsigned char inbuf[1024]="";
	bool ret=true;
	unsigned char * sig_buf=NULL;
	unsigned int sig_len,len=0;
	FILE *outfd,*infd;
	double fileLen=0;//文件長度
	double finishLen=0;//完成長度
	X509 *	x509=NULL;
	EVP_PKEY * pcert=NULL;
	EVP_MD_CTX md_ctx;
	memset(&md_ctx,0,sizeof(md_ctx));

	if(strlen(filesource)==0||strlen(filesign)==0)
	{
		strcpy(outMsg,"NO specify input or output file");
		return false;
	}
	
    if ((infd = fopen (filesource, "rb")) == NULL)//原文
	{
		strcpy(outMsg,"open input file error");
		return false;
	}
	if ((outfd = fopen (filesign, "rb")) == NULL)//密文
	{
		strcpy(outMsg,"open output file error");
		fclose(infd);
		return false;
	}
	fileLen=filelength(fileno(infd));//得到文件長度

	OpenSSL_add_all_digests();
	x509=LoadCert(cert,certlen,outMsg);
	if (x509 == NULL)
	{
		ret=false;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩中文字幕一区| 9色porny自拍视频一区二区| 欧美午夜精品免费| 精品少妇一区二区三区日产乱码| 中文幕一区二区三区久久蜜桃| 一区二区三区精密机械公司| 国产黄色精品视频| 欧美一区二区黄色| 久久久久青草大香线综合精品| 国产精品久久久久四虎| 麻豆精品国产传媒mv男同| 91在线小视频| 久久久精品tv| 麻豆国产精品视频| 欧美午夜片在线观看| 中文字幕亚洲在| 国产麻豆精品theporn| 91精品国产高清一区二区三区| 亚洲丝袜另类动漫二区| 播五月开心婷婷综合| 亚洲精品在线三区| 免费观看久久久4p| 欧美日韩激情一区二区三区| 亚洲最大成人网4388xx| av资源网一区| 中文字幕永久在线不卡| 成人美女视频在线观看18| 欧美va亚洲va| 久久 天天综合| 日韩免费成人网| 奇米综合一区二区三区精品视频| 91国偷自产一区二区三区观看 | 日本女人一区二区三区| 在线视频中文字幕一区二区| 国产精品免费看片| 波多野结衣中文字幕一区二区三区 | 91成人网在线| 亚洲欧美怡红院| 91亚洲精华国产精华精华液| 国产精品国产精品国产专区不蜜| 国产凹凸在线观看一区二区 | 91精品国产91热久久久做人人| 亚洲亚洲人成综合网络| 欧美天堂一区二区三区| 香蕉影视欧美成人| 91精品国产综合久久精品图片 | 亚洲综合免费观看高清完整版在线| 97久久超碰国产精品| 国产精品家庭影院| 日本道色综合久久| 三级一区在线视频先锋| 欧美成人一区二区三区片免费| 精油按摩中文字幕久久| 久久久www成人免费无遮挡大片| 国产福利91精品一区二区三区| 欧美极品aⅴ影院| 97se亚洲国产综合自在线不卡| 一区二区三区精品在线观看| 欧美日韩精品一区二区| 久久精品99国产精品| 欧美精彩视频一区二区三区| av欧美精品.com| 亚洲伊人伊色伊影伊综合网| 51久久夜色精品国产麻豆| 精品无码三级在线观看视频| 国产精品高潮呻吟| 欧美视频精品在线观看| 国产一区二区三区电影在线观看| 中文字幕乱码久久午夜不卡| 欧美体内she精高潮| 精品一区二区三区蜜桃| 自拍偷自拍亚洲精品播放| 在线观看91av| k8久久久一区二区三区| 婷婷国产在线综合| 亚洲国产精华液网站w| 欧美顶级少妇做爰| 成人激情午夜影院| 美女一区二区三区在线观看| 亚洲人快播电影网| 久久综合色天天久久综合图片| av亚洲精华国产精华| 日本女人一区二区三区| 亚洲精品综合在线| 国产日韩欧美制服另类| 欧美日韩国产经典色站一区二区三区| 国产精品一区二区在线观看网站| 一区二区三区在线观看国产| 欧美精品一区二区三区蜜桃 | 亚洲精品视频在线| www国产精品av| 欧美乱熟臀69xxxxxx| 99v久久综合狠狠综合久久| 久久av老司机精品网站导航| 一区二区高清视频在线观看| 国产精品萝li| 久久久综合视频| 欧美绝品在线观看成人午夜影视| eeuss鲁片一区二区三区在线观看| 蜜臀久久99精品久久久久久9| 一卡二卡三卡日韩欧美| 欧美国产97人人爽人人喊| 精品国产一区二区三区久久久蜜月| 91丨porny丨国产| www.亚洲精品| 国产精品一区二区久激情瑜伽| 日本美女一区二区| 亚洲成人av电影在线| 一区二区三区欧美日韩| 日韩一区欧美一区| 国产精品美女久久福利网站| 日本一区二区免费在线| 国产亚洲成av人在线观看导航| 日韩小视频在线观看专区| 欧美精品三级在线观看| 欧美人牲a欧美精品| 欧美午夜不卡视频| 欧洲精品视频在线观看| 欧洲国产伦久久久久久久| 一本在线高清不卡dvd| 91视频免费观看| 色网综合在线观看| 在线这里只有精品| 在线观看免费成人| 欧美日本在线一区| 日韩欧美亚洲国产另类| 日韩免费高清av| 国产欧美一区视频| 国产精品久久网站| 亚洲欧美日韩国产综合| 亚洲大片在线观看| 日韩va亚洲va欧美va久久| 琪琪久久久久日韩精品| 国产一区二区精品久久91| 国产福利精品一区| 色香蕉成人二区免费| 在线不卡免费欧美| 久久久美女毛片| 亚洲日本电影在线| 亚洲444eee在线观看| 美女视频黄频大全不卡视频在线播放| 久久狠狠亚洲综合| 成人免费av网站| 欧美性感一区二区三区| 欧美一级免费大片| 国产欧美精品一区二区三区四区| 国产精品你懂的| 亚洲va韩国va欧美va| 久久国产精品99精品国产| 不卡av免费在线观看| 欧美私模裸体表演在线观看| 日韩欧美久久久| 亚洲你懂的在线视频| 日韩不卡免费视频| 99精品热视频| 日韩三级电影网址| 中国av一区二区三区| 亚洲成人综合在线| 国产99久久久国产精品潘金网站| 91精彩视频在线观看| 久久影音资源网| 亚洲国产精品一区二区久久恐怖片 | 亚洲综合自拍偷拍| 国产在线不卡一卡二卡三卡四卡| 色综合久久综合中文综合网| 日韩欧美在线观看一区二区三区| 亚洲欧美日韩精品久久久久| 韩国精品免费视频| 欧美视频在线观看一区二区| 国产欧美精品日韩区二区麻豆天美 | 精品一区二区三区在线播放| 一本到不卡免费一区二区| 精品成a人在线观看| 亚洲国产精品一区二区www在线| 国产91丝袜在线观看| 欧美一级夜夜爽| 午夜精品久久久| 97久久精品人人做人人爽50路| 久久综合网色—综合色88| 天天av天天翘天天综合网色鬼国产 | 三级一区在线视频先锋| 99久久久精品| 国产亚洲人成网站| 精品一区二区在线免费观看| 精品污污网站免费看| 亚洲人成在线播放网站岛国| 丰满少妇在线播放bd日韩电影| 欧美大片国产精品| 日本中文字幕不卡| 欧美精品在线视频| 亚洲成人av一区| 欧美精三区欧美精三区| 亚洲在线观看免费视频| 色av综合在线| 亚洲精品日日夜夜| 色婷婷一区二区三区四区| 综合亚洲深深色噜噜狠狠网站| 国产jizzjizz一区二区| 国产精品美女久久久久久2018 | 欧美在线free|