免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9915 | 回复: 22
打印 上一主题 下一主题

请教个openssl问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-25 10:56 |只看该作者 |倒序浏览
20可用积分
不知道是否应该在这里问,  sorry.


问题比较简单就是如何生成公钥.

我现在通过RSA_generate_key得到一个rsa结构,

然后直接PEM_write_bio_RSAPublicKey(b, (RSA *)rsa);
但写到文件中的值是错的.


我查了下资料RSA_generate_key是得到私钥, 那公钥是如何产生的呢?
我中见过程是不是漏掉了哪个?

最佳答案

查看完整内容

[ 本帖最后由 ynchnluiti 于 2008-11-25 13:44 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2008-11-25 10:56 |只看该作者
# cat testrsa.c

  1. #include <stdio.h>
  2. #include <openssl/bio.h>
  3. #include <openssl/rsa.h>
  4. #include <openssl/pem.h>

  5. int main()
  6. {
  7.     BIO *bpub, *bpri;

  8.     bpub = BIO_new_file("public.rsa", "w");

  9.     if (!bpub)
  10.         printf("failed to create public bio file\n");

  11.     bpri = BIO_new_file("private.rsa", "w");
  12.     if (!bpri)
  13.         printf("failed to create private bio file\n");

  14.     if (!bpub || !bpri) goto EXIT;

  15.     RSA *pRSA;
  16.     pRSA = RSA_generate_key( 1024, RSA_F4, NULL, NULL);
  17.     if (pRSA != NULL) {
  18.         if (!PEM_write_bio_RSAPublicKey(bpub, pRSA) ) {
  19.             printf("PEM_write_bio_RSAPublicKey: failed\n");
  20.         }

  21.         /*
  22.            int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
  23.            unsigned char *kstr, int klen,
  24.            pem_password_cb *cb, void *u);
  25.            */
  26.         if (!PEM_write_bio_RSAPrivateKey(bpri, pRSA, EVP_des_ede3_cbc(), NULL, 0, 0, "Private")) {
  27.             printf("PEM_write_bio_PrivateKey: failed\n");
  28.         }
  29.     }

  30. EXIT:
  31.     if (bpub)
  32.         BIO_free(bpub);
  33.     if (bpri)
  34.         BIO_free(bpri);

  35.     if (pRSA) free(pRSA);

  36.     printf("done.\n");

  37.     return 0;
  38. }
复制代码

# openssl version
OpenSSL 0.9.8g 19 Oct 2007

# gcc testrsa.c -Wall -I/usr/local/include/ -L/usr/local/ssl/lib/ -lssl -L/usr/local/ssl/lib/ -lcrypto -ldl -o test
# ./test
done.
# cat public.rsa
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAMOrgY2RShq+jbE06j5ghwt3kSE+p60fBinxN+Hi7WQbo7fpglhrzAKy
eng5X792dlvkhX4Q/1aUWlV5+mz/XLCvbjI5NqYn/r4qEqbpWri/psd94DQjDvGo
QFpA7e+JTtmkYjCET7h7SXl6tNHDvJvwmCiaYcKLjsIeoMYWF3XfAgMBAAE=
-----END RSA PUBLIC KEY-----
#
# cat private.rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,753C90474CAAC6F3

ajl7ZC3Plx/Tc/eoRlIz5xsbLe7VnnsDoqdWOw6X6rlb+S8Tcyz2G4BGgrc+lcrf
6Md+tC27DmKwfamTfyaZYv/XHjs7YwiD6MlfHHMbPZvArIDx6J0pQHoMwa51Efrr
WmuTlOzHN2AfixEobz8C+a9TCwHfjFiccsa1lV2cIV0BUWJ1TbYiBMU8jy69PzK+
IZo+avZR2ncqvk5NgTVSsMumMHlAyOb0PSDTbzJmIf82/XIZxieP2qFNdK5bM+qB
F+hZl2HIHt3EzuQ56yQa5EU8ocufnITJeUAk997zd+31ztUIWI2CbnjWY5UYqh3M
EBM2GeS8Kfo7dya9DDbmNtrx/UGxSlg16+KIVIrHXcytsiU/AnzgGzDMbFtLyLfh
NJXmiBenEF9yTcuv7Gnm19CvQ5dxayLJDrv4bpEfVJOPQv02tN4c223+ZlO2EGkD
M+HfUgKjZk+7aLZq24MDQ/WKlr2vh35G3yBW1UgjVuqPz4uYML3MpiEFy34KH4oA
xBxKE17AJ8n2ouZLD38ibnNQXPI3GgW32vi1T+9IuCGnBCsms2l6nLvEessSK8x5
PfV4UgNyUlnLSZA6fNxFspOI3IP2bqDA2ARasNVeJz9eU3H6JOT25mH7+O+WE2eH
LE1Iyqrvo+5GTqu1Gr/SHw67vZnFz8VFDEqel0pTJJ4ad4viYs0R7ZrYEkxQm8Ja
7PU5KtOnFHyrjhAVBsh9eH/XzTFgjyT7xB8nusNDoM931iITA5iItZTDSSOT3qFU
JT+mdwx1j7wfceUwt8dMLcXbVBJBxHicdu5A9MDXDaAJonZ/EgfBDg==
-----END RSA PRIVATE KEY-----

[ 本帖最后由 ynchnluiti 于 2008-11-25 13:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-11-25 11:28 |只看该作者
你所使用的系统是什么?你最终要实现的操作是什么?

如果要使用OPENSSL,具体过程是这样:
首先建立CA,包括CA服务器建立密钥对,CA自签密钥对;
然后服务器操作,包括建立密钥对,根据密钥对建立证书申请;
然后CA获得该申请之后进行签署生成服务器证书,服务器上安装该证书

最后客户端使用https访问。

你问的,到底是哪个步骤?

论坛徽章:
0
4 [报告]
发表于 2008-11-25 12:16 |只看该作者
原帖由 jerrywjl 于 2008-11-25 11:28 发表
你所使用的系统是什么?你最终要实现的操作是什么?

如果要使用OPENSSL,具体过程是这样:
首先建立CA,包括CA服务器建立密钥对,CA自签密钥对;
然后服务器操作,包括建立密钥对,根据密钥对建立证书申请 ...




是这样的, 目前还不需要证书(ike的sig认证方式)

现在只是想产生一对公钥和私钥.
或者说"建立密钥对"
不知道这样你能理解不?

论坛徽章:
0
5 [报告]
发表于 2008-11-25 12:31 |只看该作者
类似这样的方法建立密钥对:
[root@localhost conf]# openssl genrsa 1024 > /etc/httpd/conf/ssl.key/server.key

论坛徽章:
0
6 [报告]
发表于 2008-11-25 13:07 |只看该作者

回复 #1 Arthur_ 的帖子

产生 RSA 密钥对: >openssl genrsa -out 1.key 1024

取出 RSA 公钥: >openssl rsa -in 1.key -pubout -out 1.pubkey

论坛徽章:
0
7 [报告]
发表于 2008-11-25 13:24 |只看该作者
谢谢两位,我的问题是想调用openssl的API.

论坛徽章:
0
8 [报告]
发表于 2008-11-25 13:56 |只看该作者
to yunchnluiti,

thanks a lot,

PEM_write_bio_RSAPrivateKey, 这个产生的结果是正确的,

PEM_write_bio_RSAPublicKey 我这里却不正确(产生的pem总是少一半.

对于上述的不正确, 你能否帮我想想是什么引起的呢?

论坛徽章:
0
9 [报告]
发表于 2008-11-25 14:02 |只看该作者
  1. static int dump_rsa(uint32 rsa, uint32 offset)
  2. {
  3.   BIO *b = BIO_new_file("dump.key", "w+");
  4.   
  5.   if(b){
  6.     PEM_write_bio_RSAPublicKey(b, (RSA *)rsa); //结果是错误的,郁闷., 换成private就对了.
  7.    /* BN_stdout(((RSA *)rsa)->n);*/
  8.     BIO_free(b);
  9.   }
  10.   return 0;
  11. }

  12. static int gen_rsa(uint32 modulus, uint32 label)
  13. {
  14.   static RSA *rsa = 0;
  15.   
  16.   RAND_seed(rsa_seed, sizeof rsa_seed); //我的系统没有/dev/random, 所以要先这样做,初始化entropy, 不然会报PRIN错误. 这是我加的不知道结果有没有影响.
  17.   if(RSA_MODULUS_RANGE_OK(modulus))
  18.     rsa = RSA_generate_key(modulus, RSA_F4, NULL, NULL);
  19. /* if(rsa){
  20.     struct pki_kdb *kdb = kdb_new("genrsa");
  21.     if(kdb)
  22.       kdb->insert((uint32)kdb, KMU_RSA, label);
  23.   }*/
  24.   dump_rsa((uint32)rsa, 0);
  25.   return rsa?0:-ENOBUF;
  26. }
复制代码

[ 本帖最后由 Arthur_ 于 2008-11-25 14:04 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 2008-11-25 14:05 |只看该作者
原帖由 Arthur_ 于 2008-11-25 13:56 发表
to yunchnluiti,

thanks a lot,

PEM_write_bio_RSAPrivateKey, 这个产生的结果是正确的,

PEM_write_bio_RSAPublicKey 我这里却不正确(产生的pem总是少一半.

对于上述的不正确, 你能否帮我想想是什 ...

你是说你执行上面的程序后得到的public.rsa中内容不全?(没有"-----END RSA PUBLIC KEY-----")
还是你自己的代码中得到的public key不全?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP