原文链接: 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. 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)

    湫湫系列故事――减肥记I  HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...

  2. NBIbatis 框架体系说明

    框架体系说明 Application 表现层 表现层必须通过Business业务规则层操作数据库,不能直接调用DataAccess数据访问. Sqlmap.config配置: connectionSt ...

  3. Arduino 端口通信实例

    ////////////////////////////////////////////////////////// //Arduino 1.0.x-----Arduino Uno----COM9 / ...

  4. JAVA通过XPath解析XML性能比较(原创)

    (转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...

  5. JQuery文本框水印插件的简单实现

    采用JQuery实现文本框的水印效果非常容易,效果如下: 代码片段,定义要应用水印效果的文本框的样式: .watermark { color: #cccccc; } 将JavaScript代码封装成J ...

  6. VirtualBox安装Ubuntu教程

    1.VirtualBox虚拟机安装,及VirtualBox安装Ubuntu教程VirtualBox版本为VirtualBox-4.3.12-93733-Win.exe,Ubuntu版本为ubuntu- ...

  7. UEditor编辑器上传图片开发流程

    在ueditor目录下找到uedior.config.js,找到如下三行: ,imageUrl: "<%=path %>/controller.json" //图片上传 ...

  8. MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H

    一.查找文件 使用快捷键[ctrl+shift+R]弹出弹出文件查找框,如下图所示: 二.查找包含某个字符串的文件 使用快捷键[ctrl+H]在弹出对话框中选File Search选项,然后在第一个文 ...

  9. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  10. CSS3实践之路(六):CSS3的过渡效果(transition)与动画(animation)

    刚开始W3C CSS Workgroup拒绝将CSS3 transition与animation加入官方标准,一些成员认为过渡效果和动画并非样式属性,而且已经可以用脚本实现.所以请大家明白,特别是We ...