OpenSSL应用之公钥算法RSA

转载:http://www.360doc.com/content/11/0113/10/2660674_86167316.shtml

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值