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

📄 krbtestdlg.cpp

📁 基于openssl开发的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	EVP_CIPHER_CTX_init(&ctx);		
	rel = EVP_DecryptInit_ex(&ctx,EVP_des_ecb(),NULL,key,iv);
	if(!rel)
		goto ERR;
	
	while(!feof(fp))
	{
		len = fread(txt,1,1024,fp);
		rel = EVP_DecryptUpdate(&ctx,(unsigned char*)outbuf,&outlen,(unsigned char*)txt,len);
		if(!rel)
			goto ERR;
		fwrite(outbuf,1,outlen,fpout);
	}
	rel = EVP_DecryptFinal(&ctx,(unsigned char*)outbuf,&outlen);
	if(!rel)
		goto ERR;
	fwrite(outbuf,1,outlen,fpout);
	
	fclose(fp);
	fclose(fpout);

	m_MsgBox = "解密后的文件数据文件为原文件名加上.decc\r\n";
	m_MsgBox += "\n";
	m_MsgBox += "解密完成!\r\n";
	UpdateData(FALSE);	
	return;

ERR:
	m_MsgBox = "解密失败!\r\n";
	UpdateData(FALSE);
	return ;
}

void CKrbtestDlg::OnButbro() 
{
	CFileDialog path_dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"所有文件(*.*)|*.*||",NULL);
	if (path_dlg.DoModal()==IDOK)
	{
		m_Path = path_dlg.GetPathName();
		
        UpdateData(FALSE);
	}	
}

void CKrbtestDlg::OnSign() 
{
   	char inbuf[1024];
    char outbuf[2048];
	
	int inlen = 0;
    int outlen = 0;
    memset(inbuf,0,sizeof(inbuf));
	memset(outbuf,0,sizeof(outbuf));

    FILE *fpin = NULL;
	FILE *fpout = NULL;
	int rel = 0;
	int mylen = 0;
	
	UpdateData(TRUE);
	if(m_Path.GetLength() <= 0)
	{
		m_MsgBox = "请选择要进行签名的文件!\r\n";
	    UpdateData(FALSE);
		return;
	}

	unsigned char *p = NULL;
	unsigned char *q = NULL;
	RSA * rsa = NULL;
	EVP_PKEY *pkey = NULL;
	rsa = RSA_generate_key(1024,65537,NULL,NULL);
	if(!rsa) 
		goto ERR;
	
	pkey = EVP_PKEY_new();
	EVP_PKEY_assign_RSA(pkey,rsa);	
	if(pkey == NULL) goto ERR;
	
	char SavePath[MAX_PATH];
	memset(SavePath,0,MAX_PATH);
	strcpy(SavePath,(char*)(LPCSTR)m_Path);
	strcat(SavePath,".sig");
	
	EVP_MD_CTX ctx;
	EVP_MD_CTX_init(&ctx); 
	if(((CButton*)GetDlgItem(IDC_RADIO2_MD5))->GetCheck() == 1)
	{
		rel = EVP_DigestInit_ex(&ctx,EVP_md5(),NULL);
	}
	else
	{
		rel = EVP_DigestInit_ex(&ctx,EVP_sha1(),NULL);
	}
	
    if (!rel) 
		goto ERR;	
    fpin = fopen((char *)(LPCSTR)m_Path,"rb");
    fpout = fopen(SavePath,"wb");
	if(!fpin||!fpout)
	{
		return;
	}
	while(!feof(fpin))
	{
		inlen = fread(inbuf,1,sizeof(inbuf),fpin);
		rel = EVP_DigestUpdate(&ctx,inbuf,inlen);
	    if(!rel) 
			goto ERR;
	}

    rel = EVP_SignFinal(&ctx,(unsigned char *)outbuf,(unsigned int *)&outlen,pkey);
    if(!rel)  
		goto ERR;
		
	fclose(fpin);
	fwrite(outbuf,1,outlen,fpout);
	fclose(fpout);
	strcat(SavePath,".sig_prikey");
	fpin = fopen(SavePath,"wb");
	
	//将私钥数据结构转换成der编码结构
	mylen = i2d_RSAPrivateKey(rsa,NULL);
	p = (unsigned char*)malloc(mylen);
	q = p;
	memset(p,0,mylen);
	i2d_RSAPrivateKey(rsa,&q);
	fwrite(p,1,mylen,fpin);
	fclose(fpin);
	
	m_MsgBox += "签名数据文件:当前目录下对应的.sig文件\r\n";
	m_MsgBox += "\n";
	m_MsgBox += "用于签名私钥文件:当前目录下对应的.sig_prikey\r\n";
	m_MsgBox += "签名完成!\r\n";
	UpdateData(FALSE);
	//if(rsa) RSA_free(rsa);
	if(pkey) EVP_PKEY_free(pkey);
	return;
	
ERR:
	m_MsgBox = "签名失败!";
	UpdateData(FALSE);
	return ;
}


void CKrbtestDlg::OnSignVerify() //验证签名
{
	UpdateData(TRUE);
	if(m_Path.GetLength() <= 0)
	{
		m_MsgBox = "请选择要进行签名验证的文件!\r\n";
	    UpdateData(FALSE);
		return;
	}
	char inbuf[1024];
	char outbuf[2048];
	int inlen = 0;
	int outlen = 0;
	int rel=0;
	unsigned char *p = NULL;

	memset(inbuf,0,sizeof(inbuf));
	memset(outbuf,0,sizeof(outbuf));

	FILE *fpin = NULL;
	RSA *rsa;
	EVP_PKEY *pkey = NULL;
    EVP_MD_CTX ctx;
	EVP_MD_CTX_init(&ctx);

	if(((CButton*)GetDlgItem(IDC_RADIO2_MD5))->GetCheck() == 1)
	{
		rel = EVP_DigestInit_ex(&ctx,EVP_md5(),NULL);
	}
	else
	{
		rel = EVP_DigestInit_ex(&ctx,EVP_sha1(),NULL);
	}

    if (!rel) 
		goto ERR;

	char SavePath[MAX_PATH];
	char SaveBuffer[MAX_PATH];
	memset(SavePath,0,sizeof(SavePath));
	strcpy(SavePath,(char *)(LPCSTR)m_Path);
	strcpy(SaveBuffer,SavePath);

	fpin = fopen((char *)(LPCSTR)m_Path,"rb");
	if(!fpin)
	{
		return;
	}

   while(!feof(fpin))
   {
       inlen = fread(inbuf,1,sizeof(inbuf),fpin);
       rel = EVP_DigestUpdate(&ctx,inbuf,inlen);
	   if(!rel) goto ERR;
   }

   fclose(fpin);
   strcat(SavePath,".sig.sig_prikey");
   fpin = fopen(SavePath,"rb");    
   
   p = (unsigned char *)malloc(2048);
   inlen = fread(p,1,2048,fpin);
   fclose(fpin);
   rsa = d2i_RSAPrivateKey(NULL,(const BYTE**)&p,inlen);
   pkey = EVP_PKEY_new();
   EVP_PKEY_assign_RSA(pkey,rsa);    
   
   
   strcat(SaveBuffer,".sig");
   fpin = fopen(SaveBuffer,"rb");
   if(!fpin)
   {
	   return ;
   }
   inlen = fread(outbuf,1,sizeof(outbuf),fpin);
   
   rel = EVP_VerifyFinal(&ctx,(unsigned char *)outbuf,(unsigned int)inlen, pkey);
   if(pkey) 
	   EVP_PKEY_free(pkey);
   if(rel)
   {
	   m_MsgBox="验证成功!\r\n";
	   UpdateData(FALSE);
   }   
   else
   {
	   m_MsgBox="验证失败!\r\n";
	   UpdateData(FALSE);
   }
   return;
   
ERR:
   m_MsgBox="验证失败!\r\n";
   UpdateData(FALSE);
   return ;
   
}



void CKrbtestDlg::OnEncode() 
{
	UpdateData(TRUE);
	if(m_Path.GetLength() <= 0)
	{ 
		m_MsgBox="请选择要进行BASE64编码的文件!\r\n";
        UpdateData(FALSE);
	    return;
	}
	
	EVP_ENCODE_CTX ctx;
	EVP_EncodeInit(&ctx);
	
	char inbuf[1024];
	char outbuf[2048];
	
	memset(inbuf,0,sizeof(inbuf));
	memset(outbuf,0,sizeof(outbuf));
	
	int inlen = 0;
	int outlen = 0;
	int rel = 0;

	FILE *fpin = NULL;
	FILE *fpout = NULL;
    
	char SavePath[MAX_PATH];
	strcpy(SavePath,(char *)(LPCSTR)m_Path);
	strcat(SavePath,".code");
	
	fpin = fopen((char *)(LPCSTR)m_Path,"rb");
    fpout = fopen(SavePath,"wb");
	
	
	while(!feof(fpin))
	{
		inlen = fread(inbuf,1,1024,fpin);
		EVP_EncodeUpdate(&ctx,(unsigned char*)outbuf,&outlen,(unsigned char*)inbuf,inlen);
		fwrite(outbuf,1,outlen,fpout);
	}
	
	memset(outbuf,0,sizeof(outbuf));
	EVP_EncodeFinal(&ctx,(unsigned char*)outbuf,&outlen);
	fwrite(outbuf,1,outlen,fpout);
	
	fclose(fpin);
	fclose(fpout);
	
	m_MsgBox = "编码成功!\r\n";
	UpdateData(FALSE);
    return;	
}



void CKrbtestDlg::OnDecode() 
{
	UpdateData(TRUE);
	if(m_Path.GetLength() <= 0)
	{
		m_MsgBox = "请选择要进行BASE64解码的文件!\r\n";
	    UpdateData(FALSE);
	    return;
	}

	EVP_ENCODE_CTX ctx;
	EVP_DecodeInit(&ctx);
	
	char inbuf[1024];
	char outbuf[2048];

	memset(inbuf,0,sizeof(inbuf));
	memset(outbuf,0,sizeof(outbuf));

	int inlen = 0;
	int outlen = 0;
	int rel = 0;

	FILE *fpin = NULL;
	FILE *fpout = NULL;
    
	char SavePath[MAX_PATH];
	strcpy(SavePath,(char *)(LPCSTR)m_Path);
	strcat(SavePath,".decode");

	fpin = fopen((char *)(LPCSTR)m_Path,"rb");
    fpout = fopen(SavePath,"wb");


	while(!feof(fpin))
	{
		inlen = fread(inbuf,1,1024,fpin);
		EVP_DecodeUpdate(&ctx,(unsigned char*)outbuf,&outlen,(unsigned char*)inbuf,inlen);
	}

	memset(outbuf,0,sizeof(outbuf));
	rel = EVP_DecodeFinal(&ctx,(unsigned char*)outbuf,&outlen);
	if(rel == -1)
	{
		m_MsgBox = "解码失败!\r\n";
		UpdateData(FALSE);
		return;
	}
	fwrite(outbuf,1,outlen,fpout);

	fclose(fpin);
	fclose(fpout);
  
	m_MsgBox = "解码成功!\r\n";
	UpdateData(FALSE);
    return;
}

void CKrbtestDlg::OnAbout() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg dlg;
	dlg.DoModal();	
}

⌨️ 快捷键说明

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