原文链接:http://blog.csdn.net/kkxgx/article/details/19850509
通常数字证书包含很多信息,其中N和E值即我们称为的公钥。如何从PEM 或者DER格式的证书中提出证书呢?下面给出代码实现从PEM和DER编码的证书中提出N、E。
- #include<openssl/evp.h>
- #include<openssl/x509.h>
- #include<stdio.h>
- #include<stdlib.h>
- voidPrintHex(unsignedchar*str,unsignedintlen)
- {
- inti=0;
- for(i=0;i<len;i++)
- {
- if(i%4==0)
- {
- printf("0x");
- }
- printf("%02x",str[i]);
- if(i%4==3)
- {
- printf("");
- }
- if(i%16==15)
- {
- printf(" ");
- }
- }
- printf(" ");
- }
- voidGetPukfromPEM()
- {
- X509*x;
- BIO*b;
- EVP_PKEY*k;
- RSA*rsa;
- unsignedcharn[300]={0x0};
- unsignedchare[300]={0x0};
- unsignedintlen;
- /*www.google.com1为PEM格式的数字证书,从firefox中导出*/
- b=BIO_new_file("www.google.com1","r");
- x=PEM_read_bio_X509(b,NULL,NULL,NULL);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n!=NULL)
- {
- BN_bn2bin(rsa->n,n);
- len=BN_num_bytes(rsa->n);
- printf("N: ");
- PrintHex(n,len);
- }
- else
- {
- printf("PEMerror ");
- }
- if(rsa->e!=NULL)
- {
- BN_bn2bin(rsa->e,e);
- len=BN_num_bytes(rsa->e);
- printf("E: ");
- PrintHex(e,len);
- }
- else
- {
- printf("PEMerror ");
- }
- BIO_free(b);
- X509_free(x);
- }
- voidGetPukfromDER()
- {
- X509*x;
- FILE*fp;
- unsignedcharbuf[5000],*p;
- intret;
- EVP_PKEY*k;
- RSA*rsa;
- unsignedcharn[300]={0x0};
- unsignedchare[300]={0x0};
- unsignedintlen;
- /*www.google.com2为DER编码的数字证书,从firefox中导出
- */
- fp=fopen("www.google.com2","rb");
- if(!fp)return;
- len=fread(buf,1,5000,fp);
- fclose(fp);
- p=buf;
- x=X509_new();
- d2i_X509(&x,(constunsignedchar**)&p,len);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n!=NULL)
- {
- BN_bn2bin(rsa->n,n);
- len=BN_num_bytes(rsa->n);
- printf("N: ");
- PrintHex(n,len);
- }
- else
- {
- printf("DERerror ");
- }
- if(rsa->e!=NULL)
- {
- BN_bn2bin(rsa->e,e);
- len=BN_num_bytes(rsa->e);
- printf("E: ");
- PrintHex(e,len);
- }
- else
- {
- printf("DERerror ");
- }
- X509_free(x);
- }
- intmain()
- {
- GetPukfromPEM();
- GetPukfromDER();
- return0;
- }
程序执行结果如下:
- N:
- 0xb073f0f20x04eec2a20x46ca342a0xaabb6023
- 0xd111761f0x1f3ad0650x834e9a450xa8437085
- 0x76f01f870x00021f6e0x3b1717c40xb5e91946
- 0xa292258d0x622ab4630x301fb9850xf835e116
- 0x5a7649cc0x504853390x5989d6840x02fb9aec
- 0x1bc751d50x769590d40x3a2ab8a60xde024d06
- 0xfbcdeda50x46415f550x74e5ec7e0x40dc509c
- 0xb5e4355d0x1e6820f80xe9dea36a0x28bf41d2
- 0xa1b3e2250x8d0c1bca0x3d930c180xaedfc5bc
- 0xfdbc82ba0x6800d7160x32719f650xb511da68
- 0x59d0a6570x641bc9fe0x98e5f5a50x65eae1db
- 0xeef4b39d0xb38eea870xae16d21e0xa07c7c69
- 0x3f2916850x0153a76c0xf160abdd0xa2fc2547
- 0xd432d1120xddf748120xe0fc9ca20x7798e989
- 0x99b8f8380xf18c06c20x7a23366d0x9b9dcd30
- 0xc8c734170x1ebb7d420xc8abe7150x16f673b5
- E:
- 0x010001
- N:
- 0xb073f0f20x04eec2a20x46ca342a0xaabb6023
- 0xd111761f0x1f3ad0650x834e9a450xa8437085
- 0x76f01f870x00021f6e0x3b1717c40xb5e91946
- 0xa292258d0x622ab4630x301fb9850xf835e116
- 0x5a7649cc0x504853390x5989d6840x02fb9aec
- 0x1bc751d50x769590d40x3a2ab8a60xde024d06
- 0xfbcdeda50x46415f550x74e5ec7e0x40dc509c
- 0xb5e4355d0x1e6820f80xe9dea36a0x28bf41d2
- 0xa1b3e2250x8d0c1bca0x3d930c180xaedfc5bc
- 0xfdbc82ba0x6800d7160x32719f650xb511da68
- 0x59d0a6570x641bc9fe0x98e5f5a50x65eae1db
- 0xeef4b39d0xb38eea870xae16d21e0xa07c7c69
- 0x3f2916850x0153a76c0xf160abdd0xa2fc2547
- 0xd432d1120xddf748120xe0fc9ca20x7798e989
- 0x99b8f8380xf18c06c20x7a23366d0x9b9dcd30
- 0xc8c734170x1ebb7d420xc8abe7150x16f673b5
- E:
- 0x010001