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

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

  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("\n");
  22. }
  23. }
  24. printf("\n");
  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:\n");
  45. PrintHex(n,len);
  46. }
  47. else
  48. {
  49. printf("PEM error \n");
  50. }
  51. if(rsa->e != NULL)
  52. {
  53. BN_bn2bin(rsa->e, e);
  54. len= BN_num_bytes(rsa->e);
  55. printf("E:\n");
  56. PrintHex(e,len);
  57. }
  58. else
  59. {
  60. printf("PEM error \n");
  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. EVP_PKEY *k;
  72. RSA *rsa;
  73. unsigned char n[300] ={0x0};
  74. unsigned char e[300] ={0x0};
  75. unsigned int len;
  76. /* www.google.com2为DER编码的数字证书 ,从firefox中导出
  77. */
  78. fp=fopen("www.google.com2","rb");
  79. if(!fp) return ;
  80. len=fread(buf,1,5000,fp);
  81. fclose(fp);
  82. p=buf;
  83. x=X509_new();
  84. d2i_X509(&x,(const unsigned char **)&p,len);
  85. k=X509_get_pubkey(x);
  86. rsa=EVP_PKEY_get1_RSA(k);
  87. if(rsa->n != NULL)
  88. {
  89. BN_bn2bin(rsa->n, n);
  90. len= BN_num_bytes(rsa->n);
  91. printf("N:\n");
  92. PrintHex(n,len);
  93. }
  94. else
  95. {
  96. printf("DER error \n");
  97. }
  98. if(rsa->e != NULL)
  99. {
  100. BN_bn2bin(rsa->e, e);
  101. len= BN_num_bytes(rsa->e);
  102. printf("E:\n");
  103. PrintHex(e,len);
  104. }
  105. else
  106. {
  107. printf("DER error \n");
  108. }
  109. X509_free(x);
  110. }
  111. int main()
  112. {
  113. GetPukfromPEM();
  114. GetPukfromDER();
  115. return 0;
  116. }

程序执行结果如下:

  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. E:
  19. 0x010001
  20. N:
  21. 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023
  22. 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085
  23. 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946
  24. 0xa292258d 0x622ab463 0x301fb985 0xf835e116
  25. 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec
  26. 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06
  27. 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c
  28. 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2
  29. 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc
  30. 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68
  31. 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db
  32. 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69
  33. 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547
  34. 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989
  35. 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30
  36. 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5
  37. E:
  38. 0x010001

openssl 学习之从证书中提取RSA公钥N 和 E的更多相关文章

  1. java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)

    import lombok.Cleanup; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; impor ...

  2. (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)

    openssl  rsa      是RSA对称密钥的处理工具 openssl  pkey   是通用非对称密钥处理工具,它们用法基本一致,所以只举例说明openssl rsa. 它们的用法很简单,基 ...

  3. (11) openssl req(生成请求证书、私钥和自建CA)

    伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...

  4. X509证书中RSA公钥的提取与载入

    原文链接: http://blog.chinaunix.net/uid-16515626-id-2741894.html   由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等 ...

  5. [转载]X509证书中RSA公钥的提取与载入 pem key

    原地址:https://blog.csdn.net/anddy926/article/details/8940377 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等功能.在 ...

  6. java验证openssl生成的ssl证书和私钥是否匹配

    最近有一个需求上传ssl证书和私钥,但是上传之前需要验证ssl证书和私钥是否正确,其中的业务逻辑涉及到以下几点: 一.读取ssl证书,读取ssl证书公钥       要实现该功能比较简单,java里面 ...

  7. OpenSSL学习笔记

    SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...

  8. iOS中使用RSA对数据进行加密解密

    RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...

  9. OPENSSL 学习整理-介绍

    Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...

随机推荐

  1. Java的历史

    1991 绿色计划 (Green Project) 1991 年 1 月 一个名为"Green Project"的项目启动.该项旨在为家用电器提供支持,使这些电器智能化并且能够彼此 ...

  2. 在SSMS里批量删除表、存储过程等各种对象

    在SSMS里批量删除表.存储过程等各种对象 以前想找批量删除表或者存储过程的方法,原来SSMS的GUI界面也可以完成 请看下图,因为这次出差的时候要删除所有的存储过程,然后重建这些存储过程 而表.函数 ...

  3. log-malloc2 0.2.4 发布

    log-malloc2 0.2.4 发布了,该版本修复了日志格式输出的 bug. og-malloc2 是一个 malloc 日志预加载库,用于检测内存泄漏问题.

  4. 虚拟机Ubuntu14/15启用root用户登录

    1. 为root用户设置密码 sudo passwd root 需要先输入一次当前用户的登陆密码,然后输入两次root用户的密码(自己设置). 2. 切换至root用户 sudo -s 3. 编辑登陆 ...

  5. [Hyper-V]制作一个干净的操作系统模板

    描述: 在Hyper-V里创建虚拟机的时候,我们可以先来创建一个干净的操作系统,将其制作为操作系统模板,该虚拟机的磁盘文件也将被视作基础磁盘以方便基于它创建差异化磁盘 安装其它虚拟机的时候就可以差异化 ...

  6. MVP

    引自: http://www.cnblogs.com/Leo_wl/archive/2013/05/03/3056299.html http://www.codeproject.com/Article ...

  7. [自娱自乐] 3、超声波测距模块DIY笔记(三)

    前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对 ...

  8. 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用

    <?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...

  9. 博客还是搬到csdn吧~

    从csdn转到博客园是因为博客园开放了博客接口,方便发博客,再者博客样式也比较多,排版兼容性也较好. but, 博客园的链接在多个群里进行了宣传,当时大概有2000多的访问量,但是一个月过去了,现在还 ...

  10. paip.编程语言到底有没有优劣之分优秀之分

    paip.编程语言到底有没有优劣之分优秀之分 人有没有优秀之分之分呢??狗有没有优秀之分呢?? 当然是有的,有好人坏人的说法,或者精英平民的区分..狗也有好狗狗,坏狗,疯狗嘛.. 所以,自然,编程语言 ...