分享

OpenSSL应用之公钥算法RSA

 MikeDoc 2011-01-13
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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多