zoukankan      html  css  js  c++  java
  • openssl 学习之从证书中提取RSA公钥N 和 E

    原文链接: http://blog.csdn.net/kkxgx/article/details/19850509

    通常数字证书包含很多信息,其中N和E值即我们称为的公钥。如何从PEM 或者DER格式的证书中提出证书呢?下面给出代码实现从PEM和DER编码的证书中提出N、E。

     

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <openssl/evp.h>  
    2. #include <openssl/x509.h>  
    3. #include <stdio.h>  
    4. #include <stdlib.h>  
    5. void PrintHex(unsigned char *str, unsigned int len)  
    6. {  
    7.     int i = 0;  
    8.     for(i =0;i< len; i++)  
    9.     {  
    10.         if(i%4 == 0)  
    11.     {  
    12.        printf("0x");  
    13.     }  
    14.         printf("%02x",str[i]);  
    15.     if(i%4 == 3)  
    16.         {  
    17.            printf(" ");  
    18.         }  
    19.         if(i%16 == 15)  
    20.         {  
    21.         printf(" ");  
    22.         }  
    23.     }  
    24.     printf(" ");  
    25. }  
    26. void GetPukfromPEM()  
    27. {  
    28.     X509 *x;  
    29.     BIO *b;  
    30.     EVP_PKEY *k;  
    31.     RSA *rsa;  
    32.     unsigned char n[300] ={0x0};  
    33.     unsigned char e[300] ={0x0};  
    34.     unsigned int len;  
    35.     /*www.google.com1为PEM格式的数字证书,从firefox中导出 */       
    36.     b=BIO_new_file("www.google.com1","r");  
    37.     x=PEM_read_bio_X509(b,NULL,NULL,NULL);  
    38.     k=X509_get_pubkey(x);  
    39.     rsa=EVP_PKEY_get1_RSA(k);  
    40.     if(rsa->n != NULL)  
    41.     {  
    42.         BN_bn2bin(rsa->n, n);  
    43.         len= BN_num_bytes(rsa->n);  
    44.         printf("N: ");  
    45.         PrintHex(n,len);  
    46.     }  
    47.     else  
    48.     {  
    49.         printf("PEM error  ");  
    50.     }  
    51.     if(rsa->e != NULL)  
    52.     {  
    53.         BN_bn2bin(rsa->e, e);  
    54.         len= BN_num_bytes(rsa->e);    
    55.         printf("E: ");  
    56.         PrintHex(e,len);  
    57.     }  
    58.     else  
    59.     {  
    60.         printf("PEM error  ");  
    61.     }  
    62.     BIO_free(b);  
    63.     X509_free(x);  
    64. }  
    65. void GetPukfromDER()  
    66. {  
    67.     X509 *x;  
    68.     FILE *fp;  
    69.     unsigned char   buf[5000],*p;  
    70.     int ret;  
    71.     
    72.     EVP_PKEY *k;  
    73.     RSA *rsa;  
    74.     unsigned char n[300] ={0x0};  
    75.     unsigned char e[300] ={0x0};  
    76.     unsigned int len;  
    77.     /* www.google.com2为DER编码的数字证书 ,从firefox中导出 
    78.     */  
    79.     fp=fopen("www.google.com2","rb");  
    80.     if(!fp) return ;  
    81.     len=fread(buf,1,5000,fp);  
    82.     fclose(fp);  
    83.     p=buf;  
    84.     x=X509_new();  
    85.     d2i_X509(&x,(const unsigned char **)&p,len);  
    86.     k=X509_get_pubkey(x);  
    87.     rsa=EVP_PKEY_get1_RSA(k);  
    88.     if(rsa->n != NULL)  
    89.     {  
    90.         BN_bn2bin(rsa->n, n);  
    91.         len= BN_num_bytes(rsa->n);  
    92.     printf("N: ");  
    93.     PrintHex(n,len);  
    94.     }  
    95.     else  
    96.     {  
    97.         printf("DER error  ");  
    98.     }  
    99.     if(rsa->e != NULL)  
    100.     {  
    101.         BN_bn2bin(rsa->e, e);  
    102.         len= BN_num_bytes(rsa->e);  
    103.         printf("E: ");  
    104.         PrintHex(e,len);  
    105.     }  
    106.     else  
    107.     {  
    108.         printf("DER error  ");  
    109.     }  
    110.       
    111.     X509_free(x);     
    112. }  
    113. int main()  
    114. {  
    115.     GetPukfromPEM();  
    116.     GetPukfromDER();  
    117.     return 0;  
    118. }  

    程序执行结果如下:

     

     

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. N:  
    2. 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023   
    3. 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085   
    4. 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946   
    5. 0xa292258d 0x622ab463 0x301fb985 0xf835e116   
    6. 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec   
    7. 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06   
    8. 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c   
    9. 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2   
    10. 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc   
    11. 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68   
    12. 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db   
    13. 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69   
    14. 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547   
    15. 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989   
    16. 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30   
    17. 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5   
    18.   
    19. E:  
    20. 0x010001  
    21. N:  
    22. 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023   
    23. 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085   
    24. 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946   
    25. 0xa292258d 0x622ab463 0x301fb985 0xf835e116   
    26. 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec   
    27. 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06   
    28. 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c   
    29. 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2   
    30. 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc   
    31. 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68   
    32. 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db   
    33. 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69   
    34. 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547   
    35. 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989   
    36. 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30   
    37. 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5   
    38.   
    39. E:  
    40. 0x010001  
  • 相关阅读:
    js 数组扁平
    leetcode 15 三数之和
    leetcode 1 两数之和
    编写一个自定义事件类,包含on/off/emit/once方法
    css常见双栏和三栏布局
    关于js中this指向的问题
    函数防抖和节流
    ie6 js报错汇总
    windows PHP配置随笔
    上传文件表单file,限制上传文件类型的方法--参数accept
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4794613.html
Copyright © 2011-2022 走看看