openssl 学习之从证书中提取RSA公钥N 和 E

摘要:
下面给出代码实现从PEM和DER编码的证书中提出N、E。[cpp]viewplaincopy#include#include#include#includevoidPrintHex{inti=0;for{if{printf;}printf;if{printf("");}if{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;x=PEM_read_bio_X509;k=X509_get_pubkey;rsa=EVP_PKEY_get1_RSA;if(rsa-˃n!

原文链接: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. voidPrintHex(unsignedchar*str,unsignedintlen)
  6. {
  7. inti=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. voidGetPukfromPEM()
  27. {
  28. X509*x;
  29. BIO*b;
  30. EVP_PKEY*k;
  31. RSA*rsa;
  32. unsignedcharn[300]={0x0};
  33. unsignedchare[300]={0x0};
  34. unsignedintlen;
  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("PEMerror ");
  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("PEMerror ");
  61. }
  62. BIO_free(b);
  63. X509_free(x);
  64. }
  65. voidGetPukfromDER()
  66. {
  67. X509*x;
  68. FILE*fp;
  69. unsignedcharbuf[5000],*p;
  70. intret;
  71. EVP_PKEY*k;
  72. RSA*rsa;
  73. unsignedcharn[300]={0x0};
  74. unsignedchare[300]={0x0};
  75. unsignedintlen;
  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,(constunsignedchar**)&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: ");
  92. PrintHex(n,len);
  93. }
  94. else
  95. {
  96. printf("DERerror ");
  97. }
  98. if(rsa->e!=NULL)
  99. {
  100. BN_bn2bin(rsa->e,e);
  101. len=BN_num_bytes(rsa->e);
  102. printf("E: ");
  103. PrintHex(e,len);
  104. }
  105. else
  106. {
  107. printf("DERerror ");
  108. }
  109. X509_free(x);
  110. }
  111. intmain()
  112. {
  113. GetPukfromPEM();
  114. GetPukfromDER();
  115. return0;
  116. }

程序执行结果如下:

  1. N:
  2. 0xb073f0f20x04eec2a20x46ca342a0xaabb6023
  3. 0xd111761f0x1f3ad0650x834e9a450xa8437085
  4. 0x76f01f870x00021f6e0x3b1717c40xb5e91946
  5. 0xa292258d0x622ab4630x301fb9850xf835e116
  6. 0x5a7649cc0x504853390x5989d6840x02fb9aec
  7. 0x1bc751d50x769590d40x3a2ab8a60xde024d06
  8. 0xfbcdeda50x46415f550x74e5ec7e0x40dc509c
  9. 0xb5e4355d0x1e6820f80xe9dea36a0x28bf41d2
  10. 0xa1b3e2250x8d0c1bca0x3d930c180xaedfc5bc
  11. 0xfdbc82ba0x6800d7160x32719f650xb511da68
  12. 0x59d0a6570x641bc9fe0x98e5f5a50x65eae1db
  13. 0xeef4b39d0xb38eea870xae16d21e0xa07c7c69
  14. 0x3f2916850x0153a76c0xf160abdd0xa2fc2547
  15. 0xd432d1120xddf748120xe0fc9ca20x7798e989
  16. 0x99b8f8380xf18c06c20x7a23366d0x9b9dcd30
  17. 0xc8c734170x1ebb7d420xc8abe7150x16f673b5
  18. E:
  19. 0x010001
  20. N:
  21. 0xb073f0f20x04eec2a20x46ca342a0xaabb6023
  22. 0xd111761f0x1f3ad0650x834e9a450xa8437085
  23. 0x76f01f870x00021f6e0x3b1717c40xb5e91946
  24. 0xa292258d0x622ab4630x301fb9850xf835e116
  25. 0x5a7649cc0x504853390x5989d6840x02fb9aec
  26. 0x1bc751d50x769590d40x3a2ab8a60xde024d06
  27. 0xfbcdeda50x46415f550x74e5ec7e0x40dc509c
  28. 0xb5e4355d0x1e6820f80xe9dea36a0x28bf41d2
  29. 0xa1b3e2250x8d0c1bca0x3d930c180xaedfc5bc
  30. 0xfdbc82ba0x6800d7160x32719f650xb511da68
  31. 0x59d0a6570x641bc9fe0x98e5f5a50x65eae1db
  32. 0xeef4b39d0xb38eea870xae16d21e0xa07c7c69
  33. 0x3f2916850x0153a76c0xf160abdd0xa2fc2547
  34. 0xd432d1120xddf748120xe0fc9ca20x7798e989
  35. 0x99b8f8380xf18c06c20x7a23366d0x9b9dcd30
  36. 0xc8c734170x1ebb7d420xc8abe7150x16f673b5
  37. E:
  38. 0x010001

免责声明:文章转载自《openssl 学习之从证书中提取RSA公钥N 和 E》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SharpCompress压缩和解压缩,并解决压缩的中文乱码问题java序列化/反序列化之xml、protobuf、protostuff 的比较与使用例子下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jenkins安装

 一, Jenkins简介  1.开源自动化持续集成与部署平台 CI, 持续集成 CD, 持续部署 2.Jenkins支持的任务类型 自由风格任务 流水线(Pipeline) Maven 项目 多配置项目 多分支流水线任务 3.Jenkins常见的任务功能 定时任务 Pull SCM -- 定时检查代码库中的代码有没有更新, 指定的分支或者ta...

将文件映射到内存

mmap的好处: 和read、write系统调用相比不会产生无关的副本; 如果不出错就不会有系统调用、操作环境切换等开销; 不再需要lseek调用。 mmap的坏处: 内存映射总是PAGESIZE的整数倍,会浪费一定的内存; 如果要映射的内容非常大的时候可能找不到连续的线性地址空间; 创建并维护内核相关数据结构,这部分可能抵消双重副本节省下的开销...

STM32 F4xx Fault 异常错误定位指南

STM32 F407 采用 Cortex-M4 的内核,该内核的 Fault 异常可以捕获非法的内存访问和非法的编程行为。Fault异常能够检测到以下几类非法行为: 总线 Fault: 在取址、数据读/写、取中断变量、进入/退出中断时寄存器堆栈操作(入栈/出栈)时检测到内存访问错误。 存储器管理 Fault: 检测到内存访问违反了内存保护单元(MPU,...

第二次实验报告

C程序设计实验报告 实验项目: 4.3.1 if语句的应用 4.3.2 switch/case语句的应用 4.3.3 switch/case语句嵌套结构if语句的应用 4.3.4 switch/case结构的嵌套应用 4.3.5 分析程序 姓名:欧阳思健        实验地点:514实验教室         实验时间:2019.04.03 一、实验目...

centos+mono+nginx+jexus 搭建linux下c#运行环境测试

从零开始搭建Linux测试环境之dk+apache+jboss +mod_jk+openssl软件介绍1.JDK(Java DevelopmentKit)。Java开发工具包。大家都知道Java程序可以在绝大多数的机器上运行,不需要安装任何额外的软件,为什么我们要安装JDK呢?这是因为Java程序在开发过程中,需要将源代码转换为中间代码形式,也即class...

深度解析C语言中的sizeof

1)解析C语言中的sizeof 一、sizeof的概念  sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法  1、用于数据类型   sizeof使用形式:...