原文链接: 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. Zabbix3.0 自动微信报障

    本来研究了一段时间短信报障的,但是短信报障需要手机运营商的设备支持,就没有继续下去. 正好发现微信公众号可以报障,完全可以代替短信报警的功能. 首先你需要一个微信公众号,实名认不认证没关系. http ...

  2. 使用 Python 进行稳定可靠的文件操作

    程序需要更新文件.虽然大部分程序员知道在执行I/O的时候会发生不可预期的事情,但是我经常看到一些异常幼稚的代码.在本文中,我想要分享一些如何在Python代码中改善I/O可靠性的见解. 考虑下述Pyt ...

  3. Mono、Unity和Xamarin三者关系

    1.Mono: .net是微软出的标准.如果站在Mono的角度来说,这套标准能规定编译器产生一些符合一定条件的文件出来,这些中间文件最后在目标平台上被解析成跟机器相关的东西.问题是,开始只有Windo ...

  4. 在服务器端将现有Git项目导入GitLab

    GitLab是由Ruby语言开发的基于Linux的Git服务器,是我见过的最强大的Git服务器.发现它之后,立即决定将Git服务器换成GitLab. 但安装好GitLab之后面临一个问题,如何将服务器 ...

  5. 解读SQL Server 2014可更新列存储索引——存储机制

    概述 SQL Server 2014被号称是微软数据库的一个革命性版本,其性能的提升的幅度是有史以来之最. 可更新的列存储索引作为SQL Server 2014的一个关键功能之一,在提升数据库的查询性 ...

  6. [转]Sublime Text 2 设置文件详解

    Sublime Text 2是那种让人会一眼就爱上的编辑器,不仅GUI让人眼前一亮,功能更是没的说,拓展性目前来说也完全够用了,网上介绍软件的文章和推荐插件的文章也不少,而且很不错,大家可以去找找自己 ...

  7. PHP的错误报错级别设置原理简析

    原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...

  8. paip.解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  9. Linux初学 - 安装及网络配置

    安装版本 CentOS-6.4 虚拟机  vmware workstation 12 配置 网络配置 检查网络设置是否成功 如果网络配置文件检查没有问题,配置完成后网络仍然ping不同 1.检查虚拟机 ...

  10. MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join

    转载请注明出处!! 之前数据表连接操作多使用逗号或者join,对几种连接的概念一直浑浑噩噩,最近研究了一波,把这些连接的区别搞明白了.   连接:A xjoin B(主表 操作 关联表)  selec ...