OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。我想用RSA作为例子来描述Openssl公钥算法的实现过程。
/*****************RSA Code******************/
#include #include #include #include void print(const char *promptStr,unsigned char *data,int len){ int i; printf("\n===%s[长度=%d字节]======\n",promptStr,len); for(i = 0; i
//作为一条规则,使用静态调用,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,否则返回NULLEVP_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/LibraryModuls:中添加libeay32.lib,并且要保证libeay32.dll已经放在了System32目录下了),这些都完成后你就可以直接运行程序了。
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。我想用RSA作为例子来描述Openssl公钥算法的实现过程。
/*****************RSA Code******************/
#include #include #include #include void print(const char *promptStr,unsigned char *data,int len){ int i; printf("\n===%s[长度=%d字节]======\n",promptStr,len); for(i = 0; i
//作为一条规则,使用静态调用,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,否则返回NULLEVP_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/LibraryModuls:中添加libeay32.lib,并且要保证libeay32.dll已经放在了System32目录下了),这些都完成后你就可以直接运行程序了。