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

 

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

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

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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.     
  72.     EVP_PKEY *k;  
  73.     RSA *rsa;  
  74.     unsigned char n[300] ={0x0};  
  75.     unsigned char e[300] ={0x0};  
  76.     unsigned int len;  
  77.     /* www.google.com2为DER编码的数字证书 ,从firefox中导出 
  78.     */  
  79.     fp=fopen("www.google.com2","rb");  
  80.     if(!fp) return ;  
  81.     len=fread(buf,1,5000,fp);  
  82.     fclose(fp);  
  83.     p=buf;  
  84.     x=X509_new();  
  85.     d2i_X509(&x,(const unsigned char **)&p,len);  
  86.     k=X509_get_pubkey(x);  
  87.     rsa=EVP_PKEY_get1_RSA(k);  
  88.     if(rsa->n != NULL)  
  89.     {  
  90.         BN_bn2bin(rsa->n, n);  
  91.         len= BN_num_bytes(rsa->n);  
  92.     printf("N:\n");  
  93.     PrintHex(n,len);  
  94.     }  
  95.     else  
  96.     {  
  97.         printf("DER error \n");  
  98.     }  
  99.     if(rsa->e != NULL)  
  100.     {  
  101.         BN_bn2bin(rsa->e, e);  
  102.         len= BN_num_bytes(rsa->e);  
  103.         printf("E:\n");  
  104.         PrintHex(e,len);  
  105.     }  
  106.     else  
  107.     {  
  108.         printf("DER error \n");  
  109.     }  
  110.       
  111.     X509_free(x);     
  112. }  
  113. int main()  
  114. {  
  115.     GetPukfromPEM();  
  116.     GetPukfromDER();  
  117.     return 0;  
  118. }  

程序执行结果如下:

 

 

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

 

转载于:https://www.cnblogs.com/huhu0013/p/4794613.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web browser的发展演变

我们每天都在使用着浏览器&#xff0c;每个人使用的浏览器各不一样。在这个科技飞速发展的时代&#xff0c;一个游览器能否站住脚跟取决于使用者的数量&#xff0c;看用户是否喜欢这个产品&#xff0c;听取用户们的意见来改善。 我们这个年龄的人最初用到的浏览器肯定是IE浏览器…

matlab 散点图 线性回归图_线性回归思路梳理

作者&#xff1a;夏雨骄阳 封面&#xff1a;自己想吧1简单线性回归1根据研究目的确定因变量和自变量。2判断有无异常值。通过绘制散点图直观观察&#xff1b;亦可通过线性回归的【统计】→【个案诊断】→【所有个案】进行分析&#xff0c;若标准残差超过[-3,3]&#xff0c;则…

物联网云端设计分析

物联网是世界信息产业发展的新浪潮&#xff0c;智能手表、智能手环、智能灯等物联网产品不断的改变着人们的生活方式。那这些产品是怎么设计出来的呢&#xff1f;其实物联网操作系统不光由本地物联网设备上的操作系统组成&#xff0c;还包括提供物联网终端设备支持的云端架构。…

Redis和Memcached的区别

2019独角兽企业重金招聘Python工程师标准>>> Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较&#xff1a; Redis支持服务器端的数据操作&#xff1a;Redis相比Memcached来说&#xff0c;拥有更多的数据结构和并支持更丰富的数据操作…

hbase hmaster一会就没了_浅析HBase

一、HBase简介1、Apache HBase™是Hadoop数据库&#xff0c;是一个分布式&#xff0c;可扩展的大数据存储。2、当您需要对大数据进行随机&#xff0c;实时读/写访问时&#xff0c;请使用Apache HBase™。 该项目的目标是托管非常大的表&#xff08; 数十亿的行*百万的列 &#…

MATLAB 迭代法解方程

MATLAB 迭代法解方程 1、代码如下&#xff1a; %%牛顿迭代法解方程 function xnewton_interation(fun,dfun,x0,EPS) %简单牛顿迭代法%fun即迭代函数&#xff0c;dfun即迭代函数的一阶导数&#xff0c;x0为迭代初值&#xff0c;EPS为精度x1x0-fun(x0)/dfun(x0); %牛顿迭代公…

超微服务器电源短接启动图解_教你一招,让你的电脑启动速度秒杀别人

win10快速启动其实是电脑的一种休眠模式&#xff0c;它将电脑中的一些本该关闭的文件保存到hiberfil.sys的磁盘文件中&#xff0c;这样打开电脑时就达到了快速开机的目的。接下来&#xff0c;我就将win10设置快速启动的方法分享给你们win10系统功能非常强大&#xff0c;最让大家…

MATLAB 求离散信号卷积

MATLAB 求离散信号卷积 代码如下&#xff1a; function [C,Ck] dt_convolution_advance(A,B,Ak,Bk) % dt_convolution_advance 计算离散信号卷积 % A 输入信号 % B 输入信号 % Ak 输入信号A下标 % Bk 输入信号B下标 % C 输出信号 % Ck 输出信号C下标 % 计算输入信号A&…

发布 项目_第十八期科创基金项目发布会圆满结束

第十八期科创基金项目发布会圆满结束贺电&#xff01;贺电!电子信息工程学院发来贺电&#xff1a;第十八届科创基金项目发布会圆满结束啦&#xff01;感谢导师们的支持、现场同学的热情参与和科协朋友后勤服务&#xff01;NUAA即使是寒冷的冬天也无法阻挡同学们对科创的热情,那…

Fisher线性判别算法原理及实现 MATLAB

Fisher线性判别算法原理及实现 MATLAB 一、Fisher判别器原理 二、代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 [0 3]; sigma1 [0.5 0; 0 0.5]; data1 mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵&#xff0c;每一列的数据分别以0&…

大话设计模式之外观模式

年年作品展&#xff0c;岁岁不相同&#xff0c;鹅黄新绿涟漪泛起思想的火花却不尽相同。十期的作品展&#xff0c;从13年3月20号開始到完美落幕&#xff0c;时至今日&#xff0c;她已经在我的记忆中成为过去。这朵小小的浪花激起的涟漪渐渐褪去&#xff0c;或许已没有或许&…

HK算法原理及MATLAB实现

HK算法原理及MATLAB实现 一、编程原理 说明&#xff1a; 1、绿色框图中&#xff0c;当alpha取为最优权向量时&#xff0c;会使 取为最小值。arg的意思是当后面那个函数满足时&#xff0c;取出它的自变量的值。 2、注意后面那个式子是对b求偏导 3、e(t)大于0时&#xff0c;下…

python列反过来_xlwings 教程:使用Python更快速地处理Excel

Excel在当今商业中的使用非常普遍。在Dataquest&#xff0c;出于很多原因&#xff0c;我们通常推荐使用代码处理数据&#xff0c;并且我们的许多数据科学课程的目标是教授数据分析和数据科学的高效编码。但是&#xff0c;无论您多么喜欢使用Python&#xff0c;在一天结束时&…

多类线性分类器算法原理及代码实现 MATLAB

多类线性分类器算法原理及代码实现 MATLAB 一、算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定&#xff1a; 二、代码实现 1、HK函数 function [] HK(w1_data,w2_data) %w1_data为第一类数据集 w2_data为第二类数据集 %此函数的作用为用HK算法对输…

(转) C#如何使用异步编程

怎么使用异步&#xff0c;就是用委托进行处理&#xff0c;如果委托对象在调用列表中只有一个方法&#xff0c;它就可以异步执行这个方法。委托类有两个方法&#xff0c;叫做BeginInvoke和EndInvoke&#xff0c;它们是用来异步执行使用。 异步有三种模式 等待模式&#xff0c;在…

javascript 的 ~ 操作符作用

2019独角兽企业重金招聘Python工程师标准>>> "~" operator in javascript. For anyone else who also didnt know what it does: it converts -1 to 0&#xff0c;可以节省用来比较-1的情况&#xff0c;如 if (~event.origin.indexOf(http://yoursite.com…

驻定相位原理(POSP)以及线性调频信号的频谱

最近看论文遇到了驻定相位原理&#xff0c;问老师直接给了我一本书让我看&#xff0c;看半天只有一段…不是这个方向的&#xff0c;半路出家做毕业设计需要用到这个定理&#xff0c;有错误的话请不吝赐教。 一、驻定相位原理 在数字信号处理中&#xff0c;经常需要将一个时域…

vue怎么合并两个视频_【软件分享】视频分割合并软件哪款好用呢?怎么剪切合并视频?...

现在有很多小伙伴都喜欢喜欢自己拍视频上传到各大视频平台&#xff0c;有时候会遇到关于视频剪辑方面的难题&#xff0c;比如说&#xff0c;视频怎么剪切&#xff1f;怎么将两段小视频合并成一个呢&#xff1f;这些都是一些比较常常遇到的问题&#xff0c;今天小编就给大家介绍…

怎样根据字段域查找到其在数据库中关系与属性

Infor SyteLine ERP中&#xff0c;很多时候需要做维护&#xff0c;我们需要从打开的window窗口的form中某一个输入Textbox域或是DropDownList域&#xff0c;去找到它是绑定了数据库中的哪一张表&#xff0c;哪一个字段的&#xff1f; 其相关的关系或是属性等。比如下面这个form…

【手势交互】9. PS Move

索尼研发体感控制技术已有10年&#xff0c;在过去那么多年里。尝试了3D摄像头、超声波和电磁感应等各种技术。最后还是觉得眼下的MOVE所使用的技术最为合适。PS Move是索尼于2010年9月份推出。用来让PS3主机具备动态感应功能的控制器。他利用动态控制器&#xff08;手柄&#x…