注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

勇敢的劳尤条

 
 
 

日志

 
 

openssl之RSA编程(4)(发送公钥到远端)  

2014-01-13 17:19:24|  分类: 软件安全以及传输 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
继上一篇,接着进行公钥提取到buf中,并通过网络进行传输,然后再将buf转为公钥结构体。下面首先介绍接口。

 #include <openssl/rsa.h>
#include <openssl/x509.h>
 RSA * d2i_RSAPublicKey(RSA **a, const unsigned char **pp, long length);
 int i2d_RSAPublicKey(RSA *a, unsigned char **pp);
 RSA * d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length);
 int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp);
 RSA * d2i_RSAPrivateKey(RSA **a, const unsigned char **pp, long length);
 int i2d_RSAPrivateKey(RSA *a, unsigned char **pp);
 int i2d_Netscape_RSA(RSA *a, unsigned char **pp, int (*cb)());
 RSA * d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length, int (*cb)());

DESCRIPTION

d2i_RSAPublicKey() and i2d_RSAPublicKey() decode and encode a PKCS#1 RSAPublicKey structure.

d2i_RSA_PUBKEY() and i2d_RSA_PUBKEY() decode and encode an RSA public key using a SubjectPublicKeyInfo (certificate public key) structure.

d2i_RSAPrivateKey(), i2d_RSAPrivateKey() decode and encode a PKCS#1 RSAPrivateKey structure.

d2i_Netscape_RSA(), i2d_Netscape_RSA() decode and encode an RSA private key in NET format.

i2d_RSAPublicKey,将RSA结构里面的公钥提取到一个buf中。
d2i_RSAPublicKey,将buf中内容,转化为一个RSA公钥结构。其他类似。
下面的测试代码,会将公钥提取出来,放到一个buf中。同样,私钥的是类似操作。

#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>

//16进制打印函数
void print_hex(char* buff, int len=0)
{
if(len>0)
{
for (int i=0;i<len;i++)
printf("%02x",(unsigned char)buff[i]);
}
else
{
for (int i=0;buff[i];i++)
printf("%02x",(unsigned char)buff[i]);
}
printf("\n");
}
int createRSA()
{
int ret=1;
RSA *pRSA;//下面生成首先生成私钥,这里私钥是包含公钥的
pRSA = RSA_generate_key(1024, RSA_F4, NULL, NULL);//RSA_3
if(!RSA_check_key(pRSA))
{
ret=0;
}
int size = i2d_RSAPublicKey(pRSA, NULL);//提取公钥大小
if(!size)
{
ret = 0;
}
unsigned char* pubbuf=(unsigned char*)malloc(size+1);//生成公钥存储空间
unsigned char *p = pubbuf;
if(pubbuf==NULL)
{
ret=0;
}
size = i2d_RSAPublicKey(pRSA, &p);//必须用p,不能直接&pubbuf,因为参数会改变
if(!size)
{
ret = 0;
}

printf("PriKeyBuff, Len=%d\n", size);
//print_hex((char*)pubbuf1,size);

RSA* pubkey;//从buf中,生成对应的公钥

p = pubbuf;

//这里同样需要用p替代pubbuf,因为如果直接用pubbuf,那么pubbuf的值将会被改变

//而我们将无法得知 之前动态分配的内存地址,从而无法释放这片内存,导致内存泄露,所以要注意。
pubkey=d2i_RSAPublicKey(NULL, (const unsigned char**)&p, size);

//下面是公钥加密测试
char in[10]="love";
char out[128]={0};
char in2[128]={0};
RSA_public_encrypt(strlen(in),(unsigned char*)in,(unsigned char*)out,pubkey,RSA_PKCS1_PADDING);
print_hex(out,128);
//私钥解密
RSA_private_decrypt(128,(unsigned char*)out,(unsigned char*)in2,pRSA,RSA_PKCS1_PADDING);
printf("%s\n",in2);
print_hex(in2);

//下面打印公钥对应的信息,公钥包含N和e,而私钥拥N和d

//实际上,私钥含有p、q等,所以可以推导出公钥
printf("N(%d bytes):%s\n",BN_num_bytes(pubkey->n), BN_bn2hex(pubkey->n));
//printf("p(%d bytes):%s\n",BN_num_bytes(pubkey->p), BN_bn2hex(pubkey->p));
//printf("q(%d bytes):%s\n",BN_num_bytes(pubkey->q), BN_bn2hex(pubkey->q));
//printf("d(%d bytes):%s\n",BN_num_bytes(pubkey->d), BN_bn2hex(pubkey->d));
printf("e(%d bytes):%s\n",BN_num_bytes(pubkey->e), BN_bn2hex(pubkey->e));

if(pRSA) RSA_free(pRSA);
if(pubkey) RSA_free(pubkey);
if(pubbuf) free(pubbuf);
return ret;
}
int main(int argc,char**argv)
{
if(!createRSA())
{
printf("error\n");
return -1;
}
return 0;
}

openssl之RSA编程第四步(发送公钥到远端) - yuanshuilee - 勇敢的劳尤条
        上面是测试结果。公钥buf长度140,加密“love”,打印密文,并打印出解密后的“love”,最后打印出公钥的N和e,打印其它信息,会出现段错误,因为公钥不存在那些信息。
         经过上面的测试,我们还能够将公钥buf保存在文件里面,也能够将这个buf通过网络传输,后面会继续完成整个安全传输过程。 关于公钥私钥生成、加密解密、签名认证等,参考推荐博客。

参考资料:
  评论这张
 
阅读(796)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017