王铁树 2015-07-30 08:12 采纳率: 28.6%
浏览 1860

关于RSA非对称加密的问题。请各位大神帮我看下以下问题,新人求助。。。感激不尽

关于RSA非对称加密的问题。编程语言采用的是C++

现在需要设计一个用来加密解密程序。里面包含两个接口,一个是加密,一个是解密。
rsa 对称加密是公钥和私钥进行加密,接口设计如下:
int EncodeRSA(unsigned char pub_key,unsigned int pass_len, unsigned char data,unsigned int data_len,unsigned char** out_data,unsigned int out_len);
int DecodeRSA(unsigned char *pri_key,unsigned int pass_len, unsigned char
data,unsigned int data_len,unsigned char** out_data,unsigned int *out_len);

采用公钥加密私钥解密的形式。 不知道这样设计合不合理, 里面的参数是否有问题。
另外,我找了网上的一段代码 ,代码可以运行: 里面的很多东西看不懂。
如下:

 int test_rsa()
{
    RSA *r;
    int bits=1024,ret,len,flen,padding,i;
    unsigned long e=RSA_3;
    BIGNUM  *bne;
    unsigned char *key,*p;
    BIO *b;
    unsigned char from[500];
    unsigned char to[500];
    unsigned char out[500];

    bne=BN_new();

    printf("asdfds: %s\n",*bne);
    r=RSA_new();
    ret=RSA_generate_key_ex(r,bits,bne,NULL);  //生成密钥

    if(ret!=1)
    {
        printf("RSA_generate_key_ex err!\n");
        return -1;
    }

    /* 私钥 i2d */
    b=BIO_new(BIO_s_mem());
    ret=i2d_RSAPrivateKey_bio(b,r); // private key encoding functions.
    key=(unsigned char*)malloc(1024);
    len=BIO_read(b,key,1024);

    BIO_free(b);
    b=BIO_new_file("rsa.key","w");
    ret=i2d_RSAPrivateKey_bio(b,r); //public encoding functions.
    BIO_free(b);

    flen=RSA_size(r);  //RSA_size, RSA_bits - get RSA modulus size

    padding=5;
    if(padding==RSA_PKCS1_PADDING )
        flen-=11;
    else if(padding==RSA_X931_PADDING)
        flen-=2;
    else if(padding==RSA_NO_PADDING)
        flen=flen;
    else 
    {
        printf("rsa not surport !\n");
        return -1;
    }
    //查看from内容,
    for(i=0;i<flen;i++)
    {
        memset(&from[i],i,1);
        printf("%c",from[i]);
    }
    printf("\n");

    len=RSA_private_encrypt(flen,from,to,r,padding);  // 私钥加密

    std::cout<<"len: "<<len<<std::endl;
    std::cout<<"padding: "<<padding<<std::endl;

    if(len<=0)
    {
        printf("RSA_private_encrypt err!\n");
        return -1;
    }
    len=RSA_public_decrypt(len,to,out,r,padding); //公钥解密

    //查看out内容
    for(i=0;i<flen;i++)
    {
        printf("%c",out[i]);     
    }
    printf("\n");

    if(len<=0)
    {
        printf("RSA_public_decrypt err!\n");
        return -1;
    }
    if(memcmp(from,out,flen))
    {
        printf("err!\n");
        return -1;
    }

    RSA_free(r);
    CRYPTO_cleanup_all_ex_data();
    return 0;
}

我想知道里面那个东西是私钥,那个东西是公钥。 是什么函数生成的。 还有i2d_RSAPrivateKey_bio()是做什么用的?

  • 写回答

1条回答 默认 最新

  • oyljerry 2015-07-30 08:26
    关注

    私钥跟公钥是用openssl的rsa工具库来生成
    i2d_RSAPrivateKey_bio 这个是把私钥生成二进制IO缓冲区中,这样可以后面写入文件或输出到管道

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决