拿到了linux下c实现的RSA调用源码,想在windows下编程实现相同的结果,查了查资料,在vc6和vs2010调试通过,在win7 x64和winXP 32 运行结果一致,记录下来,以备日后查找。
一、安装openssl
1、进入Win32 OpenSSL下载页面,选择适合自己的版本进行下载。建议选择win32版本,程序通用性强,选择非light版本。
2、安装,有个lib位置选项,选在system那个选项比较好。
二、修改工程属性
1、vc6.0:include和lib包含目录中添加openssl安装文件夹下的include和lib
2、vs2010:配置属性--VC++目录--包含目录,添加openssl下的include文件夹
链接器--常规--附加库目录,添加openssl下的lib和bin
三、调试源码
因为我只需要加密结果,以便对照linux结果是否一致,所以没有写解密
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "libeay32.lib")
#define PUBLICKEY "test.pub" //公钥文件
#define BUFFSIZE 1024
char* my_encrypt(char *str, char *path_key);//加密
int main(void) {
char *source = "12345678";
char *ptr_en;
printf("source is :%s\n", source);
ptr_en = my_encrypt(source, PUBLICKEY);
if (ptr_en != NULL) {
free(ptr_en);
}
return 0;
}
char *my_encrypt(char *str, char *path_key) {
errno_t err;
char *p_en;
RSA *p_rsa;
FILE *file,*frsa;
int flen, rsa_len;
if ((err = fopen_s(&file, path_key, "r")) != 0) {
perror("open key file error");
return NULL;
}
if ((p_rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL)) == NULL) {
ERR_print_errors_fp(stdout);
return NULL;
}
rsa_len = RSA_size(p_rsa);
p_en = ( char *)malloc(rsa_len +1);
memset(p_en, 0, rsa_len +1);
if (RSA_public_encrypt(strlen(str), (unsigned char *)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING)<0) {
return NULL;
}
err=fopen_s(&frsa,"ps_rsa","wb");
fwrite((void *)p_en,1,rsa_len,frsa);
printf("rsa_len:%d\n",rsa_len);
fclose(frsa);
RSA_free(p_rsa);
fclose(file);
return p_en;
}
四、注意事项
1、公钥文件读取函数的选择
网上查的资料,公钥文件有两种格式,对应两个函数
PEM公钥格式文件
1 2 |
|
上面这种格式,使用函数 PEM_read_RSA_PUBKEY
PEM RSAPublicKey公钥格式文件
1 2 |
|
这种格式,使用函数 PEM_read_RSAPublicKey
2、这里使用的 RSA_PKCS1_PADDING 方式,这种方式在输入信息不够一块时,会随机填充,因此每次加密,即使明文相同,密文也会不同,解密时算法会使用相同的填充方式填充,实现解密。
另外,这种加密参数,明文长度要求小于 块长-11,第一个参数是明文的实际长度。