能力值:
( LV2,RANK:10 )
2 楼
下面这个是借助Openssl实现的RSA加解密的demo:
测试环境:Windows Xp SP3 + VC6
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"libeay32.lib")
#pragma comment(linker,"/force:multiple")
const int bits=1024;
bool RSAPrivateEncrypt(RSA *r, int padding, unsigned char *from, unsigned char *to)
{
int flen=0,len=0;
if (NULL == r || NULL == from || NULL == to)
return false;
flen = RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
len = RSA_private_encrypt(flen,from,to,r,padding);
if(len <= 0)
return false;
return true;
}
bool RSAPublicDecrypt(RSA *r, int padding, unsigned char *from, unsigned char *to)
{
int flen=0,len=0;
if (NULL == r || NULL == from || NULL == to)
return false;
flen = RSA_size(r);
len=RSA_public_decrypt(flen,from,to,r,padding);
if(len <= 0)
return false;
return true;
}
bool RSAPrivateEncryptPKCS1(RSA *r, unsigned char *from, unsigned char *to)
{
return RSAPrivateEncrypt(r,RSA_PKCS1_PADDING,from,to);
}
bool RSAPublicDecryptPKCS1(RSA *r, unsigned char *from, unsigned char *to)
{
return RSAPublicDecrypt(r,RSA_PKCS1_PADDING,from,to);
}
int GenerateRSAKeyFiles()
{
int ret;
BIGNUM *bne;
BIO *out;
RSA *r;
unsigned long e=RSA_3;
const EVP_CIPHER *enc=NULL;
bne=BN_new();
ret=BN_set_word(bne,e);
if(ret != 1)
return false;
r = RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if (ret != 1)
{
printf("RSA_generate_key_ex err!\n");
return -1;
}
BN_free(bne);
out = BIO_new_file("pri.pem","wb");
ret = PEM_write_bio_RSAPrivateKey(out,r,enc,NULL,0,NULL,NULL);
if (ret != 1)
{
RSA_free(r);
BIO_free(out);
return -1;
}
BIO_flush(out);
BIO_free(out);
out = BIO_new_file("pub.pem","wb");
ret = PEM_write_bio_RSAPublicKey(out,r);
if (ret != 1)
{
RSA_free(r);
BIO_free(out);
return -1;
}
BIO_flush(out);
BIO_free(out);
return 0;
}
bool getPriKey(RSA** r)
{
BIO *in =NULL;
if(NULL == r)
return false;
if(NULL == (in = BIO_new_file("pri.pem","rb")))
return false;
*r = PEM_read_bio_RSAPrivateKey(in,r,NULL,NULL);
if (NULL == (*r)->d)
return false;
BIO_free(in);
return true;
}
bool getPubKey(RSA** r)
{
BIO *in = NULL;
if(NULL == r)
return false;
if( NULL == (in = BIO_new_file("pub.pem","rb")))
return false;
*r = PEM_read_bio_RSAPublicKey(in,r,NULL,NULL);
if (NULL == (*r)->e)
return false;
BIO_free(in);
return true;
}
int testPKCS1()
{
RSA *r;
unsigned char from[1000]={0},to[1000]={0},out[1000]={0};
memcpy(from,"pksc1",6);
GenerateRSAKeyFiles();
r=RSA_new();
if(!getPriKey(&r))
return -1;
if (!RSAPrivateEncryptPKCS1(r,from,to))
{
printf("Private encrypt fail!\r\n");
return -1;
}
RSA_free(r);
r=RSA_new();
if(!getPubKey(&r))
return -1;
if (!RSAPublicDecryptPKCS1(r,to,out))
{
printf("Public decrypt fail!\r\n");
return -1;
}
printf("decrypt : %s\n",out);
RSA_free(r);
return 0;
}
int main()
{
testPKCS1();
return 0;
}