原文链接: 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. SQLSERVER复制的要点

    SQLSERVER复制的要点 在论坛里经常有人问:SQLSERVER复制出问题了!!SQLSERVER复制不运行了!!SQLSERVER复制遇到阻塞了!! 然后最后来一句:“怎麽办?????????? ...

  2. Beetl 1.25 发布,java模板引擎

    Beetl 1.25 发布改进记录包括: Beetl支持同JS一样三元逻辑表达式,如:    var c = a>1?’li’;’miao’;    var d = b>1?:’ok’; ...

  3. [游戏模版14] Win32 键盘控制

    >_<:compared with the previous article,this one only adds key-message listener. >_<:up d ...

  4. .NET 自带的动态代理+Expression 实现AOP

    下面代码(摘抄之别处,原创在哪不知)是采用TransparentProxy和RealProxy实现对象的动态代理.碍于其使用反射掉用方法,所以就小试着将反射改成Expression以提高执行的效率.第 ...

  5. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  6. NodeJS系列~目录

    回到占占推荐博客索引 Node.js官网对它的阐述 Node.js is a platform built on Chrome's JavaScript runtime for easily buil ...

  7. Web调试工具——Fiddler介绍

    Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...

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

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

  9. iOS开发-UITextView根据内容自适应高度

    UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: -(UITextView * ...

  10. 让delphi解析chrome扩展的native应用

    chrome浏览器自从去年以来逐步去掉了对浏览器插件的支持,npapi的方案马上不可用. 当务之急要选择一个替代方案,最常用的就是扩展了.扩展程序提供了一套和本地程序交互的方案——“原生消息通信” 写 ...