免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 16676 | 回复: 21

请教使用OpenSSL读写X509数字证书,有代码 [复制链接]

论坛徽章:
0
发表于 2007-12-15 13:44 |显示全部楼层
我写的代码

//---------------------------------------------------------------------------


#include   <vcl.h>
#include   <iostream>
#include   <openssl/evp.h>
#pragma   hdrstop

//---------------------------------------------------------------------------


#pragma   argsused

#include   <vcl.h>
#include   <stdio.h>

#include   <openssl/x509.h>
#include   <openssl/x509v3.h>
#include   <openssl/pem.h>
#pragma   hdrstop

//---------------------------------------------------------------------------


#pragma   argsused
using   namespace   std;
int   main(int   argc,   char*   argv[])
{

              X509   *x   =   0;
              int   id,len,ret;
              FILE   *fp,*fp2;
              ASN1_BIT_STRING   *dd;
              unsigned   char   buf[50000],*p;
              char   buffer[72];
              char   out[5000];

              int   outl;

              EVP_ENCODE_CTX   ectx;
              EVP_EncodeInit(&ectx);

              fp=fopen("key.cer","rb");


              len=fread(buf,1,50000,fp);

              fclose(fp);
              fp2   =   fopen("aa.dat","wb");


              p=buf;

              d2i_X509(&x,(const   unsigned   char   **)&p,len);


              X509_NAME   *subject   =   X509_get_subject_name(x);

              int   pos=     String(subject-> bytes-> data).Pos("370");
              String   strSubJect   =   String(subject-> bytes-> data).SubString(pos,15);

              cout < <"SubJect:" < <strSubJect.c_str() < <endl;               //打印subject



              ASN1_BIT_STRING   *pubkey   =   X509_get0_pubkey_bitstr(x);   //得到pubkey


              sprintf(buffer,pubkey-> data);                 //pubkey-> data   放到buffer里


              EVP_EncodeUpdate(&ectx,out,&outl,pubkey-> data,pubkey-> length);         //base64加密   pubkey-> data;


              cout < <"PublicKeyLength:" < <pubkey-> length < <endl;               //长度72

              cout < <"PublicKey:" < <buffer < <endl;

              X509_free(x);
              char   c   =   getchar();

              return   0;


}



打印的结果
SubJect:370212753771600
PublicKeyLength:72
PublicKey:0F!

//---------------------------------------------------------------------------
原始的key.cer内容

openssl   x509   -inform   der   -in   key.cer   -text   -pubkey
Certificate:
        Data:
                Version:   3   (0x2)
                Serial   Number:
                        32:30:30:35:31:32:31:36:31:30:31:37:35:31:40:41:42:43
                Signature   Algorithm:   md5WithRSAEncryption
                Issuer:   CN=137020000
                Validity
                        Not   Before:   Dec   16   10:17:51   2005   GMT
                        Not   After   :   Dec   31   23:59:59   2009   GMT
                Subject:   CN=370212753771600
                Subject   Public   Key   Info:
                        Public   Key   Algorithm:   rsaEncryption
                        RSA   Public   Key:   (253   bit)
                                Modulus   (253   bit):
                                        16:1b:cc:a7:13:48:65:5d:a5:47:34:2e:63:c8:95:
                                        b0:a2:c6:81:76:b5:9e:d7:15:d9:0e:e5:ec:d1:42:
                                        37:e1
                                Exponent:
                                        08:d7:eb:76:07:b6:8e:f2:42:1c:7b:45:c1:83:6f:
                                        13:38:1f:f6:75:97:88:a6:d8:98:7e:8f:61:8b:39:
                                        7c:d5
        Signature   Algorithm:   md5WithRSAEncryption
                06:cb:0e:74:df:89:5b:9d:c0:1e:35:e0:b2:9e:80:18:b6:b9:
                ae:32:b9:16:93:5f:4f:d6:7c:de:a6:83:45:9d
-----BEGIN   PUBLIC   KEY-----
MFgwDQYJKoZIhvcNAQEBBQADRwAwRAIgFhvMpxNIZV2lRzQuY8iVsKLGgXa1ntcV
2Q7l7NFCN+ECIAjX63YHto7yQhx7RcGDbxM4H/Z1l4im2Jh+j2GLOXzV
-----END   PUBLIC   KEY-----
-----BEGIN   CERTIFICATE-----
MIIBCzCB1qADAgECAhIyMDA1MTIxNjEwMTc1MUBBQkMwDQYJKoZIhvcNAQEEBQAw
FDESMBAGA1UEAxMJMTM3MDIwMDAwMB4XDTA1MTIxNjEwMTc1MVoXDTA5MTIzMTIz
NTk1OVowGjEYMBYGA1UEAxMPMzcwMjEyNzUzNzcxNjAwMFowDQYJKoZIhvcNAQEB
BQADSQAwRgIhABYbzKcTSGVdpUc0LmPIlbCixoF2tZ7XFdkO5ezRQjfhAiEACNfr
dge2jvJCHHtFwYNvEzgf9nWXiKbYmH6PYYs5fNUwDQYJKoZIhvcNAQEEBQADIQAG
yw5034lbncAeNeCynoAYtrmuMrkWk19P1nzepoNFnQ==
-----END   CERTIFICATE-----

//---------------------------------------------------------------------------
在windows里打开key.cer   看到的publickey内容
b0   a2   c6   81   76   b5   9e   d7   15   d9   0e   e5   ec   d1   42   37   e1   02   21   00   08   d7   eb   76   07   b6   8e   f2   42   1c   7b   45   c1   83   6f   13   38   1f   f6   75   97   88   a6   d8   98   7e   8f   61   8b   39   7c   d5


我想要在程序里得到的就是这个在windows里打开key.cer后看到的publickey内容,请问怎么操作?

论坛徽章:
0
发表于 2007-12-15 14:17 |显示全部楼层
你的意思是逐字节打印十六进制值?

论坛徽章:
0
发表于 2007-12-15 14:26 |显示全部楼层
逐字节打印十六进制值  

是啊,这样应该能得到 publickey内容

我程序里的和上面结果明显不一样...如果加密后的base64 值不一样,那么逐字节打印的十六进制值也肯定不一样把
openssl   x509   -inform   der   -in   key.cer   -pubkey
-----BEGIN   PUBLIC   KEY-----
MFgwDQYJKoZIhvcNAQEBBQADRwAwRAIgFhvMpxNIZV2lRzQuY8iVsKLGgXa1ntcV
2Q7l7NFCN+ECIAjX63YHto7yQhx7RcGDbxM4H/Z1l4im2Jh+j2GLOXzV
-----END   PUBLIC   KEY-----


上面的   pubkey   是base64编码的。

但是如果我把pubkey-> data   加base64后结果和上面不一样。

EVP_EncodeUpdate(&ectx,out,&outl,pubkey-> data,pubkey-> length);         //base64加密   pubkey-> data;
cout < <"PublicKey_Base64:" < <out < <endl;

结果:
PublicKey_Base64:MEYCIQAWG8ynE0hlXaVHNC5jyJWwosaBdrWe1xXZDuXs0UI34QIhAAjX63YHto7y




如何逐自己打印16进制的值?

[ 本帖最后由 jasonnbfan 于 2007-12-15 14:34 编辑 ]

论坛徽章:
0
发表于 2007-12-15 14:54 |显示全部楼层
printf("%02x ", x);
第二遍了。

论坛徽章:
0
发表于 2007-12-15 15:12 |显示全部楼层
原帖由 cugb_cat 于 2007-12-15 14:54 发表
printf("%02x ", x);
第二遍了。



老大,不是我不懂你这个代码,也不是我不知道这个方法。打印出来的东西和原来的不一样!
我这么打印有什么用....

论坛徽章:
0
发表于 2007-12-15 15:17 |显示全部楼层
用 X509_get_pubkey() 和 i2d_PUBKEY()

论坛徽章:
0
发表于 2007-12-15 15:37 |显示全部楼层

回复 #5 jasonnbfan 的帖子

base64

论坛徽章:
0
发表于 2007-12-15 15:41 |显示全部楼层
这2个我都用过了,头文件里有的关于 pubkey的我都用过了。
X509_get_pubkey() 和 i2d_PUBKEY()
一个返回EVP_PKEY 类型,一个给参数EVP_PKEY类型

返回后的EVP_PKEY没有得到pubkey数据的方法。

x->cert_info->key->public_key->data 和上面的pubkey->data值是一样的。

论坛徽章:
0
发表于 2007-12-15 15:46 |显示全部楼层
>> 这2个我都用过了,头文件里有的关于 pubkey的我都用过了。
>> X509_get_pubkey() 和 i2d_PUBKEY()
>> 一个返回EVP_PKEY 类型,一个给参数EVP_PKEY类型

不假

>> 返回后的EVP_PKEY没有得到pubkey数据的方法。

i2d_PUBKEY 有两个参数,其中一个就是用来获取 DER 编码的公钥

论坛徽章:
0
发表于 2007-12-15 15:49 |显示全部楼层
这么说吧。
//从windows里打开.cer文件显示的publickey保存到文件里是下面内容
30 46 02 21 00 16 1b cc a7 13 48 65 5d a5 47 34 2e 63 c8 95 b0 a2 c6 81 76 b5 9e d7 15 d9 0e e5 ec d1 42 37 e1 02 21 00 08 d7 eb 76 07 b6 8e f2 42 1c 7b 45 c1 83 6f 13 38 1f f6 75 97 88 a6 d8 98 7e 8f 61 8b 39 7c d5
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F


00000000   30 46 02 21 00 16 1B CC  A7 13 48 65 5D A5 47 34   0F.!...抬.He]?4
00000010   2E 63 C8 95 B0 A2 C6 81  76 B5 9E D7 15 D9 0E E5   .c葧阿苼v禐???
00000020   EC D1 42 37 E1 02 21 00  08 D7 EB 76 07 B6 8E F2   煅B7?!..纂v.稁?
00000030   42 1C 7B 45 C1 83 6F 13  38 1F F6 75 97 88 A6 D8   B.{E羶o.8.鰑棃ω
00000040   98 7E 8F 61 8B 39 7C D5                            榽廰?|

我得到的pubkey->data,写到文件里只有下面这些
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   30 46 02 21 00 00 00 00  00 00 00 00 00 00 00 00   0F.!............
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000040   00 00 00 00 00 00 00 00                            ........


也就是只得到了
30 46 02 21
后面的都没有得到。所以我怀疑这个方法得到的数据就有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP