📄 krbtestdlg.cpp
字号:
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 + -