openssl 学习之从证书中提取RSA公钥N 和 E
原文链接: http://blog.csdn.net/kkxgx/article/details/19850509
通常数字证书包含很多信息,其中N和E值即我们称为的公钥。如何从PEM 或者DER格式的证书中提出证书呢?下面给出代码实现从PEM和DER编码的证书中提出N、E。
- #include <openssl/evp.h>
- #include <openssl/x509.h>
- #include <stdio.h>
- #include <stdlib.h>
- void PrintHex(unsigned char *str, unsigned int len)
- {
- int i = 0;
- for(i =0;i< len; i++)
- {
- if(i%4 == 0)
- {
- printf("0x");
- }
- printf("%02x",str[i]);
- if(i%4 == 3)
- {
- printf(" ");
- }
- if(i%16 == 15)
- {
- printf("\n");
- }
- }
- printf("\n");
- }
- void GetPukfromPEM()
- {
- X509 *x;
- BIO *b;
- EVP_PKEY *k;
- RSA *rsa;
- unsigned char n[300] ={0x0};
- unsigned char e[300] ={0x0};
- unsigned int len;
- /*www.google.com1为PEM格式的数字证书,从firefox中导出 */
- b=BIO_new_file("www.google.com1","r");
- x=PEM_read_bio_X509(b,NULL,NULL,NULL);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n != NULL)
- {
- BN_bn2bin(rsa->n, n);
- len= BN_num_bytes(rsa->n);
- printf("N:\n");
- PrintHex(n,len);
- }
- else
- {
- printf("PEM error \n");
- }
- if(rsa->e != NULL)
- {
- BN_bn2bin(rsa->e, e);
- len= BN_num_bytes(rsa->e);
- printf("E:\n");
- PrintHex(e,len);
- }
- else
- {
- printf("PEM error \n");
- }
- BIO_free(b);
- X509_free(x);
- }
- void GetPukfromDER()
- {
- X509 *x;
- FILE *fp;
- unsigned char buf[5000],*p;
- int ret;
- EVP_PKEY *k;
- RSA *rsa;
- unsigned char n[300] ={0x0};
- unsigned char e[300] ={0x0};
- unsigned int len;
- /* www.google.com2为DER编码的数字证书 ,从firefox中导出
- */
- fp=fopen("www.google.com2","rb");
- if(!fp) return ;
- len=fread(buf,1,5000,fp);
- fclose(fp);
- p=buf;
- x=X509_new();
- d2i_X509(&x,(const unsigned char **)&p,len);
- k=X509_get_pubkey(x);
- rsa=EVP_PKEY_get1_RSA(k);
- if(rsa->n != NULL)
- {
- BN_bn2bin(rsa->n, n);
- len= BN_num_bytes(rsa->n);
- printf("N:\n");
- PrintHex(n,len);
- }
- else
- {
- printf("DER error \n");
- }
- if(rsa->e != NULL)
- {
- BN_bn2bin(rsa->e, e);
- len= BN_num_bytes(rsa->e);
- printf("E:\n");
- PrintHex(e,len);
- }
- else
- {
- printf("DER error \n");
- }
- X509_free(x);
- }
- int main()
- {
- GetPukfromPEM();
- GetPukfromDER();
- return 0;
- }
程序执行结果如下:
- N:
- 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023
- 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085
- 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946
- 0xa292258d 0x622ab463 0x301fb985 0xf835e116
- 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec
- 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06
- 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c
- 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2
- 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc
- 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68
- 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db
- 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69
- 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547
- 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989
- 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30
- 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5
- E:
- 0x010001
- N:
- 0xb073f0f2 0x04eec2a2 0x46ca342a 0xaabb6023
- 0xd111761f 0x1f3ad065 0x834e9a45 0xa8437085
- 0x76f01f87 0x00021f6e 0x3b1717c4 0xb5e91946
- 0xa292258d 0x622ab463 0x301fb985 0xf835e116
- 0x5a7649cc 0x50485339 0x5989d684 0x02fb9aec
- 0x1bc751d5 0x769590d4 0x3a2ab8a6 0xde024d06
- 0xfbcdeda5 0x46415f55 0x74e5ec7e 0x40dc509c
- 0xb5e4355d 0x1e6820f8 0xe9dea36a 0x28bf41d2
- 0xa1b3e225 0x8d0c1bca 0x3d930c18 0xaedfc5bc
- 0xfdbc82ba 0x6800d716 0x32719f65 0xb511da68
- 0x59d0a657 0x641bc9fe 0x98e5f5a5 0x65eae1db
- 0xeef4b39d 0xb38eea87 0xae16d21e 0xa07c7c69
- 0x3f291685 0x0153a76c 0xf160abdd 0xa2fc2547
- 0xd432d112 0xddf74812 0xe0fc9ca2 0x7798e989
- 0x99b8f838 0xf18c06c2 0x7a23366d 0x9b9dcd30
- 0xc8c73417 0x1ebb7d42 0xc8abe715 0x16f673b5
- E:
- 0x010001
openssl 学习之从证书中提取RSA公钥N 和 E的更多相关文章
- java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)
import lombok.Cleanup; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; impor ...
- (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
openssl rsa 是RSA对称密钥的处理工具 openssl pkey 是通用非对称密钥处理工具,它们用法基本一致,所以只举例说明openssl rsa. 它们的用法很简单,基 ...
- (11) openssl req(生成请求证书、私钥和自建CA)
伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...
- X509证书中RSA公钥的提取与载入
原文链接: http://blog.chinaunix.net/uid-16515626-id-2741894.html 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等 ...
- [转载]X509证书中RSA公钥的提取与载入 pem key
原地址:https://blog.csdn.net/anddy926/article/details/8940377 由于项目需要,我计划利用openssl开发一个基本的CA,实现证书的发放等功能.在 ...
- java验证openssl生成的ssl证书和私钥是否匹配
最近有一个需求上传ssl证书和私钥,但是上传之前需要验证ssl证书和私钥是否正确,其中的业务逻辑涉及到以下几点: 一.读取ssl证书,读取ssl证书公钥 要实现该功能比较简单,java里面 ...
- OpenSSL学习笔记
SSL缺省只进行server端的认证,客户端的认证是可选的.以下是其流程图(摘自TLS协议). 加密算法介绍: 对称加密: DES:date encrption standard,56bit 3DES ...
- iOS中使用RSA对数据进行加密解密
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...
- OPENSSL 学习整理-介绍
Openssl目录名以及功能描述 目录名 功能描述 Crypto 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL中最重要的目录,包含了OpenSSL 密码算 ...
随机推荐
- ceph placement group状态总结
一.归置组状态 1. Creating 创建存储池时,它会创建指定数量的归置组.ceph 在创建一或多个归置组时会显示 creating;创建完后,在其归置组的 Acting Set 里的 OSD 将 ...
- halcon 常用算子中文解释说明(随时更新)
select_contours_xld (Edges, SelectedContours, 'closed', 0, 0, 0, 0) 筛选闭合边缘曲线 sub_image (ImageConvert ...
- Android 自定义View 三板斧之一——继承现有控件
通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文重点讨论继承现有 ...
- ELMAH入门
简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理程序,是一种应用广泛的错误日志工具是完全可插拔.它可以动态添加到一个正在运行的ASP.NE ...
- 一步一步搭建客服系统 (2) 如何搭建SimpleWebRTC信令服务器
上次介绍了<3分钟实现网页版多人文本.视频聊天室 (含完整源码)>使用的是default 信令服务器,只是为了方便快速开始而已.SimapleWebRTC官方文档里第一条就讲到,不要在生产 ...
- WebApi与手机客户端通信安全机制
最近公司有几个项目需要开发手机客户端,服务器端选用WebApi,那么如何保证手机客户端在请求服务器端时数据不被篡改,如何保证一个http请求的失效机制,下面总结一下我们在项目中针对这两个问题的解决方案 ...
- 某些版本的IIS可能有SessionID混淆的Bug
某公司为我服务的甲方公司开发一个挺重要的应用.已经上线了一年多了,不停的修修改改.也算正常使用.正所谓,秀恩爱,死得快.No 作就No Die.也少知道是那个Smarty Pants闲的蛋疼说新修改的 ...
- atitit js 开发工具 ide的代码结构显示(func list) outline总结
atitit js 开发工具 ide的代码结构显示(func list) outline总结 eclips环境::4.3.1 #-------需要一个js开发工具,可以显示outline或者代码结构显 ...
- Javascript函数的简单学习
第九课函数的定义与调用1:函数的定义 语法格式 function 函数名(数据类型 参数1){//function是定义函数的关键字 方法体;//statements,用于实 ...
- php中的邮件技术
前言:程序员不谈恋爱就是对物质世界太贪恋 一.通过smtp服务来发送邮件 使用php中的mail()实现邮件的发送; bool mail ( string $to , string $subject ...