OpenSSL应用之公钥算法RSA

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目录下了),这些都完成后你就可以直接运行程序了。


相关文章

  • 7网络与信息安全课程设计报告
  • <网络与信息安全>课程设计报告班级:07网络工程(3)班学号:[1**********]8姓名:韩立伟 题目: 评阅:加密软件的设计 成绩: 2010-1-07 RSA算法加密软件的设计 摘要:分析RSA算法的应用现状,论证文件 ...查看


  • 网络安全应用实训报告
  • 安全技术及应用实训 项目二:网络安全应用实训项目 报告 学号:09011319 姓名:雷超 信息技术分院 长春职业技术学院 目 录 任务1 知识剖析 ............................................. ...查看


  • 信息安全保密期末考试复习
  • 信息安全保密期末考试复习 教学内容要点:(2课时) 信息安全保密期末考试复习 .................................... 11. 期末考试复习 ................................. ...查看


  • 电子商务的安全技术-数字签名
  • 电子商务的安全技术--数字签名 专业:信息管理与信息系统 班级:信管本科班 学号: 姓名: 日期:2015年6月30日 摘要:近来基于Internet 开展的电子商务已逐渐成为人们进行商务活动的新模式.越来 越多的人通过 Internet ...查看


  • 密码学基础实验讲义
  • 常熟理工学院 计算机科学与工程系 <密码学基础>实验指导书 网络工程系 2009年7月 实验一.熟悉CAP4 一.实验目的与要求 通过实验,使学生对密码学有一定的感性认识:学会正确使用CAP(Cryptographic Anal ...查看


  • 信息安全论文 1
  • 郑州工业应用技术学院 课程设计(论文) 题 目:公钥密码学原理及应用 指导教师: 职称: 无 学生姓名: 学号: 2 专 业: 14级通信工程 院 (系): 信息工程学院 2017年1月2 摘要 公开密钥密码体制是现代密码学最重要的发明,也 ...查看


  • 基于RSA的数字签名技术
  • 基于RSA 的数字签名技术 胡思雨1,孙秀丽2,张瑞华3 (1安徽师范大学数学计算机科学学院, 安徽,芜湖,241000 2安徽师范大学数学计算机科学学院, 安徽,芜湖,241000 3安徽师范大学数学计算机科学学院, 安徽,芜湖,2410 ...查看


  • 信息安全概论加密算法论文
  • 随着信息时代的到来,特别是随着Internet和电子商务的发展,怎样才能达到使信息系统的机密信息难以被泄漏,或者即使被窃取了也极难识别,以及即使被识别了也极难篡改,已经成为IT业界的热点研究课题.到现在为止网络安全解决方案可以分为两大类:一 ...查看


  • SSH传输层协议细节说明_apollobird
  • SSH传输层协议细节说明 2014-06-03 17:59阅读: 基于: RFC 4253:The Secure Shell (SSH) Transport Layer Protocol 以及openssh-5.3 RFC 4253描述了S ...查看


热门内容