📄 test.dat
字号:
#include <stdio.h>
#include <windows.h>
//完成AES和MD5的函数
typedef void (* HASH)(char*,long,char*);
typedef void (* ENC)(char*,long,char*,char*);
typedef void (* DEC)(char*,long,char*,char*);
//完成RSA产生密钥对、加密、解密、签名、解析签名的函数
typedef void (* GENRSAKEY)(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);
typedef void (* RSAENC)(const unsigned char *lpBuf,int buflen,const char *PublicKeyFile,unsigned char *lpBufOut,int *outbuflen);
typedef void (* RSADEC)(const unsigned char *lpBuf,int buflen,const char *PrivateKeyFile,unsigned char *lpBufOut,int *outbuflen);
typedef void (*RSASIGNFILE)(const char *PrivateKeyFile, const char *messageFilename, const char *signatureFilename);
typedef bool (*RSAVERIFYFILE)(const char *PublicKeyFile, const char *messageFilename, const char *signatureFilename);
HINSTANCE dllhinst1=NULL;
HINSTANCE dllhinst2=NULL; //RSA
HASH hash=NULL;
ENC enc=NULL;
DEC dec=NULL;
GENRSAKEY genkey=NULL;
RSAENC rsaenc=NULL;
RSADEC rsadec=NULL;
RSASIGNFILE rsasign=NULL;
RSAVERIFYFILE rsaverify=NULL;
BOOL Init()
{
dllhinst1=LoadLibrary("xsecu");
dllhinst2=LoadLibrary("pack");
if (dllhinst1!=NULL &&dllhinst2!=NULL )
{
hash=(HASH)GetProcAddress(dllhinst1, "hash");
enc=(ENC)GetProcAddress(dllhinst1, "enc");
dec=(DEC)GetProcAddress(dllhinst1, "dec");
genkey=(GENRSAKEY)GetProcAddress(dllhinst2, "GenerateRSAKey");
rsaenc=(RSAENC)GetProcAddress(dllhinst2, "RSAPublicEnc");
rsadec=(RSADEC)GetProcAddress(dllhinst2, "RSAPrivateDec");
rsasign=(RSASIGNFILE)GetProcAddress(dllhinst2, "RSASignFile");
rsaverify=(RSAVERIFYFILE)GetProcAddress(dllhinst2, "RSAVerifyFile");
if (!hash || !enc||!dec || !genkey|| !rsaenc|| !rsadec|| !rsasign|| !rsaverify)
{
FreeLibrary(dllhinst1);
FreeLibrary(dllhinst2);
return FALSE;
}
}
else
return FALSE;
return TRUE;
}
void main()
{
unsigned char lpBuf1[256], lpBuf2[256], lpBuf3[256];
unsigned char md[17];
if(!Init())
{
printf("Fail to Load DLLs.");
return;
}
for(int i=0;i<256;i++)
{
lpBuf1[i]=i%220+36;
printf("%c:%02X ",lpBuf1[i],lpBuf1[i]);
}
printf("\r\n\r\n");
//加密
printf("加密\r\n");
enc((char *)lpBuf1,256,"1234567890abcdef",(char *)lpBuf2);
for(i=0;i<256;i++)
{
printf("%c:%02X ",lpBuf2[i],lpBuf2[i]);
}
printf("\r\n\r\n");
//解密
printf("解密\r\n");
dec((char *)lpBuf2,256,"1234567890abcdef",(char *)lpBuf3);
for(i=0;i<256;i++)
{
printf("%c:%02X ",lpBuf3[i],lpBuf3[i]);
}
printf("\r\n\r\n");
//比较
if(memcmp(lpBuf1,lpBuf3,256)==0)
MessageBox(NULL,"加密解密结果比较成功!","",0);
//计算摘要
printf("计算摘要\r\n");
hash((char *)lpBuf1,256,(char *)md);
for(i=0;i<16;i++)
{
printf("%c:%02X ",md[i],md[i]);
}
printf("\r\n\r\n");
printf("\r\n\r\nRSA算法演示开始\r\n");
printf("产生密钥对\r\n");
genkey(1024,"privkey.dat","pubkey.dat","这个串请采用一个随机的串,最好加上时间信息等,造成不能有2个相同的串");
printf("完成,可以看见文件privkey.dat和pubkey.dat。");
MessageBox(NULL,"完成,可以看见文件privkey.dat和pubkey.dat。","",0);
printf("\r\n\r\nRSA加密lpBuf1的前面16字节,注意公钥加密\r\n");
printf("输出到lpBuf2中,长度在变量OutLeng中.结果请看弹出的对话框\r\n");
lpBuf1[16]=0x00;
MessageBox(NULL,(char *)lpBuf1,"RSA加密前的数据",0);
int OutLeng=0;
rsaenc(lpBuf1,16,"pubkey.dat",lpBuf2,&OutLeng);
lpBuf2[OutLeng]=0x00;
MessageBox(NULL,(char *)lpBuf2,"RSA加密后的数据",0);
printf("\r\n\r\nRSA解密密lpBuf2的前面OutLeng字节,注意私钥加密\r\n");
printf("输出到lpBuf3中,长度在变量OutLeng中.结果请看弹出的对话框\r\n");
rsadec(lpBuf2,OutLeng,"privkey.dat",lpBuf3,&OutLeng);
lpBuf3[OutLeng]=0x00;
MessageBox(NULL,(char *)lpBuf3,"RSA解密得到的数据",0);
printf("\r\n\r\n产生一个文件test.dat\r\n");
CopyFile("secudemo.cpp","test.dat",FALSE);
printf("签名这个文件,得到签名文件sign.dat\r\n");
rsasign("privkey.dat","test.dat","sign.dat");
MessageBox(NULL,"你现在可以试图修改文件test.dat,以便检查签名结果","",0);
if(rsaverify("pubkey.dat","test.dat","sign.dat")==TRUE)
MessageBox(NULL,"检查签名结果:文件没有被修改过。","",0);
else
MessageBox(NULL,"检查签名失败,可能文件被修改过等。","",0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -