OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可
以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。我想用RSA作为例
子来描述Openssl公钥算法的实现过程。
/*****************RSA Code******************/
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
void print(const char *promptStr,unsigned char *data,int len)
{
int i;
printf("\n===%s[长度=%d字节]======\n",promptStr,len);
for(i = 0; i < len; i++) printf("%02x", data[i]);
printf("\n=======================\n");
}
//作为一条规则,使用静态调用,
static void prime_generate_status(int code, int arg, void *cb_arg)
{
if( arg>0 && (arg%10) )
{
return;
}
if (code == 0)
printf("\n找到潜在素数: %d", (arg + 1));
else if (code != 1)
printf("\n成功获取一个素数!");
}
//如果成功返回包装了RSA参数的EVP_PKEY,否则返回NULL
EVP_PKEY* getRSA()
{
EVP_PKEY* pkey=NULL;
RSA* rsa=RSA_generate_key(1024,//公钥模长
RSA_3, //第三个费尔玛数作为公钥中的e
prime_generate_status, //素数产生状态的回调函数
NULL //传给回调函数的参数
);
if(NULL==rsa)
{
printf("生成RSA密钥对失败\n");
return NULL;
}
//隐藏RSA密钥抵御定时攻击
RSA_blinding_on(rsa,NULL);
printf("\n成功生成RSA密钥对\n");
pkey=EVP_PKEY_new();
if(NULL==pkey)
{
printf("EVP_PKEY_new failed\n");
RSA_free(rsa);
return NULL;
}
//将rsa对象赋给EVP_PKEY结构
EVP_PKEY_assign_RSA(pkey,rsa);
return pkey;
}
void main(int argc, char *argv[])
{
RSA* rsa=NULL;
EVP_PKEY* pkey=NULL;
int len=-1;
//要加密的明文
char plainText[]="[For test to public/private key encryption/decryption]";
char encData[512];//加密后的数据
char decData[512];//解密后的数据,应该和明文相同
OpenSSL_add_all_ciphers();
pkey=getRSA();
if(pkey==NULL)
{
return;
}
len=EVP_PKEY_encrypt(
encData, //加密后的数据
plainText, //明文
sizeof(plainText), //明文长度
pkey //公钥
);
if(len==-1)
{
printf("EVP_PKEY_encrypt加密失败\n");
exit(-1);
}
print("加密后的数据",encData,len);
//解密
len=EVP_PKEY_decrypt(
decData, //解密后的数据
encData, //密文
len, //密文长度
pkey //私钥(事实上,公私钥都在此数据结构中)
);
if(len==-1)
{
printf("EVP_PKEY_decrypt解密失败\n");
return;
}
print("解密后的数据",decData,len);
printf("\n明文是:[长度=%d字节]:%s\n",len,decData);
//释放EVP_PKEY对象,其关联的RSA对象也被同时释放。
EVP_PKEY_free(pkey);
getchar();
}
RSA 算法的一个重要环节是生成密钥对。
在运行程序之前你必须做好前期准备,否则无法调试,这里我们要用到Openssl的EVP,我们需要在工程中引入要用到的链接库文件
libeay32.lib,(创建好一个工程后Project->Settings->Link在Object/Library
Moduls:中添加libeay32.lib,并且要保证libeay32.dll已经放在了System32目录下了),这些都完成后你就可以直接运
行程序了。
|